FDによる超高速カーネルバイパスネットワークIOとVPP.


この記事はもともと私の個人的なブログ
このブログでは、高速で柔軟でオープンソースのネットワークフォワーディングプレーンのVPPを見ます.あなたはパフォーマンスの数字で吹き飛ばされると思います.
ここ数年にわたって、私はユーザランド、カーネルバイパスネットワークの様々な風味を実験しました.この記事ではfdを取ります.スピンのためのIO
私たちは、結果を結果と比較します.そして、我々がどれくらいVALIRA Linuxカーネルが転送(ルーティング)パケットに関してすることができるかについて見ました.Linuxでは、14 MPPSを達成するために、一方向と双方向のテストのためにおよそ16と26のコアが必要だった.この記事では、fdでこれを達成するために必要なものを見ていきます.io

userlandネットワーキングの原則は、ネットワークスタックがもはやカーネルによって扱われないということです、しかし、代わりにuserlandプログラムによって.Linuxカーネルは信じられないほど豊富な機能ですが、高速ネットワークのためには、すべての(割り込み)割り込みに対処するために多くのコアが必要です.ユーザーランドネットワークプロジェクトのいくつかは、信じられないほどの数を達成するためにDPDKに依存します.DPDKがとても速い理由の一つは割り込みに依存しないことです.代わりに、それはpollモードドライバです.それがNICからパケットを拾う100 %で連続的に回転することを意味します.典型的なサーバは、最近ではかなりの数のCPUコアが付属しており、NICのパケットを選ぶための一つ以上のコアを捧げることは、場合によっては全く価値がある.特に、サーバーがネットワークトラフィックの多くを処理する必要がある場合.
したがって、DPDKは効率的で、非常に速く、パケットを送受信する能力を私たちに提供します.しかし、それもです!カーネルを使用していないので、DPDKからパケットを受け取り、何かを行うプログラムが必要です.例えば、仮想スイッチまたはルータのように.

CHECOが開発したオープンソースソフトウェアデータプレーン.fdの中心でIOはベクトルパケット処理(VPP)と呼ばれるものです.

VPPプラットフォームは、スイッチング機能およびルーティング機能を提供する75457915アンペアである.VPPは'パケット処理グラフ'に組み込まれていますこのモジュラーアプローチは、誰でも'プラグイン'新しいグラフノードを意味します.これにより、拡張性がかなり簡単になり、プラグインが特定の目的でカスタマイズできることを意味します.
fd.IOはNPDMのためのドライバとしてDPDKを使用することができます、そして、コモディティCPUで動くことができる高いパフォーマーレートでパケットを処理することができます.それは完全に機能したルータではないことを覚えておくことは重要です.代わりに、それはフォワーディングエンジンです.ポートとしてNICとDPDKドライバでルータラインカードと考えてください.VPPは私たちが1つのNICから別のNICにパケットを取るのを許します、必要に応じてそれを変えて、テーブルルックアップをして、再びそれを送ってください.APIを使用すると、フォワーディングテーブルを操作できます.またはCLIを使用して、例えば静的なルート、VLAN、VRFのものを構成することができます.

私は以前のテストと同じテストセットアップを使います.再びN 2を使用.Xlarge.パケットからのx 86サーバ.COMと当社のDPDKトラフィックジェネレータ.設定は以下の通りです.

fdからVPPコードを使います.IOマスターブランチをインストールし、それをインストールします.

今私たちのテストのセットアップを行く準備ができて、それは我々のテストを開始する時間です!
起動するには、“vppctl”でこのようにVPPを設定しました.ARPに対してパケットジェネレータが応答しないので、静的なARPエントリを設定する必要があることに注意してください.

それだ!かなり簡単な右?
OK、私たちは1つのフローテストをした前に同じように結果を見て、両方の一方向と双方向だけでなく、10000フローテスト.

それらはいくつかの注目すべき数値です!単一の流れで、VPPは8 mppsに関して処理して、前進することができます.10000フローでおそらくより現実的なテストは、ちょうど2つのコアと14 MPPSを扱うことができることを示しています.NICが両方のNICが送って、ライン・レート(NICにつき28 mpps)で受信している完全な双方向シナリオを得るために、我々は3つのコアと3つの受信待ち行列をNICに必要とします.Linuxでこの最後のシナリオを達成するために、私たちはおよそ26のコアを必要としました.悪くない、悪いことではない!



私の以前のブログでは、iptablesを使ってLinuxでsnatを行うとき、私たちは方向につき約29 CPUを必要とする方向につき3 mppsの高さになりました.これは、パケットの書き換えは、転送よりもかなり高価です.VPPがNATを行う方法を見てみましょう.
NATをVPPで有効にするには、次のコマンドを使いました.

私の最初のテストは1つの方向だけで1つの流れです.それで、4.3 mppsを得ることができます.それは、我々がNATなしでパフォーマンステストで見たもののちょうど半分です.これは、追加の作業が必要なので、これは遅い驚きです.Linux iptablesでは1.1 mppsを見ていました.
NATのための単一の流れは、あなたが多くの源を翻訳している現実のNAT例のスーパー代表でありません.次の測定では、異なるポート番号と同様に255の異なるIPアドレスと255の宛先IPアドレスを使用していますこのセットアップで、NATコードは16 Kセッションを見ています.私は、現在、数字が3.2 mppsに行くのを見ることができます;より多くの流れは、より多くのNAT仕事を意味します.興味深いことに、この数はiptablesで見たのと全く同じです.しかし、1台の大きな違いがあります.iptablesでは、システムは約29コアを使用していました.このテストでは、私は2つのコアを使用しています.それは労働者の数が少ないと私はキャップされている理由.そのキャップを取り除くために、私はより多くのコアを加えて、VPPコードが水平にスケールすると確認しました.最終的に、安定した経験のために14 mppsを走らせるのに12芯が必要です.

NATテスト結果によるVPP転送
VPPで使用されるコア数を制御するための関連するVPP設定です.また、私はカーネルがVPPに割り当てられたコアを分離して、カーネルが何かをスケジュールしないように注意しなければなりません.


このブログでは、FDからVPPを見ました.ユーザランド転送エンジンとしてのIOプロジェクトVPPはパケットを処理するためのカーネルバイパス方法の一例です.それは密接に動作し、さらにDPDKを拡張する.

VPPコードは特にカーネルバイパスパケットフォワーダに対して、45457915円であることがわかりました.ほとんどすべての、それはクレイジークレイジーです.
両方の方向に2つのNICSフォワードフルラインレート(14 MPPS)を持つために、我々はちょうど3つの芯を必要とします.それは26コアを必要とするLinuxカーネルと比較して、パフォーマンスのほぼ9倍の増加を見ます.
natを使用した場合,結果は良好であることがわかった.Linuxでは、私は約29のコアを必要とする3.2 mppsより高い得ることができませんでした.VPPで、我々はちょうど2つの芯で3.2 MPPSをすることができて、12芯で完全な線速度NATに着きます.
fdと思います.ioはおもしろいし、エキサイティングなプロジェクトです.そして、私はそれがより広く使用されていないことを少し驚いています.理由の1つは、学習曲線のビットがある可能性があります.しかし、あなたが高性能パケット推進を必要とするならば、それは確かに探検する何かです!おそらく、これはあなたのVPPプロジェクトの始まりですか?もしそうなら!
歓声
-アンドレ