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

Sách trắng lag game › L9 Tiến trình game phía server

Gọi đồng bộ (blocking) trên game thread Synchronous DB / file I/O on the game loop

ID nguyên nhân sp-sync-call · Phụ trách chính Phát triển server (Đội phát triển game)

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

Nếu giữa tick mà phải chờ phản hồi DB hoặc ghi file, mọi diễn biến game trên server dừng lại đúng khoảng thời gian đó.

Vì sao Trong tick phải chờ truy vấn và lưu DB, ghi log, gọi API bên ngoài → Dẫn đến DB mất 100 ms thì tick cũng dừng 100 ms → Trên màn hình Mỗi lần DB hoặc ổ đĩa chậm đi, cả bản đồ lại khựng

Triệu chứng
Đứng hình, Giật khựng
Yếu tố
Ngưng trệ
Ai gặp phải
Một địa điểm hoặc kênh, Cả server
Khi nào
Khi làm một thao tác nhất định, Thỉnh thoảng bất chợt
Phụ trách
Phụ trách chính Phát triển server (Đội phát triển game)
Việc cần làm (Đội phát triển game)
Chuyển mọi việc chậm (truy vấn và lưu DB, ghi log, gọi API bên ngoài) sang chạy bất đồng bộ và áp kết quả ở tick sau (chỉ đặt timeout thì trong lúc chờ, tick vẫn dừng).
Con số tham khảo
Dù một lượt khứ hồi tới DB trong cùng trung tâm dữ liệu chỉ 0,5 ms, gọi 100 lần trong một tick là 50 ms. Một mình nó dùng hết budget của 20 tick.
Trên đồ thị
Thỉnh thoảng vọt lên bất chợt · Thời gian tick của server, độ trễ query DB
Chỗ cần xem
Đồ thị thời gian tick trên cùng trục thời gian với độ trễ query DB (slow query log, v.v.) và độ trễ ổ đĩa. Nếu không có chỉ số tick, dùng bcc offcputime -p xem game thread đang chờ ở đâu
Đúng nếu
thời điểm tick vọt lên trùng với lúc độ trễ DB hoặc file vọt lên, và thời gian chờ của game thread dồn vào các call stack nhận phản hồi DB hoặc ghi file
Loại trừ nếu
độ trễ DB và ổ đĩa vẫn bình thường mà tick vọt lên → GC pause hoặc tranh chấp lock
Cách kiểm tra
Cần log và chỉ số của server, client game

Nguồn

  1. Designs, Lessons and Advice from Building Large Distributed Systems Google
    Bài phát biểu chính tại LADIS 2009 (Jeff Dean). Khứ hồi trong cùng trung tâm dữ liệu khoảng 0,5 ms (500.000 ns)
  2. ASP.NET Core Best Practices Microsoft
    Gọi bất đồng bộ cho truy cập dữ liệu, I/O và tác vụ chạy lâu; lời gọi blocking đồng bộ dẫn đến cạn thread pool và phản hồi chậm
  3. Demonstrations of offcputime, the Linux eBPF/bcc version IO Visor
    Cộng dồn thời gian thread bị dừng và rời CPU (off-CPU) theo từng call stack, -p để chỉ định tiến trình

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

Cùng tầng: L9 Tiến trình game phía server

Nguyên nhân ở tầng khác gây cùng triệu chứng (Đứng hình)

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