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
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
Lua 5.4 Reference ManualLua.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)