Sách trắng lag game › Tra theo triệu chứng
Tua nhanh: 36 nguyên nhân và đội phụ trách
Tên gọi khác: dồn cục, như tua video, xử lý dồn một lúc
Mở từ điển triệu chứng gốc có hình minh họa →
Màn hình đang đứng bỗng chạy lại, và mọi chuyển động, đòn đánh, sát thương bị dồn lại trôi qua thật nhanh cùng một lúc.
Quái và người chơi di chuyển như video tua nhanh, số sát thương và hiệu ứng đổ ra một lượt.
Gói tin bị dồn ứ ở đâu đó rồi được giải phóng cùng lúc. Điển hình là chờ truyền lại TCP, server tính dồn để đuổi kịp, hoặc client xử lý không kịp.
Nguyên nhân gây ra triệu chứng này
L1 Tiến trình game phía client
- Nghẽn xử lý gói tin trên main thread: Nếu mỗi khung hình chỉ xử lý một lượng gói tin cố định, số gói dồn tới sẽ liên tục bị đẩy sang khung hình sau. (Phát triển client (Đội phát triển game))
- 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))
L2 OS và thiết bị phía client
- Tiến trình chạy nền chiếm giữ CPU: Khi việc quét virus, Windows Update, phần mềm livestream hay video trên trình duyệt chiếm các core, game thread không được cấp CPU và phải chờ. (Bên ngoài (Bên ngoài))
- Tràn bộ đệm nhận: Khi game bận và lấy gói tin ra khỏi socket (giao diện gửi nhận qua mạng do OS cung cấp) chậm, bộ đệm của OS bị tràn. (Phát triển client (Đội phát triển game))
- Ứng dụng khác trên cùng thiết bị chiếm giữ băng thông: Khi đồng bộ cloud, tải file dung lượng lớn hay tải bản cập nhật game chạy trên cùng PC, gói tin của game phải chờ trong hàng đợi. (Bên ngoài (Bên ngoài))
- Giới hạn xử lý khi cửa sổ bị thu nhỏ hoặc mất focus: Khi bạn chuyển sang cửa sổ khác hoặc thu nhỏ game, cả game lẫn Windows đều cho game chạy chậm lại để tiết kiệm điện. Lúc quay lại, gói tin tồn đọng dồn tới một lượt, hoặc kết nối đã bị ngắt. (Phát triển client (Đội phát triển game))
L3 Mạng gia đình
- Bufferbloat (hàng đợi của router): Khi ai đó trong nhà tải video lên hoặc tải file lớn xuống, hàng đợi của router dồn lượng gói tin tương đương hàng trăm ms, và gói tin game cũng phải chờ phía sau. (Bên ngoài (Bên ngoài))
L6 Card mạng server
- Bảo trì host cloud và live migration: Khi nhà cung cấp cloud bảo trì server vật lý (host), họ chuyển máy ảo sang host khác (live migration) hoặc tạm dừng máy ảo một lúc. Trong lúc đó cả server bị đứng, nếu thời gian dừng dài thì kết nối bị ngắt. (Hạ tầng server (Đội hạ tầng))
L7 OS server (kernel)
- Bộ đệm socket của kernel quá nhỏ: Khi bộ đệm gửi và nhận nhỏ, lúc lưu lượng dồn thành burst, gói UDP nhận về sẽ bị bỏ, còn việc gửi qua TCP bị chặn vì bộ đệm hết chỗ. (Hạ tầng server (Đội hạ tầng))
- Đồ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))
L8 Socket và giao thức
- TCP HOL blocking: Để giữ đúng thứ tự, TCP không giao cho game các gói đến sau cho tới khi nhận lại được gói bị mất đó. (Phát triển server (Đội phát triển game))
- 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))
- Lượng gửi giảm mạnh do kiểm soát tắc nghẽn: TCP coi mất gói là tín hiệu tắc nghẽn và giảm tốc độ gửi 30–50%. Mất gói do Wi-Fi cũng bị xử lý y như vậy. (Hạ tầng server (Đội hạ tầng))
L9 Tiến trình game phía server
- Broadcast bùng nổ: Gửi chuyển động của một người cho tất cả những ai nhìn thấy người đó thì số bản cập nhật phải gửi tăng theo bình phương số người tụ tập. (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))
- Spawn dồn dập khi vào khu vực đông người: Khi bạn teleport vào một thị trấn chật kín người, server phải gửi cùng lúc ngoại hình, trang bị và trạng thái của hàng trăm người vừa lọt vào tầm nhìn. (Phát triển server (Đội phát triển game))
L10 Bộ nhớ
- GC dừng toàn bộ server: Trong lúc server Java hoặc C# dừng mọi thread để thu gom rác (stop-the-world), toàn bộ server đứng lại. (Phát triển server (Đội phát triển game))
Thiết kế đồng bộ
- Phát ngay khi nhận, không có timestamp: Nếu sự kiện từ server không kèm thời điểm xảy ra mà được phát ngay khi nhận, thời điểm hiển thị sẽ lệch lung tung đúng theo jitter của mạng. (Phát triển client (Đội phát triển game))
Sự cố chỉ một số người gặp
- Người chơi chậm di chuyển dồn cục trên màn hình người khác: Input của người có đường truyền kém tới server lúc thưa lúc dồn. Nếu server áp dụng đúng số lượng nhận được ở mỗi tick, trong mắt người khác nhân vật đó sẽ khựng lại rồi đi một lúc nhiều bước. (Phát triển server (Đội phát triển game))
- Tua nhanh do server xử lý ngay khi gói tới: Ở server xử lý và thông báo ngay khi gói tin tới, các hành động dồn lại của người chơi chậm sẽ được thực thi liên tiếp ngay lập tức. (Phát triển server (Đội phát triển game))
- Quyền điều khiển quái nằm ở client chậm: Có những game giao việc tính di chuyển của quái cho client của một người chơi ở gần để giảm tải server. Nếu đường truyền của người đó kém, con quái đó di chuyển kỳ lạ trên màn hình của mọi người. (Phát triển server (Đội phát triển game))
- Giới hạn xử lý ở cửa sổ chạy nền: Với client ở cửa sổ chạy nền, game, engine và OS đều giảm khung hình và việc xử lý. Gói tin nhận được không được xử lý kịp nên bị dồn lại hoặc tràn. (Phát triển client (Đội phát triển game))
Nguyên nhân gốc của truyền lại TCP
- Mất gói ở chặng không dây: Wi-Fi và mạng di động tự truyền lại vài lần trên chặng không dây, nếu vẫn không được thì bỏ gói tin. Gói đã bị bỏ phải đợi khá lâu sau đó TCP mới gửi lại. (Bên ngoài (Bên ngoài))
- Tràn hàng đợi ở điểm nghẽn (mất gói do tắc nghẽn): Khi hàng đợi ở chỗ hẹp nhất trên đường đi (router, chặng kết nối giữa các nhà mạng, đường truyền của trung tâm dữ liệu) đầy, gói tin mới đến sẽ bị bỏ. (Hạ tầng mạng (Đội hạ tầng))
- Burst gửi làm tràn bộ đệm nhỏ: Mỗi tick, nếu server dồn bản cập nhật cho hàng nghìn người rồi gửi đi trong một khoảnh khắc, bộ đệm nhỏ của switch hoặc giới hạn tức thời của cloud sẽ tràn trong chưa đầy 1 ms và một phần gói tin bị bỏ. (Phát triển server (Đội phát triển game))
- Policer bỏ phần vượt mức: Gói cước của nhà mạng, giới hạn của instance cloud và thiết bị chống DDoS đôi khi bỏ ngay các gói vượt tốc độ quy định mà không đưa vào hàng đợi. (Hạ tầng mạng (Đội hạ tầng))
- Lỗi vật lý (cáp, module quang, đầu nối hỏng): Cáp bị hỏng, đầu nối quang bám bụi, module quang hết tuổi thọ sẽ gây lỗi bit, và thiết bị âm thầm bỏ các gói bị hỏng. (Hạ tầng mạng (Đội hạ tầng))
- Không khớp chế độ duplex: Nếu một đầu để tự động đàm phán (auto-negotiation) còn đầu kia cố định tốc độ và duplex, một bên sẽ chạy half-duplex và mỗi lần có tải lại mất gói do va chạm (collision). (Hạ tầng mạng (Đội hạ tầng))
- Host server nhận bỏ gói tin: Gói tin đã đến được server nhưng bị bỏ vì ring buffer của NIC (bộ đệm tạm giữ gói tin vừa đến) bị tràn, hoặc core xử lý nhận gói của kernel bị bão hòa. (Hạ tầng server (Đội hạ tầng))
- Thiết bị trung gian vượt giới hạn xử lý (tường lửa, IPS, chống DDoS): Tường lửa, thiết bị chống xâm nhập (IPS) và thiết bị chống DDoS kiểm tra từng gói tin đi qua. Từ lúc vượt năng lực kiểm tra, thiết bị bỏ những gói không xử lý kịp. (Hạ tầng mạng (Đội hạ tầng))
- Đổi tuyến đường hoặc tuyến ECMP lỗi: Gói tin biến mất trong vài giây lúc tuyến đường Internet thay đổi, hoặc trên kết nối được gán vào tuyến lỗi trong số nhiều tuyến ECMP. (Hạ tầng mạng (Đội hạ tầng))
- Truyền lại không cần thiết do độ trễ tăng vọt: Gói tin vẫn đến nơi, chỉ là đến rất muộn trong chốc lát; nếu độ trễ đó dài hơn RTO thì bên gửi xác định là mất rồi truyền lại. (Bên ngoài (Bên ngoài))
- Cấu hình RTO không hợp với môi trường: Hạ RTO tối thiểu quá thấp thì chỉ trễ một chút cũng sinh ra truyền lại không cần thiết, còn giá trị mặc định (200 ms) lại quá dài với game nên mỗi lần mất gói là đứng lâu. (Hạ tầng server (Đội hạ tầng))
- Thin stream phục hồi chậm: Khi gửi gói nhỏ thưa thớt như game, RTO đến trước khi gom đủ “3 gói theo sau”. Với cùng mức mất gói, game đứng lâu hơn nhiều so với khi truyền dữ liệu dung lượng lớn. (Phát triển server (Đội phát triển game))
- Thiết bị trung gian xóa tùy chọn TCP: Nếu một số tường lửa hoặc thiết bị tăng tốc xóa hay sửa tùy chọn TCP, khi mất nhiều gói thì mỗi vòng khứ hồi chỉ phục hồi được một gói, hoặc cửa sổ (lượng dữ liệu gửi được trong một lần) bị thu nhỏ, khiến kết nối chậm đi. (Hạ tầng mạng (Đội hạ tầng))
- Zero window (khoảng dừng dễ nhầm là truyền lại): Nếu chương trình bên nhận không đọc socket kịp khiến bộ đệm đầy, bên gửi sẽ ngừng gửi và chỉ gửi zero window probe. Đường truyền không có vấn đề gì. (Phát triển client (Đội phát triển game))
Xem từ điển triệu chứng gốc có hình minh họa