Sách trắng lag game › Tra theo triệu chứng
Đứng hình: 67 nguyên nhân và đội phụ trách
Tên gọi khác: đơ, treo, không phản hồi
Mở từ điển triệu chứng gốc có hình minh họa →
Mọi thứ trên màn hình dừng lại một lúc (0,5 giây đến vài giây) rồi chạy tiếp.
Mọi người đứng yên. Chỉ nhân vật của bạn còn nhích một chút nhờ dự đoán hoặc chạy tại chỗ. Khi màn hình chạy lại, các chuyển động bị dồn sẽ ùa tới một lượt dưới dạng tua nhanh hoặc dịch chuyển tức thời.
Server đứng toàn bộ (GC, deadlock, gọi đồng bộ), đường truyền đứt trong chốc lát, hoặc PC của bạn bị đứng.
Nguyên nhân gây ra triệu chứng này
L1 Tiến trình game phía client
- Frame time vọt lên: Việc tính toán một khung hình mất thời gian gấp nhiều lần bình thường nên màn hình dừng lại trong chốc lát. (Phát triển client (Đội phát triển game))
- Thu gom rác (GC) phía client: Trong lúc thu hồi bộ nhớ đã dùng xong (rác), cả game dừng lại. Đặc trưng là giật khựng theo khoảng cách đều đặn. (Phát triển client (Đội phát triển game))
- Tải đồng bộ trên main thread và biên dịch shader: Ngay trước khi vẽ khu vực, quái hay hiệu ứng lần đầu xuất hiện, game phải đọc file và tạo shader nên bị dừng. (Phát triển client (Đội phát triển game))
- Ổ lưu trữ chậm khiến streaming asset không theo kịp: Trên ổ lưu trữ chậm như HDD, tốc độ đọc texture và model của thế giới mở không theo kịp tốc độ di chuyển, nên đối tượng hiện ra muộn hoặc game giật vì phải chờ đọc xong. (Phát triển client (Đội phát triển game))
- Kiểm tra của module bảo mật game (anti-cheat): Module bảo mật chạy cùng game để chống hack sẽ kiểm tra định kỳ. Nếu lần kiểm tra nặng, hoặc heartbeat (tín hiệu định kỳ báo vẫn còn sống) trao đổi với server bảo mật bị trễ, game sẽ giật khựng hoặc mất kết nối. (Phát triển client (Đội phát triển game))
L2 OS và thiết bị phía client
- Chuyển đổi Wi-Fi ↔ LTE hoặc 5G: Khi bạn ra khỏi nhà, Wi-Fi mất và máy chuyển sang LTE hoặc 5G, địa chỉ IP của bạn thay đổi nên kết nối hiện có không còn dùng được. (Phát triển server (Đội phát triển game))
- Thiếu bộ nhớ và swap phía client: Khi mở vài chục tab trình duyệt cùng lúc với game, OS đẩy một phần bộ nhớ của game xuống ổ đĩa. (Bên ngoài (Bên ngoài))
- Thiếu bộ nhớ đồ họa (VRAM): Nếu tùy chọn đồ họa cần nhiều bộ nhớ hơn bộ nhớ của card đồ họa, OS phải đẩy texture ra bộ nhớ của PC rồi lấy lại, gây giật khựng. (Phát triển client (Đội phát triển game))
- Tiết kiệm điện NIC và lỗi driver: Nếu card mạng LAN hoặc chip Wi-Fi vào trạng thái tiết kiệm điện giữa các gói tin, việc kích hoạt lại sẽ tốn thời gian. (Bên ngoài (Bên ngoài))
- Phần mềm overlay can thiệp vào game: Phần mềm nhắn tin, launcher, quay màn hình, hiển thị FPS chen vào quá trình render của game (hooking) để vẽ UI của chúng đè lên màn hình game. Mỗi khung hình phải làm thêm việc, và đôi khi xung đột với game gây khựng hoặc làm game bị tắt đột ngột. (Bên ngoài (Bên ngoài))
L3 Mạng gia đình
L4 Đường truyền Internet
- Thay đổi tuyến BGP và hội tụ: Khi thông tin định tuyến trên Internet thay đổi, gói tin bị mất trong vài giây đến vài chục giây (hiếm khi vài phút) cho đến khi định tuyến hội tụ trở lại. (Hạ tầng mạng (Đội hạ tầng))
- Chất lượng đường truyền kém: Đầu nối tiếp xúc kém, dây cũ hoặc modem trục trặc gây mất gói đều đặn và làm đường truyền bị ngắt theo chu kỳ. (Bên ngoài (Bên ngoài))
L5 Thiết bị mạng trung tâm dữ liệu
- Failover thiết bị mạng: Khi một router hay tường lửa hỏng và chuyển sang thiết bị dự phòng (failover), mọi người đều bị đứng hình trong vài giây chuyển đổi đó. (Hạ tầng mạng (Đội hạ tầng))
- MTU không khớp (chỉ mất gói lớn): Khi MTU (kích thước gửi được trong một lần) của một chặng ở giữa nhỏ đi mà thông báo vượt kích thước lại bị chặn, chỉ các gói lớn liên tục bị mất. (Hạ tầng mạng (Đội hạ tầng))
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))
- Lỗi driver hoặc firmware NIC: Do lỗi driver hoặc tính năng hoạt động sai, card mạng bị treo và khởi động lại, trong lúc đó mọi việc gửi nhận đều bị ngắt. (Hạ tầng server (Đội hạ tầng))
L7 OS server (kernel)
- CPU steal (máy ảo): Trong lúc server vật lý (hypervisor) tạm chuyển thời gian CPU của một máy ảo cho máy ảo khác (CPU steal), server game bị dừng. (Hạ tầng server (Đội hạ tầng))
- Dừng do thu hồi bộ nhớ và compaction: Tiến trình bị dừng trong lúc OS dồn bộ nhớ (compaction) để tạo huge page, hoặc thu hồi bộ nhớ để có thêm chỗ trống. (Hạ tầng server (Đội hạ tầng))
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))
- TCP RTO và exponential backoff: Mỗi lần truyền lại tiếp tục thất bại, thời gian chờ lại tăng gấp đôi, nên đường truyền chỉ đứt chốc lát cũng thành một lần đứng dài. (Phát triển server (Đội phát triển game))
- 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))
- SO_REUSEPORT phân phối bị lệch: Khi nhiều tiến trình cùng nhận trên một cổng, kernel dùng hash địa chỉ để gán mỗi kết nối cho một tiến trình và không đổi lại. Nếu một tiến trình bị dừng, chỉ những người được gán vào đó phải chờ. (Phát triển server (Đội phát triển game))
- Lỗi WSAECONNRESET trên socket UDP của Windows: Khi server Windows gửi UDP tới một client đã rời đi, thông báo “không tới được cổng” (ICMP) sẽ gửi về. Thông báo này khiến lời gọi nhận tiếp theo kết thúc bằng lỗi; nếu code server coi lỗi đó là bản thân socket bị hỏng, mọi người dùng socket đó đều bị ảnh hưởng. (Phát triển server (Đội phát triển game))
L9 Tiến trình game phía server
- Tranh chấp lock: Khi nhiều thread cùng chờ một lock để ghi cùng một dữ liệu, dù có thêm thread thì mỗi lúc cũng chỉ một thread chạy. (Phát triển server (Đội phát triển game))
- Deadlock: Khi hai thread chờ lock mà bên kia đang giữ, cả hai sẽ đứng mãi mãi. (Phát triển server (Đội phát triển game))
- Gọi đồng bộ (blocking) trên game thread: Nếu giữa tick mà phải chờ phản hồi DB hoặc ghi file, mọi diễn biến game trên server dừng lại đúng khoảng thời gian đó. (Phát triển server (Đội phát triển game))
- Timer kích hoạt dồn cùng lúc: Khi mọi lượt respawn quái, mọi buff hết hạn và phần thưởng lúc tròn giờ dồn vào cùng một tick, riêng tick đó nặng lên gấp hàng chục lần. (Phát triển server (Đội phát triển game))
- Cạn thread pool: Khi mọi worker thread xử lý việc đều bị kẹt ở các việc chậm, yêu cầu mới chỉ biết chờ vô thời hạn. (Phát triển server (Đội phát triển game))
- Vòng lặp vô hạn và logic chạy mất kiểm soát: Khi một bug khiến tick không bao giờ kết thúc, server bị treo và watchdog buộc khởi động lại. (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))
- GC pause của script engine: 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. (Phát triển server (Đội phát triển game))
- Cấp phát bộ nhớ dồn dập: Khi sự kiện tạo ra hàng loạt đối tượng tạm, GC phải chạy thường xuyên hơn nhiều so với bình thường. (Phát triển server (Đội phát triển game))
- 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))
L11 Ổ đĩa
- Ghi log đồng bộ: Nếu thread game chờ ổ đĩa ghi xong từng dòng log, thì lúc ổ đĩa bận, game cũng bị dừng theo. (Phát triển server (Đội phát triển game))
- Chạm giới hạn IOPS, hàng đợi bão hòa: Khi vượt số yêu cầu ổ đĩa xử lý được trong 1 giây, hàng đợi dài ra và độ trễ tăng vọt. (Hạ tầng server (Đội hạ tầng))
- Lazy loading phía server: Nếu server đợi đến lần đầu có yêu cầu mới đọc dữ liệu phó bản hay bản đồ từ ổ đĩa, thì trong tick đó mọi người đều bị dừng. (Phát triển server (Đội phát triển game))
L12 Cơ sở dữ liệu
- 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))
- Cache stampede: Khi cache của dữ liệu được dùng nhiều hết hạn cùng lúc, hàng nghìn yêu cầu đồng loạt dồn về DB. (Phát triển server (Đội phát triển game))
- Lệnh Redis chậm: Redis xử lý lần lượt từng lệnh một, nên một lệnh chậm sẽ chặn mọi yêu cầu phía sau. (Phát triển server (Đội phát triển game))
L13 Kiến trúc và vận hành server
- Chuyển zone (chuyển giao giữa các server): Khi nhân vật vào bản đồ hoặc phó bản khác, thông tin nhân vật phải được chuyển sang server khác, và quá trình này có thể bị chậm hoặc thất bại. (Phát triển server (Đội phát triển game))
- Sự cố dây chuyền: Khi một service chậm đi, các server gọi đến nó bị giữ lại để chờ phản hồi, và cả những tính năng không liên quan cũng đứng lại. (Phát triển server (Đội phát triển game))
- Quá tải log và giám sát: Khi có sự cố, log tăng đột biến, và server gửi log theo kiểu đồng bộ lại càng chậm hơn vì chính log. (Phát triển server (Đội phát triển game))
Thiết kế đồng bộ
- Lockstep phải chờ người chơi chậm nhất: Trong cấu trúc mọi người cùng tính chung một lượt, chỉ cần input của một người đến muộn là tất cả phải chờ. (Phát triển server (Đội phát triển game))
- Cấu trúc host (chủ phòng): Nếu PC của một người chơi đóng vai server, đường truyền và hiệu năng PC của người đó quyết định cảm nhận của tất cả mọi người. (Phát triển server (Đội phát triển game))
Sự cố chỉ một số người gặp
- Dữ liệu của một nhân vật quá lớn: Nhân vật tích hàng nghìn vật phẩm, thư, hoặc có danh sách bạn bè, danh sách chặn, buff nhiều bất thường thì lượng dữ liệu phải xử lý khi vào game, khi lưu và khi thông báo cho xung quanh lớn gấp nhiều lần người khác. Chỉ nhân vật đó chậm, bất kể đường truyền. (Phát triển server (Độ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))
- Tường lửa và theo dõi kết nối bỏ gói: Tường lửa hoặc tính năng theo dõi kết nối của Linux (conntrack, ghi các kết nối đi qua vào một bảng) sẽ bỏ gói tin khi bảng đầy hoặc khi xác định trạng thái kết nối không khớp. (Hạ tầng mạng (Độ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))
- MTU black hole (chỉ gói lớn liên tục bị mất): Khi kích thước tối đa mà một chặng giữa đường nhận được bị giảm đi nhưng thông báo “quá lớn” (ICMP) lại bị chặn, gói lớn gửi lại bao nhiêu lần cũng tiếp tục biến mất. (Hạ tầng mạng (Đội hạ tầng))
- Ánh xạ NAT hoặc bộ cân bằng tải hết hạn giữa chừng kết nối: Nếu thiết bị trung gian xóa ánh xạ (mapping: mục ghi lại kết nối này cần được chuyển tới đâu) của một kết nối nhàn rỗi, gói gửi tiếp theo sẽ không được chuyển đi. Bên gửi chỉ truyền lại liên tục rồi mất kết nối, hoặc thiết bị gửi trả gói từ chối kết nối (RST) khiến kết nối đứt ngay. (Phát triển client (Đội phát triển game))
- Đổ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