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

ゲームラグ白書 › L2 クライアントのOS・端末

受信バッファのあふれ Socket receive buffer overflow

原因ID co-rcvbuf · 主担当 ゲーム開発チーム・クライアント開発

図と実験のあるメインページでこのカードを開く →

ゲームの処理が忙しく、ソケット(OSが提供するネットワーク送受信のインターフェース)からパケットを取り出すのが遅れると、OSのバッファがあふれます。

なぜ フレームが遅れ、ゲームがソケットを読むのが遅くなる → すると OSの受信バッファがいっぱいになり、UDPは破棄され、TCPは受信ウィンドウを縮めて送信側を止めさせる → 画面では ワープ(UDP)または早送り(TCP)

症状
ワープ, 早送り
要因
パケットロス, ストール
誰に起きるか
自分だけ
いつ
人が集中したとき
担当
主担当 ゲーム開発チーム・クライアント開発
ゲーム開発チームの対応
受信専用スレッド、バッファサイズの調整(SO_RCVBUF)。
数値の目安
デフォルトの受信バッファは、OS・設定によって数十〜数百KB。人が多い場所の更新は、1秒に数百KBになることもあります。
グラフでは
人数・負荷に連動して上昇 · UDP受信バッファでの破棄数、フレームタイム
確認箇所
Windowsのパフォーマンスモニターで、Microsoft Winsock BSP\Dropped Datagrams(ソケットの受信バッファ不足で破棄されたUDPの数)とUDPv4\Datagrams Received Errorsをフレームタイムとあわせて記録し、ゲーム側では受信パケットの連番の抜けを数える
該当する場合
人が多い場所や長いフレームの直後にDropped Datagramsが増え、同じ瞬間にゲームの連番に抜けが出る。同じ時刻に回線側のパケットロスはない
該当しない場合
Dropped Datagramsは変わらないのに連番だけ抜けるなら、経路上のパケットロス
確認手段
ユーザー側の環境で確認

出典

  1. socket(7) — Linux manual page Linux man-pages
    SO_RCVBUFはソケットの受信バッファの最大サイズ。デフォルト値はrmem_default、最大値はrmem_maxで決まる(AndroidもLinuxカーネル)
  2. SOL_SOCKET Socket Options (Winsock2.h) Microsoft
    WindowsのSO_RCVBUF:ソケットごとに受信用に確保するバッファ領域
  3. RFC 9293: Transmission Control Protocol (TCP) IETF
    TCPのウィンドウフィールドは、受信側がさらに受け取れるバイト数。0なら送信側はゼロウィンドウプローブだけを送って待つ
  4. Low Latency Workloads Management and Operations Microsoft
    Microsoft Winsock BSPカウンターセットのDropped Datagrams・Dropped Datagrams/sec:アプリの処理速度よりUDPが速く届いたり、受信ソケットのバッファが足りなかったりして破棄された数
  5. Network-Related Performance Counters Microsoft
    UDPv4・UDPv6:Datagrams Received Errors、Microsoft Winsock BSP:Dropped Datagramsカウンター

あわせて読みたい原因

同じ層:L2 クライアントのOS・端末

同じ症状(ワープ)を起こすほかの層の原因

図と実験のあるメインページでこのカードを見る