한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Sách trắng lag game › L7 OS server (kernel)

Quá nhiều thread và context switch Thread oversubscription, context switching

ID nguyên nhân so-context · Phụ trách chính Phát triển server (Đội phát triển game) · Phối hợp Hạ tầng server (Đội hạ tầng)

Mở thẻ gốc có hình minh họa và thí nghiệm →

Chạy số thread nhiều hơn số core rất nhiều thì OS tốn CPU chỉ để cho chúng chạy luân phiên.

Vì sao Có hàng trăm đến hàng nghìn thread, chẳng hạn mỗi kết nối một thread → Dẫn đến Chi phí context switch (đổi thread đang chạy) tăng, cache miss cũng tăng → Trên màn hình CPU bận nhưng thông lượng thấp, tick không đều, gây giật khựng và quay chậm

Triệu chứng
Giật khựng, Quay chậm
Yếu tố
Ngưng trệ, Jitter
Ai gặp phải
Cả server
Khi nào
Khi đông người
Phụ trách
Phụ trách chính Phát triển server (Đội phát triển game) · Phối hợp Hạ tầng server (Đội hạ tầng)
Việc cần làm (Đội phát triển game)
Số thread khớp với số core, dùng I/O bất đồng bộ (epoll, IOCP).
Việc cần làm (Đội hạ tầng)
Giám sát số lần context switch và số thread chờ chạy (cs và r trong vmstat).
Con số tham khảo
Mỗi lần context switch mất vài µs, cộng thêm chi phí cache miss sau đó thì còn lớn hơn.
Trên đồ thị
Tăng theo số người và tải · Số context switch mỗi giây, số thread chờ chạy
Chỗ cần xem
cs (số context switch mỗi giây) và r (số tác vụ đang chạy hoặc đang chờ CPU) trong vmstat 1, so với số core; context switch tự nguyện (cswch/s) và không tự nguyện (nvcswch/s) theo từng thread của server game qua pidstat -w -t
Đúng nếu
khi số người chơi đồng thời tăng, r vượt xa số core, cs cũng vọt lên theo, và có hàng trăm thread với nhiều context switch không tự nguyện
Loại trừ nếu
r vẫn bằng hoặc thấp hơn số core. Chỉ nhiều context switch tự nguyện → thread đang chờ lock hoặc I/O (“Tranh chấp lock”, “Kiến trúc I/O blocking”)
Cách kiểm tra
Kiểm tra bằng công cụ hạ tầng (không cần code game)

Nguồn

  1. Quantifying The Cost of Context Switch (ExpCS 2007) ACM
    Chi phí trực tiếp của một lần context switch khoảng 3,8 µs; chi phí gián tiếp tính cả ảnh hưởng tới cache từ vài µs đến hơn 1.000 µs (theo môi trường đo)
  2. vmstat(8) — Linux manual page procps-ng
    Các trường cs (số context switch mỗi giây) và r (số tiến trình đang chạy hoặc đang chờ chạy)
  3. I/O Completion Ports Microsoft
    Xử lý nhiều I/O bất đồng bộ bằng thread pool tạo sẵn và IOCP, giữ số thread chạy đồng thời khớp với khả năng chạy song song của CPU
  4. pidstat(1) — Linux manual page sysstat
    Trong -w, cswch/s là context switch tự nguyện (tác vụ tự dừng để chờ tài nguyên), nvcswch/s là context switch không tự nguyện (bị buộc đổi vì đã dùng hết time slice); -t hiển thị theo từng thread

Nguyên nhân nên xem cùng

Cùng tầng: L7 OS server (kernel)

Nguyên nhân ở tầng khác gây cùng triệu chứng (Giật khựng)

Xem thẻ gốc có hình minh họa và thí nghiệm