# ネットワーク割り込み合体とCPUスケーリング ## 定義 ネットワークデバイスドライバは、到着したパケットごとにカーネルへ割り込むのではなく、一定数のパケットが到着したとき、またはタイマー割り込みに基づくポーリングでまとめて処理する割り込み一体化(Interrupt Coalescing)を行う。これによりレイテンシは若干高くなるが、カーネルがNICと通信する頻度が下がりバッファリングされるデータが大きくなってスループットが上がる。LinuxカーネルはNAPI(new API)フレームワークを使い、パケット率が低いときは割り込み、高いときは割り込みを無効化してポーリングに切り替える。NAPIはパケットのスロットリング(早期ドロップによるパケットストーム対策)、インターフェーススケジューリング(クォータによる公平性保証)、SO_BUSY_POLLソケットオプション(ユーザーレベルのビジーウェイトによる受信レイテンシ低減)もサポートする。仮想マシンネットワーキングでは割り込み一体化が特に重要であり、AWS EC2のenaドライバも採用している。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 10 ネットワーク]] §10.4.3.6) 複数CPUへのパケット処理分散には、ハードウェアハッシングで複数キューへパケットを振り分けるRSS(Receive Side Scaling)、複数キューを持たないNIC向けにRSSをソフトウェアで実装したRPS(Receive Packet Steering)、最後にソケットを処理したCPUへのアフィニティを考慮しCPUキャッシュヒット率を上げるRFS(Receive Flow Steering)、RFSをハードウェアで実現するARFS(Accelerated RFS)、複数送信キューを持つNIC向けのXPS(Transmit Packet Steering)という手法がある。ロードバランシングがなければNICは単一CPUだけに割り込み、その CPUの使用率が100%に達してボトルネックになる危険がある。(Source: [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 10 ネットワーク]] §10.4.3.8) ## 横断的知見 (このconceptは現時点で単一ソース(詳解 システム・パフォーマンス 第2版 第10章)のみに基づく。複数ソースの突き合わせで見えた観察が蓄積されるまでは、本節は空のまま育てていく。) ## 未解決の問い - RSS/RPS/RFS/ARFS/XPSはそれぞれ異なるNICハードウェア要件を前提とするが、クラウド環境の仮想NIC(ena等)ではどの機構が実際に利用可能か。本章はAWS ena がinterrupt coalescingを使う点のみに触れ、RSS等の対応状況には触れていない。 - irqbalanceプロセスとRFSは同じ目的(CPU割り込みマッピングの最適化)を持つとされるが、両者を併用した場合の優先順位や競合はどうなるか。 - NAPIのポーリングモードへの切り替わりが発生する具体的なパケット率のしきい値は、ドライバ・NIC世代によってどの程度異なるか。 ## 関連 - [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 10 ネットワーク]] — NICでの送受信(§10.4.3.7)、割り込み一体化とNAPI(§10.4.3.6)、CPUのスケーリング(§10.4.3.8)。 - [[詳解 システム・パフォーマンス 第2版]] ## 出典 - [[@2023__OReillyJapan__詳解 システム・パフォーマンス 第2版 - Chapter 10 ネットワーク]] §10.4.3.6, §10.4.3.7, §10.4.3.8