ゲームラグ白書 › L6 サーバーのネットワークカード
NIC割り込みの単一コア集中 Single-queue NIC / no RSS
原因ID nic-irq · 主担当 インフラチーム・サーバーインフラ
図と実験のあるメインページでこのカードを開く →
NICがパケット到着の割り込みを1つのCPUコアにだけ送ると、そのコアがボトルネックになります。
なぜ 受信キューが1つだけか、複数のコアに分散するRSSが無効 → すると 1つのコアが100%になり、パケットを時間内に取り出せない → 画面では 人が集中したときにサーバー全体でパケットロスと遅延(ワープ・入力遅延)
- 症状
- ワープ, 引き戻し, 入力遅延
- 要因
- パケットロス, 遅延
- 誰に起きるか
- サーバー全体
- いつ
- 人が集中したとき
- 担当
- 主担当 インフラチーム・サーバーインフラ
- インフラチームの対応
- RSS(NICが分散)・RPS(カーネルが分散)の設定、割り込みを複数のコアに分散、UDPはポートまで見てキューを分けるよう設定(ethtool -Nのrx-flow-hash udp4 sdfn)、割り込み処理のコアとゲームのティックスレッドのコアを分離、コアごとの%softを監視。
- 数値の目安
- 1つのコアがカーネル経由で処理できる量は、パケットサイズと設定によっておおよそ毎秒数十万パケットです。コアごとの使用率で、受信処理の割合(mpstatの%soft)が1つのコアにだけ偏っていればこのケースです。
- グラフでは
- 上限で頭打ち · コアごとの%soft、毎秒の受信パケット数
- 確認箇所
- mpstat -P ALL 1でコアごとの%soft(ソフトウェア割り込み処理の割合)を確認し、/proc/interruptsでNICのキューごとの割り込みがどのコアに行っているか、ethtool -lでキュー数、ethtool -Sでキューごとのパケット数(名前はドライバーごとに異なる)を確認
- 該当する場合
- 1つのコアだけ%softが100%近くに張り付き、残りは空いていて、割り込みとパケットが1つのキューに集中。そこから毎秒の受信パケット数がそれ以上上がらない
- 該当しない場合
- %softが複数のコアに均等に分散していればこの原因ではない。CPUは空いているのにパケットロスがあれば「クラウドのPPS上限超過」か「リングバッファ不足」
- 確認手段
- インフラのツールで確認(ゲームコード不要)
- もっと詳しく
- キューが複数あっても、ゲートウェイ・プロキシのように少数のアドレスからトラフィックの大半が来ると、1つのキューに集中します。UDPはNICのデフォルト設定がアドレスだけを見てキューを分けることがあり、ポートまで見るように変えないと均等に分散しません。
出典
- Scaling in the Linux Networking Stack Linux kernel
RSS(NICが複数の受信キューに分散)・RPS(カーネルが分散)、キューごとに割り込みを分けて複数のコアに振り分ける設定、受信割り込みの処理がボトルネックならRSSを推奨 - How to receive a million packets per second Cloudflare
1つの受信キューが1つのコアにだけ行くと、そのコアが毎秒約35万〜43万パケットで頭打ちになった測定、NICがUDPをIPアドレスだけでハッシュして1つのキューに集中した事例 - ethtool(8) — Linux manual page ethtool
ethtool -N rx-flow-hash udp4でUDPのハッシュにポート(f・n)まで含めるオプション - mpstat(1) — Linux manual page sysstat
%soft:CPUがソフトウェア割り込みの処理に使った時間の割合、-P ALLでコアごと
あわせて読みたい原因
同じ層:L6 サーバーのネットワークカード
同じ症状(ワープ)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る