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