Sách trắng lag game › Tra theo triệu chứng
Quay chậm: 24 nguyên nhân và đội phụ trách
Tên gọi khác: slow motion, cả thế giới chậm lại, mọi thứ ì ạch
Mở từ điển triệu chứng gốc có hình minh họa →
Mọi thứ chuyển động chậm. Việc tung skill và quái di chuyển trông như bị kéo dài ra. Tùy thiết kế server, tốc độ có thể vẫn giữ nguyên nhưng hiện ra thành giật khựng hoặc dịch chuyển tức thời.
Mọi người trong cùng khu vực cùng chậm lại. Thường xảy ra ở nơi tập trung đông người.
Server không kịp xử lý xong mỗi tick đúng hạn. Đường truyền vẫn ổn nên ping đo bên ngoài game không đổi; ping trong game có thể tăng nhẹ nếu có lẫn thời gian chờ xử lý của server. Hãy xem số người tăng đột biến, tính toán tầm nhìn, broadcast, thiếu bộ nhớ.
Nguyên nhân gây ra triệu chứng này
L1 Tiến trình game phía client
- Fixed timestep chạy bù mất kiểm soát: Sau một lần dừng, game dồn phần tính toán bị tồn lại để chạy bù, và chính phần tính toán đó lại làm game chậm tiếp. (Phát triển client (Đội phát triển game))
L5 Thiết bị mạng trung tâm dữ liệu
L7 OS server (kernel)
- Quá nhiều thread và context switch: 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. (Phát triển server (Đội phát triển game))
- CPU throttling trong container (CFS quota): Khi container bị đặt giới hạn CPU, ngay lúc dùng hết quota trong một chu kỳ cố định (thường là 100 ms), container bị buộc dừng trong phần thời gian còn lại của chu kỳ đó (throttling). (Hạ tầng server (Đội hạ tầng))
- Độ trễ vọt lên do quản lý nguồn điện của server (C-state, điều chỉnh xung nhịp): Core CPU đang rảnh sẽ vào trạng thái tiết kiệm điện sâu (C-state) và hạ xung nhịp để tiết kiệm điện. Khi có gói tin hoặc timer đến, core cần thời gian để thức dậy và nâng xung nhịp, nên việc xử lý gói nhỏ bị cộng thêm độ trễ. (Hạ tầng server (Đội hạ tầng))
- Tác vụ theo lịch: Các tác vụ nén log, sao lưu và quét bảo mật chạy vào cùng một giờ mỗi ngày chiếm CPU và ổ đĩa. (Hạ tầng server (Đội hạ tầng))
- Hiệu năng thay đổi sau khi cập nhật OS, kernel, driver hoặc firmware: Code game không đổi, nhưng server chậm đi kể từ khi cập nhật OS, kernel, driver hoặc firmware. Bản cập nhật có thể làm thay đổi giá trị mặc định, bộ lập lịch, các biện pháp giảm thiểu lỗ hổng CPU (mitigations) và cách driver hoạt động. (Hạ tầng server (Đội hạ tầng))
L8 Socket và giao thức
- Gửi bị chặn (blocking send) do client chậm: Khi bộ đệm gửi của một người chơi có đường truyền chậm đã đầy mà server gửi theo kiểu blocking (lời gọi gửi không trả về cho tới khi bộ đệm có chỗ trống), thread của server phải chờ đúng một người đó. (Phát triển server (Đội phát triển game))
- Kiến trúc I/O blocking: Với kiến trúc mà thread không làm được việc gì khác trong lúc chờ một socket, người chơi càng đông thì cả hệ thống càng chậm. (Phát triển server (Đội phát triển game))
L9 Tiến trình game phía server
- Vượt tick budget: Khi khối lượng việc trong một tick vượt budget, chu kỳ tick của server bị kéo dài, và cả khu vực đó chạy chậm lại hoặc giật khựng. (Phát triển server (Đội phát triển game))
- Tính toán tầm nhìn (AOI) bùng nổ (N²): Nếu so sánh mọi người với nhau để xem ai thấy được ai, số người tăng 10 lần thì khối lượng tính toán tăng 100 lần. (Phát triển server (Đội phát triển game))
- Quá tải khu vực chạy trên một thread (hotspot): Với kiến trúc mỗi khu vực do một thread phụ trách, khi người chơi dồn vào một chỗ, chỉ một core đó lên 100%. (Phát triển server (Đội phát triển game))
- Tìm đường (pathfinding) dồn dập: Hàng trăm con quái cùng lúc đuổi theo người chơi và tính đường đi thì tốn rất nhiều CPU. (Phát triển server (Đội phát triển game))
- Giao tranh dồn vào một mục tiêu (world boss): Khi hàng trăm người cùng đánh một boss, phần tính toán cho một con boss dồn vào một chỗ, và thông tin đòn đánh được gửi cho mọi người đang nhìn thấy. (Phát triển server (Đội phát triển game))
- Đối tượng tích tụ (vật phẩm và vật triệu hồi không được dọn): Vật phẩm rơi trên đất, vật triệu hồi, timer đã xong lẽ ra phải biến mất. Nếu chúng không được dọn mà cứ tích tụ, server chạy càng lâu thì mỗi tick càng nhiều việc. (Phát triển server (Đội phát triển game))
L10 Bộ nhớ
- Rò rỉ bộ nhớ: Bộ nhớ không được giải phóng tích tụ dần, vài ngày sau dẫn tới GC chạy dồn dập, swap hoặc tiến trình bị buộc kết thúc. (Phát triển server (Đội phát triển game))
- GC thrashing (heap còn ít chỗ trống): Khi dữ liệu còn sống gần chạm giới hạn heap, GC chạy xong cũng gần như không thu hồi được gì, nên GC cứ lặp lại không ngừng. (Phát triển server (Đội phát triển game))
- Swap: Khi thiếu bộ nhớ, OS đẩy một phần xuống ổ đĩa. Sau đó, mỗi lần cần dùng phần bộ nhớ ấy, server phải chờ ổ đĩa chậm hơn RAM trên 1.000 lần. (Hạ tầng server (Đội hạ tầng))
- Cache miss: Khi dữ liệu nằm rải rác khắp bộ nhớ, lần nào CPU cũng phải đi tới tận RAM vốn chậm hơn và chờ. (Phát triển server (Đội phát triển game))
- Phân mảnh bộ nhớ: Cấp phát và giải phóng lặp đi lặp lại làm vùng trống bị chia vụn, khiến tiến trình chiếm nhiều bộ nhớ hơn hẳn lượng thực sự dùng. (Phát triển server (Đội phát triển game))
- Truy cập bộ nhớ NUMA từ xa: Trên server có hai CPU, nếu tiến trình dùng bộ nhớ gắn với CPU bên kia thì truy cập bộ nhớ chậm đi. (Hạ tầng server (Đội hạ tầng))
L11 Ổ đĩa
- Cạn burst credit của ổ đĩa cloud: Một số ổ đĩa cloud và cấu hình server nhỏ có burst credit cho phép tạm chạy nhanh hơn mức cơ bản. Khi giờ bận kéo dài làm credit cạn, tốc độ đột ngột tụt xuống. (Hạ tầng server (Đội hạ tầng))
L13 Kiến trúc và vận hành server
- Autoscaling chậm: Khi đông người, số server được tự động tăng lên nhưng phải mất vài phút mới sẵn sàng, và trong thời gian đó các server hiện có bị quá tải. (Hạ tầng server (Đội hạ tầng))
- Quá nhiều macro và bot: Bot gửi yêu cầu thường xuyên hơn người thật rất nhiều, dần chiếm mất năng lực xử lý của server. (Phát triển server (Đội phát triển game))
Xem từ điển triệu chứng gốc có hình minh họa