Sách trắng lag game › Tra theo triệu chứng
Nuốt thao tác·rollback: 36 nguyên nhân và đội phụ trách
Tên gọi khác: nuốt skill, vật phẩm bị trả lại, giao dịch thất bại
Mở từ điển triệu chứng gốc có hình minh họa →
Hành động rõ ràng đã làm lại bị coi như chưa từng xảy ra, hoặc kết quả bị đảo ngược một lúc lâu sau.
Bấm skill nhưng không ra chiêu. Vật phẩm vừa mua biến mất, hoặc vào lại game thì thấy trạng thái của vài phút trước.
Yêu cầu bị mất (mất gói, tràn hàng đợi), server phán định khác với màn hình của bạn (lệch thời điểm phán định, bị từ chối sau khi đã hiển thị trước), hoặc lưu dữ liệu thất bại giữa chừng (khóa hoặc sự cố DB, server crash).
Nguyên nhân gây ra triệu chứng này
L1 Tiến trình game phía client
- Sai lệch đồng bộ đồng hồ: Nếu giờ server mà client ước tính bị sai, thời điểm nội suy và việc phán định hồi chiêu sẽ lệch. (Phát triển client (Đội phát triển game))
L5 Thiết bị mạng trung tâm dữ liệu
- Giới hạn kết nối và cổng của NAT gateway trên cloud: Các kết nối từ server trong subnet riêng đi ra ngoài (xác thực nền tảng, thanh toán, API bên ngoài) được NAT gateway đổi địa chỉ và cổng rồi gửi đi. Nếu số kết nối đồng thời tới cùng một đích vượt giới hạn cổng của gateway, kết nối mới sẽ thất bại. (Hạ tầng mạng (Đội hạ tầng))
- Microburst ở switch: Khi nhiều server cùng lúc gửi dồn gói tin tới hàng nghìn người, bộ đệm nhỏ của cổng switch nơi lưu lượng đó hội tụ sẽ tràn trong chưa tới 1 ms. (Phát triển server (Đội phát triển game))
L6 Card mạng server
- Ring buffer không đủ: Nếu ring buffer, nơi NIC tạm giữ gói tin, quá nhỏ thì khi gói dồn đến trong tích tắc, bộ đệm sẽ tràn và gói bị bỏ. (Hạ tầng server (Đội hạ tầng))
- Vượt giới hạn PPS trên cloud: Server cloud có giới hạn số gói mỗi giây và băng thông theo từng loại instance, vượt quá thì gói bị bỏ âm thầm. (Hạ tầng server (Đội hạ tầng))
L7 OS server (kernel)
- OOM killer: Khi bộ nhớ cạn, Linux chọn tiến trình dùng nhiều bộ nhớ nhất và buộc kết thúc (kill) nó. Thường đó là server game. (Phát triển server (Đội phát triển game))
- Đồng hồ hệ thống nhảy (NTP step): Khi đồng hồ server bị chỉnh tới hoặc lùi vài giây trong một lần, các timer dựa vào đồng hồ hệ thống sẽ kích hoạt dồn một lượt hoặc dừng hẳn. (Phát triển server (Đội phát triển game))
- Cạn cổng tạm (ephemeral port) ở kết nối giữa các server: Khi server game mở rồi đóng kết nối ngắn tới DB hoặc server khác quá thường xuyên, các kết nối đã đóng vẫn chiếm giữ cổng một thời gian, nên không mở được kết nối mới. (Phát triển server (Đội phát triển game))
L8 Socket và giao thức
- Cấu hình truyền lại của UDP tin cậy: Quy tắc truyền lại tự xây trên UDP mà quá thận trọng thì khôi phục chậm, còn quá mạnh tay thì càng làm nghẽn đường truyền. (Phát triển server (Đội phát triển game))
L9 Tiến trình game phía server
- Hàng đợi message bị dồn ứ: Khi yêu cầu đến nhanh hơn tốc độ xử lý và dồn vào hàng đợi, các yêu cầu phía sau vài giây sau mới được xử lý hoặc bị bỏ. (Phát triển server (Đội phát triển game))
- Server crash: Khi tiến trình server chết vì một lỗi không được xử lý, mọi người trên server đó mất kết nối cùng lúc. (Phát triển server (Đội phát triển game))
- Bản cập nhật làm thay đổi mô hình lưu lượng: Khi nội dung, hiệu ứng hoặc trường đồng bộ mới làm tăng kích thước và tần suất gói tin, server đang chạy tốt bắt đầu chạm giới hạn MTU, băng thông và số gói kể từ sau bản cập nhật. (Phát triển server (Đội phát triển game))
L11 Ổ đĩa
- Ổ đĩa đầy: Khi log và dump tích tụ làm ổ đĩa đầy, thao tác ghi thất bại, và nếu không có phương án dự phòng thì server sập. (Hạ tầng server (Đội hạ tầng))
L12 Cơ sở dữ liệu
- Tranh chấp khóa trên hot row: Khi ai cũng muốn sửa cùng một dòng (kho bang hội, vật phẩm hot ở nhà đấu giá, bộ đếm toàn server), mỗi lúc chỉ một người lấy được khóa. (Phát triển server (Đội phát triển game))
- Deadlock trong DB: Khi hai transaction (nhóm thao tác DB được xử lý như một khối) chờ dòng mà bên kia đã khóa, DB buộc phải hủy một bên. (Phát triển server (Đội phát triển game))
- Replication lag: Khi ghi vào DB chính và đọc từ bản sao, nếu bản sao bị tụt lại phía sau thì nội dung vừa ghi sẽ chưa hiện ra. (Hạ tầng DB (Đội hạ tầng))
- Tác vụ batch khối lượng lớn: Nếu chạy tổng hợp bảng xếp hạng, gửi thư hàng loạt hay dọn dữ liệu cũ trong lúc đang vận hành, các tác vụ này sẽ chiếm khóa và ổ đĩa. (Phát triển server (Đội phát triển game))
- Failover DB: Trong lúc DB chính chết và chuyển sang DB dự phòng, không ghi được dữ liệu, và phần dữ liệu cuối cùng chưa kịp replicate có thể bị mất. (Hạ tầng DB (Đội hạ tầng))
- Mất tiến độ do chu kỳ lưu dài: Nếu để giảm tải mà vài phút mới lưu một lần, thì khi server sập giữa hai lần lưu, tiến độ chơi sẽ mất. (Phát triển server (Đội phát triển game))
- Transaction mở quá lâu: Nếu một transaction mở quá lâu, nó giữ khóa mãi, và DB không dọn (purge) được dữ liệu phiên bản cũ nên toàn bộ hệ thống chậm dần. (Phát triển server (Đội phát triển game))
- Khóa do thay đổi schema (DDL) khi đang vận hành: Nếu thêm cột hay index vào bảng trong lúc đang phục vụ, chỉ vì một khóa cần trong chốc lát mà mọi yêu cầu dùng bảng đó có thể phải chờ. (Hạ tầng DB (Đội hạ tầng))
L13 Kiến trúc và vận hành server
- Sự cố server phụ trợ: Khi một server chạy tách riêng khỏi server game như chat, tổ đội, nhà đấu giá gặp sự cố, chỉ riêng tính năng đó ngừng hoạt động. (Phát triển server (Đội phát triển game))
- Lệch đồng hồ giữa các server: Nếu đồng hồ của các server lệch nhau một chút, việc phán định hồi chiêu, buff, thời điểm bắt đầu sự kiện sẽ không khớp giữa các server. (Hạ tầng server (Đội hạ tầng))
- Phụ thuộc service bên ngoài: Khi service bên ngoài như đăng nhập qua nền tảng, thanh toán, xác thực danh tính chậm hoặc ngừng, người chơi bị kẹt ở đúng bước đó. (Bên ngoài (Bên ngoài))
- Lỗi matchmaking hoặc phân bổ region: Nếu bị xếp vào server ở region xa thay vì region gần, dù đường truyền vẫn ổn, riêng người chơi đó luôn có ping cao. (Phát triển server (Đội phát triển game))
- Chứng chỉ TLS hết hạn hoặc cấu hình sai: Khi chứng chỉ của server đăng nhập, API hoặc server patch hết hạn hoặc thiếu chứng chỉ trung gian, kết nối TLS của các client kết nối mới sẽ thất bại kể từ thời điểm đó. (Hạ tầng mạng (Đội hạ tầng))
Thiết kế đồng bộ
- Không có buffer input cho skill: Nếu phải nhận xác nhận từ server rằng skill trước đã xong mới bấm được skill tiếp theo, mỗi nhịp combo sẽ bị chen thêm một khoảng thời gian khứ hồi. (Phát triển client (Đội phát triển game))
- Khung phán định ngắn bị ping ăn mất: Nếu thời gian phải phản ứng ngắn như né tránh, parry, đỡ đòn, ping sẽ ăn mất khoảng thời gian đó và tạo ra những đòn không thể né. (Phát triển server (Đội phát triển game))
- Phán định không có bù trễ: Nếu server chỉ phán định trúng đích bằng “vị trí hiện tại trên server”, phán định sẽ lệch với những gì bạn thấy trên màn hình. (Phát triển server (Đội phát triển game))
- Bù trễ quá mức: Nếu quay ngược quá xa theo góc nhìn của người tấn công, người bị bắn dù đã nấp vẫn bị trúng. (Phát triển server (Đội phát triển game))
- Client có thẩm quyền: Nếu mỗi client tự quyết định kết quả của mình, màn hình của bạn mượt mà nhưng kết quả lệch với màn hình người khác và dễ bị hack. (Phát triển server (Đội phát triển game))
- Server kiểm tra quá chặt: Nếu server kiểm tra tốc độ di chuyển, hồi chiêu, tầm đánh quá chặt, cả những input hợp lệ bị dồn lại do jitter cũng bị từ chối. (Phát triển server (Đội phát triển game))
- Server từ chối sau khi đã hiển thị trước: Nếu server không công nhận đòn đánh hay skill đã được hiển thị trước trên màn hình của bạn, kết quả bạn thấy rõ ràng lại bị coi như chưa từng xảy ra. (Phát triển client (Đội phát triển game))
- Tần suất gửi snapshot thấp: Nếu server chỉ gửi bản cập nhật vị trí (snapshot) vài lần trong 1 giây, bộ đệm nội suy phải đặt dài tương ứng, nên bạn thấy các nhân vật khác ở quá khứ xa hơn. (Phát triển server (Đội phát triển game))
Sự cố chỉ một số người gặp
Xem từ điển triệu chứng gốc có hình minh họa