ゲームラグ白書 › TCP再送の根本原因
ファイアウォール・接続追跡による破棄 Stateful firewall / conntrack drops
原因ID rt-stateful-fw · 主担当 インフラチーム・ネットワークインフラ · 副担当 インフラチーム・サーバーインフラ, ゲーム開発チーム・サーバー開発, ゲーム開発チーム・クライアント開発
図と実験のあるメインページでこのカードを開く →
ファイアウォールやLinuxの接続追跡(conntrack、通過する接続をテーブルに記録する機能)は、テーブルが満杯になったり、接続の状態が合わないと判断したりすると、パケットを破棄します。
なぜ 接続追跡テーブルが満杯(table full)、または行きと帰りの経路が異なり、片方向だけがファイアウォールを通る(非対称経路) → すると ファイアウォールが「知らない接続」や「ウィンドウの範囲から外れたシーケンス番号」のパケットとみなして破棄 → 画面では テーブルが満杯になると新規接続ができなくなり、経路がずれるとその経路の人だけが再送を繰り返した末に切断
- 症状
- フリーズ, 切断, 接続不可・無限ロード
- 要因
- パケットロス
- 誰に起きるか
- サーバー全体, 特定の地域・ISP
- いつ
- 人が集中したとき, 接続直後・メンテ明け, ときどきランダムに
- 担当
- 主担当 インフラチーム・ネットワークインフラ · 副担当 インフラチーム・サーバーインフラ, ゲーム開発チーム・サーバー開発, ゲーム開発チーム・クライアント開発
- ゲーム開発チームの対応
- サーバー:テーブルが満杯になる場合に備え、ログイン待機列の仕組みで集中する接続を調整、短い接続を繰り返さないよう接続を再利用(サーバー間の呼び出しを含む)、ハートビートが途絶えた接続は先に整理。クライアント:接続に失敗したり切断されたりしたら、再試行間隔を延ばしながらランダムに分散(テーブルが満杯のときに一斉に再び殺到しないように)。
- インフラチームの対応
- ネットワーク:ファイアウォールの接続追跡テーブルのサイズを増やす、ゲームのポートは接続追跡から外す、行きと帰りの経路が同じファイアウォールを通るようルーティングを合わせる、ファイアウォールのTCPウィンドウ検査の設定を確認。サーバー機器・OS:Linuxのテーブルサイズを増やす(nf_conntrack_max)、ゲームのポートは接続追跡から外す(NOTRACK)、TCPウィンドウ検査の設定を確認(nf_conntrack_tcp_be_liberal)、AWSならconntrack_allowance_exceededも確認。
- 数値の目安
- Linuxのconntrackの上限(nf_conntrack_max)のデフォルト値は、メモリ量に応じて数万〜数十万個です。現在の数(nf_conntrack_count)が上限に達すると、ログに「nf_conntrack: table full, dropping packet」が記録されます。
- グラフでは
- 上限で頭打ち · conntrackのエントリ数(nf_conntrack_count)、新規接続の失敗数
- 確認箇所
- Linuxサーバーではnf_conntrack_countとnf_conntrack_max、dmesgの「nf_conntrack: table full, dropping packet」、/proc/net/stat/nf_conntrackのdrop・invalid(コアごとに1行、16進数)を確認。ファイアウォールではセッションテーブルの使用量とドロップログ、AWSではethtool -Sのconntrack_allowance_exceededを確認
- 該当する場合
- エントリ数が上限で平らになり、同じ時刻にtable fullのログとdrop、またはconntrack_allowance_exceededが増える。非対称経路の場合は上限に余裕があるのに、invalidとファイアウォールのドロップログが特定の経路の接続で増える
- 該当しない場合
- エントリ数が上限から遠く、invalid・ドロップログも変わらなければ別の原因。テーブルには余裕があるのにファイアウォールのCPUや秒間パケット数が上限に達しているなら「中間機器の処理上限超過」
- 確認手段
- インフラのツールで確認(ゲームコード不要)
出典
- Netfilter Conntrack Sysfs variables Linux kernel
nf_conntrack_maxのデフォルト値はハッシュバケット数(メモリ÷16384、1,024〜262,144)、現在の数はnf_conntrack_count、nf_conntrack_tcp_be_liberalはウィンドウ外のRSTだけをINVALIDとして扱う - net/netfilter/nf_conntrack_core.c Linux kernel
テーブルが満杯になると「nf_conntrack: table full, dropping packet」をログに記録して破棄(drop統計が増加)、接続状態に合わないパケットはinvalid統計が増加 - iptables-extensions(8) — Linux manual page netfilter
rawテーブルのCT --notrackで接続追跡から除外 - Amazon EC2 security group connection tracking AWS
インスタンスごとの追跡接続数の上限を超えるとパケットを破棄し、conntrack_allowance_exceededで確認できる、非対称経路は避けるべきという推奨 - net/netfilter/nf_conntrack_standalone.c Linux kernel
/proc/net/stat/nf_conntrackはコアごとに1行、16進数で、entries・invalid・insert_failed・drop・early_dropなどの列がある
あわせて読みたい原因
同じ層:TCP再送の根本原因
同じ症状(フリーズ)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る