Linux ネットワーク上の SoftIRQ と高速パケット処理

Linux ネットワーク上の SoftIRQ と高速パケット処理

金融市場データを受信するときに、Linux のパフォーマンス チューニングによってパケット処理時間を最速にする方法を読んでいます。NIC がパケットを受信すると、DMA 経由でメモリに格納し、次に HardIRQ を発生させます。次に、これが NAPI 設定の一部を設定し、SoftIRQ を発生させます。次に、SoftIRQ は NAPI/デバイス ドライバーを使用して、ポーリング経由で RX バッファーからデータを読み取りますが、これは限られた時間 (net.core.netdev_budget、デフォルトは 300 パケット) のみ実行されます。これらは、solarflare NIC を搭載した ubuntu を実行する実際のサーバーに関するものです。質問は次のとおりです。

  1. 各 HardIRQ が SoftIRQ を発生させ、デバイス ドライバーが 1 回で複数のパケットを読み取る場合 (netdev_budget)、1 回で RX バッファーから排出された各パケットによって発生した SoftIRQ はどうなりますか (受信した各パックはハード IRQ を発生させ、次にソフト IRQ を発生させます)。これらはキューに入れられますか。

  2. NAPI が RX_buffer を空にするためにポーリングを使用するのはなぜですか? システムは SoftIRQ を生成し、RX バッファを読み取っているところですが、なぜポーリングを使用するのですか?

  3. おそらく、softirq による RX_Buffer のドレインは、1 つの特定の RX_Buffer からのみ発生し、複数の RX_Buffer にわたっては発生しないのでしょうか? その場合、netdev_budget を増やすと、他の RX_buffer の処理/ドレインが遅れる可能性がありますか? または、異なるコアに異なる RX_buffer を割り当てることで、これを軽減できますか?

  4. HardIRQ がすぐに発生して処理されるようにするための設定があります。ただし、SoftIRQ は後で処理される場合があります。ネットワーク RX に関連する SoftIRQ も最優先で遅延なく処理されるようにするための設定/構成はありますか?

答え1

4番目の質問に対する回答については、

はい、ネットワーク NIC カードは、softirq に関連付けられた周辺機器です。softirq は、すべてのボトムハーフ メカニズムの中で最も優先度が高いためです。

そのため、後でパケットのドロップにつながる可能性のある遅延を禁止するために、ソフトIRQが使用されます。

基本的に、NAPI メカニズムは、何らかの理由によりカーネルが割り込みメカニズムで処理できない速度のパケットを処理することも目的としています。

LDD3 のネットワーク ドライバーの章を参照することをお勧めします。ここ同じことに役立つリンクです。

関連情報