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

Sách trắng lag game › L10 Bộ nhớ

GC pause của script engine Scripting VM GC (Lua, etc.)

ID nguyên nhân mem-script-gc · 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 →

Ngay cả server viết bằng C++, nếu nhiệm vụ, AI và skill chạy bằng script như Lua thì trong lúc GC của script engine chạy, zone đó sẽ bị dừng.

Vì sao Ở mỗi zone, script engine chạy nhiệm vụ, AI và sự kiện, tạo ra một lượng lớn đối tượng tạm → Dẫn đến GC của script engine thu gom dồn một lượng lớn trong một lần, tick của zone đó bị dừng → Trên màn hình Chỉ khựng theo chu kỳ ở một zone nhất định hoặc trong một sự kiện nhất định

Triệu chứng
Giật khựng, Đứng hình
Yếu tố
Ngưng trệ
Ai gặp phải
Một địa điểm hoặc kênh
Khi nào
Khi đông người, Theo chu kỳ đều
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)
Cấu hình GC tăng dần hoặc phân thế hệ, cho GC chạy từng chút một ở mỗi tick, giảm đối tượng tạm trong script.
Con số tham khảo
Khi heap của script phình lên vài trăm MB, một lần thu gom dồn có thể mất vài chục đến vài trăm ms. Đó là khi tắt thu gom tăng dần (incremental), hoặc khi chạy thu gom toàn phần ở chế độ phân thế hệ (generational).
Trên đồ thị
Vọt lên theo chu kỳ · Thời gian xử lý tick theo zone, bộ nhớ của script engine
Chỗ cần xem
Mỗi tick ghi lại thời gian xử lý tick của từng zone và lượng bộ nhớ mà script engine của zone đó đang dùng (Lua: collectgarbage("count")), rồi đặt chồng lên cùng một đồ thị
Đúng nếu
thời điểm bộ nhớ script tụt mạnh (thu gom dồn một lần) trùng với lúc tick của zone đó vọt lên, các zone khác vẫn bình thường
Loại trừ nếu
tick vọt lên mà bộ nhớ script không đổi → tải hoặc lock của zone đó. Mọi zone trên server cùng lúc vọt lên → GC của server (mem-gc) hoặc swap (mem-swap)
Cách kiểm tra
Cần log và chỉ số của server, client game

Nguồn

  1. Lua 5.4 Reference Manual Lua.org
    Chế độ tăng dần chia việc thu gom thành các bước nhỏ xen giữa lúc chương trình chạy (đặt bước quá lớn thì thành dừng toàn bộ); lần thu gom major ở chế độ phân thế hệ là dừng toàn bộ để duyệt mọi đối tượng; collectgarbage("count") trả về tổng bộ nhớ Lua đang dùng (KB)

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

Cùng tầng: L10 Bộ nhớ

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