NAPI対適応割り込み


12

ネットワーク負荷が高い場合の割り込みオーバーヘッドを軽減するために、次の2つの技術がどのように使用されているのか説明してください。

  1. Adaptive-rx / Adaptive-tx、および
  2. NAPI;

Linuxカーネルソースレベルにより近い違いを説明する答えをいただければ幸いです。また、〜400Mbpsの負荷でNICにポーリング/割り込み合体モードを強制する方法を聞きたいです。

より多くの背景:

問題は、bnx2およびe1000ドライバーが「ethtool -C adaptive-rx on」コマンドを無視することです。これはおそらく、これらのドライバーが適応割り込みをサポートしていないためです。Broadcomプログラマーのリファレンスマニュアルには、この機能はBCM5709 NICハードウェアでサポートされるべきであると書かれていますが。

そこで、NAPIを試し、netif_napi_add()関数呼び出しで重みを64から16に減らして、はるかに低い負荷でNICをポーリングモードに強制することにしましたが、残念ながらうまくいきませんでした。NAPIはNICで特別なハードウェアサポートを必要としないと思いますが、それは正しいですか?

私が使用しているハードウェアはBCM5709 NIC(bnx2ドライバーを使用)です。OSはUbuntu 10.04です。CPUはXEON 5620です。

回答:


18

割り込みモデレーションの背後にある主な原則は、受信フレームごとに1つ未満の割り込み(または送信フレーム完了ごとに1つの割り込み)を生成し、割り込みを処理するときに発生するOSオーバーヘッドを削減することです。BCM5709コントローラーは、割り込みを合体させるためにハードウェアでいくつかの方法をサポートしています。

  • Xフレーム(ethtoolのrxフレーム)を受信した後に割り込みを生成します
  • X usecs(ethtoolのrx-usecs)の後にフレームが受信されなくなったときに割り込みを生成する

これらのハードウェアメソッドの使用に関する問題は、スループットまたはレイテンシを最適化するためにそれらを選択する必要があることです。両方を使用することはできません。受信フレーム(rx-frames = 1)ごとに1つの割り込みを生成すると、レイテンシは最小になりますが、割り込みサービスのオーバーヘッドの観点からは高コストになります。より大きな値(たとえばrx-frames = 10)を設定すると、受信した10フレームごとに1つの割り込みのみを生成することで消費されるCPUサイクル数が減少しますが、その10のグループの最初のフレームのレイテンシーが高くなります。

NAPI実装は、トラフィックが束になるという事実を活用しようとするため、受信した最初のフレームですぐに割り込みを生成し、すぐにポーリングモードに切り替えます(つまり、割り込みを無効にします)。いくつかのフレーム(質問では16または64)または一定の時間間隔をポーリングした後、ドライバーは割り込みを再度有効にし、最初からやり直します。

予測可能なワークロードがある場合は、上記のいずれか(NAPI、rx-frames、rx-usecs)に対して固定値を選択できます。これにより、適切なトレードオフが得られますが、ほとんどのワークロードは異なり、最終的には犠牲になります。これが、adaptive-rx / adaptive-txの出番です。ドライバーが常にワークロード(1秒あたりの受信フレーム数、フレームサイズなど)を監視し、ハードウェア割り込みの合体スキームを調整して、トラフィックの少ない状況でのレイテンシを最適化するか、トラフィックの多い状況でスループットを最適化するという考え方があります。これはクールな理論ですが、実際に実装するのは難しいかもしれません。少数のドライバーのみがそれを実装し(http://fxr.watson.org/fxr/search?v=linux-2.6&string=use_adaptive_rx_coalesceを参照)、bnx2 / e1000ドライバーはそのリストにありません。

各ethtool合体フィールドがどのように機能するかについての適切な説明については、次のアドレスでethtool_coalesce構造の定義を参照してください。

http://fxr.watson.org/fxr/source/include/linux/ethtool.h?v=linux-2.6#L111

特定の状況(〜400Mb / sスループット)の場合、ワークロードに最適な設定のためにrx-framesとrx-usecsの値を調整することをお勧めします。ISRのオーバーヘッドと、レイテンシーに対するアプリケーション(httpd?など)の感度の両方を確認してください。

デイブ


1
あなたは「と言ったNAPIの実装の試みは非常にあなたがいることを、トラフィックが房に来ているという事実を活用するために受信した最初のフレームにすぐに割り込みを生成し、その後、あなたはすぐにポーリングモードに切り替えます」。しかし、ウィキでいることを言わなかった一定時間毎に、NAPIは、ハードウェア割り込みを使用していませんでしたが、世論調査en.wikipedia.org/wiki/New_APIは正確な引用:「カーネルができ、定期的にチェックし、着信ネットワークパケットの到着を中断させずに、これにより割り込み処理のオーバーヘッドがなくなります。」真実はどこですか?
アレックス

1
@Alexハードウェア割り込みを使用して、受信するトラフィックがあることをカーネルに通知する必要あります。「古いスタイル」の割り込みハンドラは、パケットの受信をスケジュールし、割り込みを再度有効にします。NAPI割り込みハンドラーは、割り込みを無効にし、ポーラーをスケジュールし、割り込みを再度有効にします。ポーラーは、一定量のパケットに対してパケット受信を実行します。ポーラーが処理し続けるトラフィックがある限り、常にトラフィックをNICから引き出すことでハード割り込みを防止することを目的としています。トラフィックが停止すると、ポーラーは終了し、システムは割り込みの待機に戻ります。
suprjami
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.