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

ゲームラグ白書 › TCP再送の根本原因

送信バーストによる浅いバッファのあふれ Sender bursts overflow shallow buffers

原因ID rt-burst · 主担当 ゲーム開発チーム・サーバー開発 · 副担当 インフラチーム・サーバーインフラ, インフラチーム・ネットワークインフラ

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

サーバーがティックごとに数千人分の更新を一瞬でまとめて送ると、スイッチの小さなバッファやクラウドの瞬間的な上限が1ms足らずであふれ、一部が破棄されます。

なぜ ティックの開始時に、全員に送るパケットを一度に送信 → すると 複数のサーバーのトラフィックが集まるスイッチポートのバッファ(ポートあたり数百KB〜数MB)やクラウドインスタンスの上限が瞬間的にあふれる(平均利用率は低い) → 画面では 複数の人が同時にワープしたり一瞬止まったりする、平均値のメトリクスでは原因が見えない

症状
ワープ, フリーズ, 早送り
要因
パケットロス
誰に起きるか
特定の場所・チャンネル, サーバー全体
いつ
人が集中したとき
担当
主担当 ゲーム開発チーム・サーバー開発 · 副担当 インフラチーム・サーバーインフラ, インフラチーム・ネットワークインフラ
ゲーム開発チームの対応
1ティック分の送信をティック内に分けて送る(数千の接続がティック開始時に集中するのは、接続ごとのペーシングではうまく解消しない)、サーバーごとにティックの開始時刻を分散、大きなデータを送る接続はSO_MAX_PACING_RATEで速度に上限を設定。
インフラチームの対応
サーバー機器・OS:サーバー全体の送信速度に上限を設定(サーバーOSのシェーパー、Linuxのtc)、1つの接続がまとめて送る分はペーシング(Linuxのfqキュー、BBR)で平準化。ネットワーク:バッファの大きいスイッチ、スイッチポートの出力破棄カウンターを短い間隔で確認(平均利用率では見えない)。
数値の目安
10Gbpsのポートが1msで送れる量は約1.25MBです。複数のサーバーのティックが重なって1つのポートに集中すると、バッファはあっという間に埋まります。
グラフでは
人数・負荷に連動して上昇 · スイッチポートの出力破棄数、再送率
確認箇所
サーバーがつながっているスイッチポートとその上位のポートの出力破棄(ifOutDiscards)を数秒間隔で収集し、クラウドならethtool -Sのbw_out_allowance_exceeded・pps_allowance_exceededを確認。同じ時刻の再送をbcc tcpretransで収集して突き合わせる
該当する場合
分単位の平均利用率は低いのに出力破棄やallowance超過が増え、その量が同時接続数や1か所に集まった人数に連動して大きくなる。再送が特定のユーザーのIPアドレス帯(通信事業者・地域)に偏らず、そのサーバーの複数の接続で同じ瞬間に起きる
該当しない場合
同じポートでCRC・入力エラーも増えていれば「物理エラー」。受信側サーバーのNICの破棄カウンターやsoftnetのdroppedが増えていれば「受信サーバーのホストでのパケット破棄」
確認手段
インフラのツールで確認(ゲームコード不要)
もっと詳しく
ペーシングは接続ごとに個別に動きます。数千の接続がティック開始時に1〜2個ずつ送ることで生じる集中は接続ごとのペーシングではうまく解消できないため、ゲームサーバーが送るタイミングを自分で分散させる必要があります。逆に1つの接続が大きなデータを送るときは、NICが数十KBのデータをパケットサイズに切り分けて続けて送り出しますが(TSO)、このような集中はペーシングがうまく分散してくれます。

出典

  1. High-Resolution Measurement of Data Center Microbursts Meta
    データセンターのラックスイッチでのバーストは70%以上が数十µs以内に終わり、分単位の平均利用率とドロップの関係は弱い(IMC 2017)
  2. tc-fq(8) — Linux manual page iproute2
    fqキューはソケット(接続)ごとにペーシングし、SO_MAX_PACING_RATEで接続ごとの最大速度を決める
  3. net/ipv4/tcp_bbr.c Linux kernel
    BBRは推定したボトルネック帯域幅をもとにpacing_rateを決めて送る
  4. IP Sysctl Linux kernel
    TCPはフローの速度に合わせてTSOフレームのサイズを決める(最大64KB、tcp_min_tso_segs)
  5. Monitor network performance for ENA settings on your EC2 instance AWS
    bw_out_allowance_exceeded・pps_allowance_exceeded:インスタンスの帯域幅・秒間パケット数の上限を超えたため、キューに入れられたか破棄されたパケット数
  6. RFC 2863: The Interfaces Group MIB IETF
    ifOutDiscards:エラーがないのに、バッファ領域の確保などの理由で送出せずに破棄したパケット数
  7. Demonstrations of tcpretrans, the Linux eBPF/bcc version IO Visor
    再送ごとに相手のアドレス・ポート・接続状態を1行ずつ表示

あわせて読みたい原因

同じ層:TCP再送の根本原因

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

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