ゲームラグ白書 › TCP再送の根本原因
ボトルネックでのキューあふれ(輻輳によるロス) Tail drop at a congested bottleneck
原因ID rt-queue-drop · 主担当 インフラチーム・ネットワークインフラ · 副担当 外部・外部, ゲーム開発チーム・クライアント開発
図と実験のあるメインページでこのカードを開く →
ルーター、通信事業者どうしの接続区間、データセンターの回線のように、最も細い箇所のキューが満杯になると、新しく届くパケットを破棄します。
なぜ 動画・ダウンロード・他のユーザーのトラフィックでボトルネック区間が満杯 → すると キューが満杯の間、新しく到着するパケットが続けて破棄される(tail drop)。破棄されなかったパケットも満杯のキューの末尾で待たされる → 画面では 複数のパケットが一度に消え、長く止まった後に早送り、夜の時間帯に多い
- 症状
- フリーズ, 早送り, 引き戻し
- 要因
- パケットロス, 遅延
- 誰に起きるか
- 同じ家, 特定の地域・ISP, サーバー全体
- いつ
- 夜のピーク時間帯, 人が集中したとき
- 担当
- 主担当 インフラチーム・ネットワークインフラ · 副担当 外部・外部, ゲーム開発チーム・クライアント開発
- ゲーム開発チームの対応
- パケットロスが集中したりPingが急上昇したりしたら画面にネットワーク状態を表示(同じ回線で大容量の転送が行われている可能性を案内)。
- インフラチームの対応
- データセンター回線の余裕を確保、自社の回線・スイッチポートのキューでの破棄(output drops)カウンターを確認、通信事業者の区間が詰まっていれば別の回線・ピアリングに迂回。
- 外部の対応
- ユーザーにルーターのSQM(fq_codel、CAKE)とECNの利用を案内(キューがあふれる前に速度を落とさせる)、通信事業者にボトルネック区間の増強を依頼。
- 数値の目安
- キューがあふれる瞬間には、数十msの間に入ってくるパケットのかなりの部分が一度に消えます。続けて失ったうえに送り直したパケットまで失いやすいため、RTOに至ることが多くなります。
- グラフでは
- 特定の時間帯だけ高い · 再送率、RTT(Ping)
- 確認箇所
- サーバーの再送率(nstatを1分間隔で実行して得たTcpRetransSegs ÷ TcpOutSegsの増分)と接続ごとのRTTを地域・通信事業者・時間帯別に分けて確認し、自社の回線・スイッチポートの出力破棄(ifOutDiscards)もあわせて確認。問題の地域に向けて、ピーク時間帯と空いている時間帯にmtrを取って比較
- 該当する場合
- 夜のピークにだけ再送率が上がり、パケットロスの直前にRTTが先に上がる(キューが埋まっていく様子)。mtrではピーク時間帯にだけ、ある区間から終点までパケットロスと遅延がそろって増える
- 該当しない場合
- パケットロスの直前にRTTが上がらなければ「ポリサーによる超過分の破棄」。時間帯に関係なく常に同じようにパケットを失うなら「物理エラー」か「経路変更・ECMPの不良経路」
- 確認手段
- インフラのツールで確認(ゲームコード不要)
- 実際の事例
- Riot Games 2015: 遠回りしていたLeague of LegendsのトラフィックとRiot Direct
出典
- RFC 7567: IETF Recommendations Regarding Active Queue Management IETF
tail dropはキューを長く満杯のままにして遅延を増やし、集中したパケットロスを生むという説明と、AQMの推奨 - RFC 8290: The Flow Queue CoDel Packet Scheduler and Active Queue Management Algorithm IETF
fq_codel:フローごとのキューとAQMでキューを短く保ち、バッファブロートを減らす - RFC 3168: The Addition of Explicit Congestion Notification (ECN) to IP IETF
ECN:パケットを破棄する代わりに、IPヘッダーの印で輻輳を知らせる - Smart Queue Management Bufferbloat.net
SQM:フローごとのスケジューリング、キュー長の管理(AQM)、シェーピングを組み合わせる方式 - Cake Bufferbloat.net
CAKE:シェーパーとfq_codel系のキュー管理を一つにまとめた、ルーター向けのSQM - net/ipv4/proc.c Linux kernel
nstatに表示されるTcpRetransSegs・TcpOutSegs(Tcp項目のRetransSegs・OutSegs) - nstat(8) — Linux manual page iproute2
nstatはデフォルトで、前回の実行以降の増分を表示 - RFC 2863: The Interfaces Group MIB IETF
ifOutDiscards:エラーがないのに、バッファ領域の確保などの理由で送出せずに破棄したパケット数 - An Internet-Wide Analysis of Traffic Policing Google
キューあふれではパケットロスの前に待ち時間とRTTが先に上がり、ポリシングはRTTを増やさずに超過分を破棄するという区別(SIGCOMM 2016)
あわせて読みたい原因
同じ層:TCP再送の根本原因
同じ症状(フリーズ)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る