Sách trắng lag game › Tra theo triệu chứng
Không vào được·kẹt loading: 45 nguyên nhân và đội phụ trách
Tên gọi khác: không đăng nhập được, loading mãi không xong
Mở từ điển triệu chứng gốc có hình minh họa →
Không vào được game, hoặc bị kẹt ở màn hình loading hay màn hình vào game.
Liên tục báo “Không thể kết nối tới máy chủ”, chọn nhân vật xong thì thanh loading chạy mãi không hết.
Các nơi tiếp nhận kết nối mới (hàng đợi kết nối của server, tường lửa, server đăng nhập, DB) đã đầy. Đặc biệt hay gặp ngay sau bảo trì.
Nguyên nhân gây ra triệu chứng này
L2 OS và thiết bị phía client
- Phần mềm bảo mật kiểm tra gói tin: Khi phần mềm diệt virus hay tường lửa kiểm tra mọi gói tin, độ trễ tăng lên; nếu quá tay, chúng còn nhầm game là tấn công và chặn lại. (Bên ngoài (Bên ngoài))
L3 Mạng gia đình
L4 Đường truyền Internet
- Hạn chế UDP và kiểm tra gói tin ở cấp quốc gia hoặc nhà mạng: Một số mạng chặn một số địa chỉ và cổng UDP nhất định hoặc giới hạn tốc độ UDP, còn thiết bị kiểm tra gói tin thì lọc bỏ các giao thức mà nó không nhận ra. Game giao tiếp bằng UDP sẽ không kết nối được hoặc hay bị mất kết nối trên các mạng đó. (Bên ngoài (Bên ngoài))
- DNS lỗi hoặc chậm: Nếu DNS, dịch vụ đổi tên server thành địa chỉ, bị chậm hoặc lỗi thì game không tìm được server đăng nhập hay server cập nhật. (Bên ngoài (Bên ngoài))
- Đường truyền dùng chung bị DDoS làm bão hòa: Các cuộc tấn công quy mô lớn nhắm vào công ty game, hoặc vào nơi khác trong cùng mạng, làm đầy đường truyền dùng chung. (Hạ tầng mạng (Đội hạ tầng))
- IP dùng chung của nhà mạng (CGNAT): Mạng di động và một số nhà mạng cho nhiều thuê bao dùng chung một IP, và xóa ánh xạ (mapping) của kết nối nhàn rỗi sau một thời gian ngắn. (Phát triển client (Đội phát triển game))
- Đi qua VPN hoặc phần mềm tăng tốc game: Khi bật VPN hoặc phần mềm tăng tốc game, gói tin sẽ đi qua server trung chuyển của công ty đó. Nếu server trung chuyển ở xa hoặc đông, kết nối lại chậm hơn cả khi không bật. (Bên ngoài (Bên ngoài))
L5 Thiết bị mạng trung tâm dữ liệu
- Bảng phiên của tường lửa bị đầy: Tường lửa ghi mọi kết nối đã cho đi qua vào bảng phiên để theo dõi. Khi bảng đầy, tường lửa không nhận thêm được kết nối mới. (Hạ tầng mạng (Đội hạ tầng))
- Đi qua hệ thống chống DDoS, chặn nhầm: Để chặn tấn công, lưu lượng được chuyển qua trung tâm lọc DDoS nên tuyến đường dài ra, và đôi khi người chơi bình thường bị nhầm là kẻ tấn công và bị chặn. (Hạ tầng mạng (Đội hạ tầng))
- 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))
- Bộ cân bằng tải phân bổ lệch, health check đánh giá sai: Kết nối dồn vào một server, hoặc người chơi cứ bị gửi tới server đã chết. (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))
L7 OS server (kernel)
- Tràn hàng đợi kết nối (backlog): Ngay sau bảo trì, khi hàng chục nghìn người chơi kết nối cùng lúc, hàng đợi kết nối (backlog) của kernel bị tràn và các yêu cầu kết nối bị bỏ. (Phát triển server (Đội phát triển game))
- Giới hạn file descriptor: Mỗi kết nối cần một file descriptor (fd, con số OS gán cho mỗi file hoặc socket đang mở), nhưng số fd mà một tiến trình được mở có giới hạn. (Hạ tầng server (Đội hạ tầng))
- Bảng conntrack của server bị đầy: Khi bảng theo dõi kết nối (conntrack), nơi tường lửa Linux ghi lại mọi kết nối, chạm giới hạn, gói tin mới sẽ bị bỏ. (Hạ tầng server (Đội hạ tầng))
- 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
- Keepalive mặc định 2 giờ: Khi bên kia biến mất mà không gửi tín hiệu đóng kết nối, rất lâu sau TCP mới phát hiện. Keepalive (tính năng của TCP kiểm tra xem kết nối nhàn rỗi còn sống không) mặc định tắt, và dù có bật thì kết nối cũng phải nhàn rỗi 2 giờ mới bắt đầu kiểm tra. (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))
L9 Tiến trình game phía server
- 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))
L11 Ổ đĩa
- Ghi core dump: Khi server sập, việc ghi vài GB bộ nhớ xuống ổ đĩa có thể làm việc khởi động lại chậm mất vài phút. (Hạ tầng server (Đội hạ tầng))
L12 Cơ sở dữ liệu
- Query không có index: Không có index thì muốn tìm các dòng thỏa điều kiện, DB phải đọc toàn bộ bảng (full scan). (Phát triển server (Đội phát triển game))
- Cạn connection pool: Số kết nối tạo sẵn tới DB là cố định, nên khi query chậm chiếm giữ kết nối, các yêu cầu còn lại phải chờ. (Phát triển server (Đội phát triển game))
- Cache lạnh (ngay sau khởi động lại): Khi DB khởi động lại, cache trong bộ nhớ trống trơn, nên một thời gian mọi truy vấn đều phải đọc từ ổ đĩa. (Hạ tầng DB (Đội hạ tầng))
- Đăng nhập ồ ạt và query N+1: Nếu tải một nhân vật mà phải truy vấn riêng lẻ vài chục lần, thì vài chục nghìn người đăng nhập cùng lúc sẽ thành hàng triệu query. (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))
- 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))
- Query chậm do kế hoạch thực thi thay đổi: Code không đổi, nhưng nếu DB đổi cách xử lý cùng một query (kế hoạch thực thi), query hôm qua mất 2 ms thì hôm nay mất vài trăm ms. (Hạ tầng DB (Đội hạ tầng))
- 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
- 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))
- 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))
- Triển khai và khởi động lại: Khi khởi động lại server để cập nhật mà không chuyển kết nối đi nơi khác, những người đang ở server đó bị mất kết nối, đồng thời việc lưu dữ liệu ngay trước khi tắt và việc kết nối lại dồn vào cùng một lúc. (Phát triển server (Đội phát triển game))
- 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))
- 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))
- 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))
- Giới hạn hàng chờ đăng nhập, thiếu thời gian giữ chỗ khi kết nối lại: Ngay sau khi ra mắt hoặc bảo trì, lượng kết nối dồn đến khiến hàng chờ đăng nhập chạm giới hạn và từ chối lượt chờ mới, còn người chơi đang chờ chỉ cần mất kết nối trong giây lát là mất chỗ và phải quay về cuối hàng. (Phát triển server (Đội phát triển game))
Thiết kế đồng bộ
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))
- Xung đột cổng UDP cố định: Nếu client được viết để dùng một cổng cục bộ cố định, client thứ hai trên cùng PC sẽ không dùng được cổng đó hoặc phải chia gói tin nhận được với client thứ nhất. (Phát triển client (Đội phát triển game))
- Giới hạn chạy nhiều client: Nếu module bảo mật hoặc chính sách server giới hạn nhiều client trên một PC, client thứ hai sẽ bị chặn chạy hoặc chặn kết nối, hoặc client bật trước bị mất kết nối. Một số game chỉ chặn tính năng của client chạy thêm. (Phát triển client (Đội phát triển game))
Nguyên nhân gốc của truyền lại TCP
- 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))
- 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))
- Truyền lại yêu cầu kết nối (SYN): Khi yêu cầu kết nối biến mất do hàng đợi kết nối (backlog) bị tràn hoặc bị tường lửa chặn, OS phía client sẽ gửi lại, bắt đầu sau 1 giây và giãn dần khoảng cách. (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