한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

Sách trắng lag game › L2 OS và thiết bị phía client

Tràn bộ đệm nhận Socket receive buffer overflow

ID nguyên nhân co-rcvbuf · Phụ trách chính Phát triển client (Đội phát triển game)

Mở thẻ gốc có hình minh họa và thí nghiệm →

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.

Vì sao Khung hình bị trễ nên game đọc socket muộn → Dẫn đến Bộ đệm nhận của OS đầy: với UDP thì gói bị bỏ, với TCP thì cửa sổ nhận bị thu hẹp khiến bên gửi phải dừng → Trên màn hình Dịch chuyển tức thời (UDP) hoặc tua nhanh (TCP)

Triệu chứng
Dịch chuyển tức thời, Tua nhanh
Yếu tố
Mất gói, Ngưng trệ
Ai gặp phải
Chỉ mình tôi
Khi nào
Khi đông người
Phụ trách
Phụ trách chính Phát triển client (Đội phát triển game)
Việc cần làm (Đội phát triển game)
Dùng thread riêng để nhận, điều chỉnh kích thước bộ đệm (SO_RCVBUF).
Con số tham khảo
Bộ đệm nhận mặc định từ vài chục đến vài trăm KB tùy OS và cấu hình. Ở nơi đông người, lượng cập nhật có thể lên tới vài trăm KB trong 1 giây.
Trên đồ thị
Tăng theo số người và tải · Số gói UDP bị bỏ ở bộ đệm nhận, frame time
Chỗ cần xem
Ghi Microsoft Winsock BSP\Dropped Datagrams (số gói UDP bị bỏ vì bộ đệm nhận của socket không đủ) và UDPv4\Datagrams Received Errors trong Performance Monitor của Windows cùng với frame time; phía game đếm các chỗ bị hụt trong số thứ tự gói đã nhận
Đúng nếu
Dropped Datagrams tăng ở nơi đông người hoặc ngay sau một khung hình dài, cùng lúc số thứ tự trong game bị hụt. Cùng thời điểm đó đường truyền không mất gói
Loại trừ nếu
Dropped Datagrams không đổi mà số thứ tự vẫn bị hụt → mất gói trên đường đi
Cách kiểm tra
Kiểm tra ở môi trường phía người chơi

Nguồn

  1. socket(7) — Linux manual page Linux man-pages
    SO_RCVBUF là kích thước tối đa của bộ đệm nhận socket; giá trị mặc định do rmem_default, giá trị tối đa do rmem_max quyết định (Android cũng dùng kernel Linux)
  2. SOL_SOCKET Socket Options (Winsock2.h) Microsoft
    SO_RCVBUF trên Windows: vùng bộ đệm dành riêng cho việc nhận ở mỗi socket
  3. RFC 9293: Transmission Control Protocol (TCP) IETF
    Trường window của TCP là số byte bên nhận còn nhận thêm được; nếu bằng 0, bên gửi chỉ gửi zero window probe và chờ
  4. Low Latency Workloads Management and Operations Microsoft
    Dropped Datagrams và Dropped Datagrams/sec trong bộ counter Microsoft Winsock BSP: số gói UDP bị bỏ vì tới nhanh hơn tốc độ ứng dụng xử lý hoặc vì bộ đệm socket nhận không đủ
  5. Network-Related Performance Counters Microsoft
    Counter UDPv4, UDPv6: Datagrams Received Errors; Microsoft Winsock BSP: Dropped Datagrams

Nguyên nhân nên xem cùng

Cùng tầng: L2 OS và thiết bị phía client

Nguyên nhân ở tầng khác gây cùng triệu chứng (Dịch chuyển tức thời)

Xem thẻ gốc có hình minh họa và thí nghiệm