新しいAPI

New API ( NAPIとも呼ばれる)は、 Linuxカーネル内のネットワークデバイスにおける割り込み軽減技術を利用するためのインターフェースです。このアプローチは、パケット受信のオーバーヘッドを削減することを目的としています。その目的は、受信メッセージの処理を、一度に処理する価値があるほど十分な量になるまで延期することです。

モチベーション

ネットワークドライバを実装する最も簡単な方法は、受信パケットごとに割り込み要求(IRQ)を発行してカーネルに割り込むことです。しかし、IRQの処理にはプロセッサリソースと時間の面で大きな負担がかかります。そのため、この単純な実装は高速ネットワークでは非常に非効率になり、毎秒数千ものパケットがカーネルに絶えず割り込むことになります。その結果、システム全体のパフォーマンスとネットワークスループットが低下する可能性があります。

ポーリングは、割り込みベースの処理の代替手段です。カーネルは、割り込みを受けることなく、定期的にネットワークパケットの到着を確認できるため、割り込み処理のオーバーヘッドを削減できます。ただし、最適なポーリング頻度を設定することが重要です。ポーリング頻度が高すぎると、まだ到着していない受信パケットを繰り返し確認することになり、CPUリソースを浪費します。一方、ポーリング頻度が低すぎると、受信パケットに対するシステムの反応性が低下し、遅延が発生します。また、受信パケットバッファが処理前にいっぱいになると、パケットが失われる可能性があります。

妥協案として、Linux カーネルはデフォルトで割り込み駆動モードを使用し、着信パケットのフローがネットワーク インターフェイスの「重み」と呼ばれる特定のしきい値を超えた場合にのみポーリング モードに切り替えます。

準拠ドライバー

NAPI インターフェイスを使用するドライバーは次のように動作します。

  • パケット受信割り込みは無効です。
  • ドライバはカーネルにポーリングメソッドを提供します。このメソッドは、ネットワークカードまたはDMAリング上の利用可能なすべての受信パケットを取得し、カーネルで処理できるようにします。
  • 許可されると、カーネルはデバイス ポーリング メソッドを呼び出して、一度に多数のパケットを処理できるようになります。

利点

  • カーネルがポーリングする必要があるにもかかわらず、割り込みによって発生する負荷は軽減されます。
  • パケットが並べ替えられる可能性は低くなりますが、順序どおりに処理されないパケットはボトルネックになる可能性があります。
  • カーネルがすべての受信パケットを処理できない場合、カーネルはそれらを破棄するために何の作業も行う必要がありません。それらのパケットは、ネットワークカードの受信リングバッファ内で単に上書きされるだけです。NAPIがない場合、カーネルは処理時間の有無にかかわらず、すべての受信パケットを処理する必要があり、これがスラッシングにつながります。

歴史

NAPIは、Alexey Kuznetsov、Jamal Hadi Salim、Robert Olssonによる3年以上にわたる取り組みでした。NAPIを組み込むための当初の取り組みは、コミュニティの一部メンバーから抵抗に遭いましたが、David MillerはNAPIの組み込みを確実にするために尽力しました。

ウプサラ大学のネットワークでは、導入前に多くの実環境テストが実施されました。実際、www.slu.se はNAPIベースの最初の実稼働OSであり、現在もNAPIベースのBifrost/Linuxルーターで稼働しています。pktgenトラフィックジェネレータもこの頃に誕生しました。pktgenは、実環境のトラフィックを想定せずにNAPIシナリオをテストするために広く利用されました。

参考文献

さらに読む