金融市場データを受信したときに最速のパケット処理時間を得るために、Linuxパフォーマンスチューニングについて読みました。 NICがパケットを受信すると、DMAを介してメモリに入れられ、HardIRQが発生します。これにより、いくつかのNAPI設定が設定され、SoftIRQが発生します。その後、SoftIRQはNAPI /デバイスドライバを使用してポーリングを介してRXバッファからデータを読み込みます。ただし、これは限られた時間だけ実行されます(net.core.netdev_budget、デフォルトは300パケット)。これは、Solarflare NICを使用してUbuntuを実行している物理サーバー用です。私の質問は次のとおりです。
SoftIRQがHardIRQごとに発生し、デバイスドライバが一度に複数のパケットを読み取る場合(netdev_budget)、RXバッファから排出されたすべてのパケットに対して一度に発生したSoftIRQはどうなりますか(受信した各パケットはハードIRQを生成します)。ソフトIRQ)?これは全部並んでいるの?
NAPIがポーリングを使用してRX_bufferを消費するのはなぜですか?システムがSoftIRQを生成してRXバッファを読み込んでいるのに、なぜポーリングを行うのですか?
おそらくSoftirqによるRX_Bufferの枯渇は、複数のRX_Bufferではなく特定のRX_Buffer 1つでのみ発生しますか?それでは、netdev_budgetを増やすと、他のRX_buffersの処理/消耗が遅くなりますか?それとも、別のRX_bufferを別のコアに割り当てることでこれを軽減できますか?
HardIRQがすぐに発生して処理されるようにする設定があります。ただし、SoftIRQは後で処理できます。ネットワークRXに関連するSoftIRQも、遅延なしで最高の優先順位で処理されるように設定/構成がありますか?
答え1
4番目の質問に対する回答に関して、
はい、ネットワークカードはソフト割り込みに関連する周辺機器です。ソフト割り込みは、すべてのサブメカニズムの中で最も高い優先順位を持つためです。
したがって、その後のパケット損失につながる可能性がある遅延を防ぐためにSoftirqが使用されます。
デフォルトでは、NAPIメカニズムは、何らかの理由で割り込みメカニズムを使用するカーネルで処理できない速度でパケットを処理するように設計されています。
LDD3のネットワークドライバの章に直接移動することをお勧めします。こここれへの便利なリンクです。