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

ゲームラグ白書 › L7 サーバーOS(カーネル)

サーバーのconntrackテーブル飽和 conntrack table full

原因ID so-conntrack · 主担当 インフラチーム・サーバーインフラ · 副担当 ゲーム開発チーム・サーバー開発, ゲーム開発チーム・クライアント開発

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

Linuxのファイアウォールがすべての接続を記録する接続追跡(conntrack)テーブルが上限に達すると、新しいパケットを破棄します。

なぜ 接続の殺到や短い接続の繰り返しで、接続の記録が増加 → すると テーブルが満杯になり、新しい接続と一部のパケットを破棄 → 画面では 接続不可、原因不明のパケットロスでワープ

症状
接続不可・無限ロード, ワープ
要因
パケットロス
誰に起きるか
サーバー全体
いつ
接続直後・メンテ明け, 人が集中したとき
担当
主担当 インフラチーム・サーバーインフラ · 副担当 ゲーム開発チーム・サーバー開発, ゲーム開発チーム・クライアント開発
ゲーム開発チームの対応
サーバー:短い接続を減らす(サーバー間の呼び出しは接続を再利用)。クライアント:接続に失敗したり切れたりしたら、再試行の間隔を広げながらランダムに分散。
インフラチームの対応
テーブルサイズ(nf_conntrack_max)を増やす、ゲームのポートは追跡の対象外にする(rawテーブルのNOTRACK)、使用量のアラート。
数値の目安
デフォルトの上限はサーバーのメモリ量に応じて約6万〜26万件です。あふれるとカーネルログに「nf_conntrack: table full, dropping packet」が出力されます。
グラフでは
上限で頭打ち · conntrackのエントリ数(nf_conntrack_count)
確認箇所
sysctlのnet.netfilter.nf_conntrack_count(現在のエントリ数)をnf_conntrack_maxと同じグラフに並べ、dmesgで「nf_conntrack: table full, dropping packet」を探す
該当する場合
nf_conntrack_countがmaxで頭打ちになり、その時刻からカーネルログにtable fullが出ている
該当しない場合
エントリ数がmaxに遠く及ばなければこの原因ではない。AWSインスタンス自体の接続追跡の上限は、「クラウドのPPS上限超過」にあるconntrack_allowance_exceededで確認
確認手段
インフラのツールで確認(ゲームコード不要)

出典

  1. Netfilter Conntrack Sysfs variables Linux kernel
    nf_conntrack_maxのデフォルト値はハッシュバケット数(nf_conntrack_buckets)と同じで、バケット数はメモリサイズで決まる
  2. net/netfilter/nf_conntrack_core.c (Linux v6.12) Linux kernel
    デフォルトのサイズは、メモリが1GB超なら65,536で、4GB超(64ビット)なら262,144、満杯になると「nf_conntrack: table full, dropping packet」を記録して破棄
  3. iptables-extensions(8) — Linux manual page netfilter
    rawテーブルのCT --notrackで接続追跡の対象外にする

あわせて読みたい原因

同じ層:L7 サーバーOS(カーネル)

同じ症状(接続不可・無限ロード)を起こすほかの層の原因

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