Linuxパフォーマンスの最適化(9)-カーネルバイパス

1.Linuxカーネルプロトコルスタックのパフォーマンスのボトルネック

x86アーキテクチャでは、データパケットを受信する従来の方法は、CPU割り込み方式です。つまり、ネットワークカードドライバがデータパケットを受信し、割り込みを介してCPUに通知して処理し、CPUがデータをコピーしてカーネルプロトコルスタックに配信します。データ量が多い場合、CPU割り込みモードではCPU割り込みが多数発生し、CPU負荷が高くなります。
Linuxパフォーマンスの最適化(9)-カーネルバイパス
(1)
ハードウェア割り込みによって引き起こされるスレッドとプロセスの切り替えハードウェア割り込み要求は、優先度の低いソフトウェア割り込みをプリエンプトします。ハードウェア割り込みとソフト割り込みが頻繁に発生するということは、スレッドの切り替えが頻繁に行われ、その後に動作モードの切り替えとコンテキストが続くことを意味します。スイッチング、スレッドスケジューラの負荷、キャッシュの欠落、マルチコアキャッシュの共有データ同期、競合ロックなどの一連のCPUパフォーマンスの低下。
(2)メモリコピー
ネットワークカードドライバはカーネルモードです。ネットワークドライバはデータパケットを受信した後、カーネルプロトコルスタックによって処理され、ユーザーモードでアプリケーションレイヤバッファにコピーされます。カーネルモードからユーザーモードへのデータコピーには時間がかかります。操作、データコピーの時間はデータパケット処理の時間の50%以上を占めます。
(3)マルチプロセッサプラットフォームのCPUドリフト。
データパケットはCPU0で中断される可能性があり、カーネルモード処理はCPU1、ユーザーモード処理はCPU2、複数の物理コア(Core)での処理は、多数のCPUキャッシュミスとローカリティを引き起こします。無効にします。NUMAアーキテクチャの場合、NUMAノード間でのメモリアクセスも発生し、CPUパフォーマンスに大きく影響します。
(4)キャッシュの無効化
従来のサーバーは主にページベースの仮想メモリを使用し、メモリページはデフォルトで4Kの小さなページに設定されています。より大きなストレージスペースを持つプロセッサには、多数のページマッピングアイテムがあります。同時に、TLBキャッシュスペースが限られているため、TLB高速テーブルのマッピング項目は最終的に頻繁に変更され、TLBミスが多数発生します。

2.カーネルバイパスの概要

1.カーネルバイパスの概要

カーネルバイパス(カーネルバイパス)は、Linuxカーネル(TCPIPプロトコルスタック)をバイパスするテクノロジです。Linuxカーネルサブシステムの機能を使用せず、独自に実装された同じ機能のコードを使用して、ユーザースペースからデバイスメモリを処理、直接アクセス、および制御します。デバイスからカーネルに、次にカーネルからユーザースペースにデータをコピーすることは避けてください。
カーネルバイパスは現在、DPDKやSolarFlareなどの主流の実装ソリューションです。

2.カーネルバイパスの利点

カーネルバイパステクノロジー自体は、高性能と低レイテンシー向けに設計されているため、最大の利点は、高性能と低レイテンシーです。

3.カーネルバイパスのデメリット

カーネルバイパステクノロジの欠点は次のとおりです。
(1)既存のオペレーティングシステムの動作モードが変更され、既存のオペレーティングシステムとの統合が困難です。
(2)ネットワークデータはカーネルネットワークプロトコルスタックを通過しないため、関連するネットワークアプリケーションは、オペレーティングシステムによって提供される機能を再実装する必要があります。
(3)オペレーティングシステムは関連するネットワークハードウェアを制御できないため、オペレーティングシステムによって提供されるネットワーク管理展開ツールは使用できなくなります。
(4)オペレーティングシステムカーネルによって提供されるセキュリティが破壊されます。コンテナシナリオでは、リソースの抽象化と分離は主にオペレーティングシステムカーネルによって提供されます。
(5)ネットワークパケットを排他的に処理するには、1つ以上のCPUコアを消費する必要があります。

三、DPDK

1.DPDKの概要

DPDK(Data Plane Development Kit)は、Intelが提供するデータプレーン開発ツールセットです。ネットワークアプリケーションでのデータパケットの高性能処理に重点を置いて、IntelArchitectureプロセッサアーキテクチャの下でユーザースペースで効率的なデータパケット処理を行うためのライブラリ機能とドライバサポートを提供します。
DPDKアプリケーションプログラムはユーザースペースで実行され、それ自体が提供するデータプレーンライブラリを使用してデータパケットを送受信し、データパケット処理のためにLinuxカーネルプロトコルスタックをバイパスします。Linuxカーネルは、DPDKアプリケーションを、コンパイル、リンク、および通常のプログラムのようなメソッドのロードを含む、通常のユーザーモードプロセスと見なします。DPDKプログラムの開始後は、メインスレッドは1つしか存在できません。次に、いくつかのサブスレッドを作成し、それらを指定されたCPUコアにバインドして実行します。
DPDK(Data Plane Development Kit)は、X86、ARM、Power PCハードウェアプラットフォームをサポートする、オープンソースの高速処理データプレーンデータパケット転送開発プラットフォームおよびインターフェイスです。
Intelは2010年にDPDKテクノロジーのオープンソースプロセスを開始し、2010年9月にBSDオープンソースライセンス契約を通じてソースコードソフトウェアパッケージを正式にリリースし、2014年4月にwww.dpdk.orgに独立したオープンソースコミュニティを正式に設立しました。プラットフォームは開発者にサポートを提供します。
DPDKは、環境抽象化レイヤー、カーネルバイパスプロトコルスタック、ポーリングモードでのメッセージの中断のない送受信、最適化されたメモリ/バッファ/キュー管理、ネットワークカードに基づくマルチキューおよびフロー認識を通じて、ユーザーモードの効率的なデータパケット処理ライブラリを提供します。負荷分散およびその他のテクノロジーにより、x86プロセッサアーキテクチャで高性能のメッセージ転送機能が実現されました。ユーザーは、Linuxユーザーモードでさまざまな高速転送アプリケーションを開発でき、さまざまな商用データプレーンアクセラレーションソリューションにも適しています。統合するために。
DPDKは、ネットワークカードドライバーをリロードして、データパケットの制御プレーンとデータプレーンを分離します。ドライバーは、データパケットの受信後にCPUに通知するためにハード割り込みを行うことはなくなりましたが、データパケットがカーネルバイパスプロトコルスタックを介してLinuxカーネルプロトコルスタックをバイパスできるようにします。また、ゼロコピーテクノロジーによってメモリに保存されたアプリケーションレイヤープログラムは、DPDKが提供するインターフェイスを介してデータパケットを読み取ることができます。
DPDKデータパケット処理モードは、CPUの中断時間とメモリのコピー時間を節約し、アプリケーション層にシンプルで効率的なデータパケット処理インターフェイス機能を提供して、ネットワークアプリケーションの開発をより便利にします。ただし、ネットワークカードドライバをリロードする必要があるため、DPDKは、Intelネットワーク処理チップを使用する一部のネットワークカードデバイスでのみ使用できます。DPDKでサポートされているネットワークカードのリスト:https://core.dpdk.org/supported/ 、主流はIntel 82599(光ポート)とIntel x540(電気ポート)を使用しています。DPDKは、パケット処理のパフォーマンスを最大10倍向上させることができます。単一のIntelXeonプロセッサで80Mbpsを超えるスループットを実現します。これは、デュアルプロセッサ構成で2倍にすることができます。
Linuxパフォーマンスの最適化(9)-カーネルバイパス

2.DPDKの原則

Linuxパフォーマンスの最適化(9)-カーネルバイパス

3.DPDKアーキテクチャ

Linuxパフォーマンスの最適化(9)-カーネルバイパス
Linuxカーネルでは、DPDKにはKNIとIGB_UIOの2つのモジュールがあります。ユーザーモードでは、主にコアライブラリ、プラットフォーム関連モジュール(プラットフォーム)、ネットワークカードポーリングモードドライバモジュール(PMD-)を含む複数のDPDKライブラリで構成されます。 Natives&Virtual)、QoSライブラリ、パケット転送分類アルゴリズム(Classify)など。ユーザーはDPDKライブラリを使用してアプリケーションを開発できます。

4、UIO

データパケットを送受信する従来の方法では、ネットワークカードは最初にLinuxカーネルプロトコルスタックに通知して、割り込みを介してデータパケットを処理します。カーネルプロトコルスタックは、最初にデータパケットの有効性をチェックし、次にデータパケットの宛先がネイティブであるかどうかを判断します。ソケット、条件が満たされると、データパケットのコピーがユーザーモードソケットに送信されて処理されます。
ネットワークカードドライバー(PMDドライバー)をユーザーモードで実行し、カーネルバイパスを実現するために、LinuxはUIO(ユーザースペースIO)メカニズムを提供します。UIOを使用して、読み取りを通じて割り込みを検知し、mmapを介してネットワークカードデバイスと通信します。
UIOは、ユーザーモードの一種のIOテクノロジーであり、DPDKがカーネルプロトコルスタックをバイパスしてユーザーモードのPMDドライバーサポートを提供するための基礎となります。DPDKアーキテクチャは、LinuxカーネルにIGB_UIO(igb_uio.koおよびkni.ko.IGB_UIO)モジュールをインストールします。これは、UIOテクノロジを使用して割り込みをインターセプトし、割り込みコールバック動作をリセットすることで、カーネルプロトコルスタックの後続の処理フローをバイパスします。IGB_UIOはカーネルの初期化の過程で、ネットワークカードのハードウェアレジスタはユーザーモードにマップされます。
UIOの実装メカニズムは、ファイルインターフェイスをユーザーモードに公開することです。UIOデバイスuioXを登録すると、システムファイル/ dev / uioXが表示されます。UIOデバイスファイルの読み取りと書き込みは、ネットワークカードデバイスメモリの読み取りと書き込みです。

5.DPDKの機能

(1)ポーリング:パケット処理中にコンテキスト切り替えを中断するオーバーヘッドを回避します。
(2)ユーザーモードドライブ:不要なメモリコピーとシステム呼び出しを回避し、迅速な反復最適化を促進します。
(3)親和性と排他性:特定のタスクを実行できます。特定のコアでのみ動作するように指定され、異なるコア間の頻繁なスレッド切り替えを回避し、より多くのキャッシュヒットを確保します
(4)メモリアクセスのオーバーヘッドを削減します:メモリの大きなページを使用してTLBミスを削減し、メモリマルチチャネルインターリーブアクセスを使用してメモリを増やします有効な帯域幅へのアクセス
(5)ソフトウェアの調整:キャッシュラインの調整、データのプリフェッチ、複数のデータバッチ操作

4、XDP

1.XDPの概要

XDP(eXpress Data Path)は、カーネルバイパス実装スキームではありません。カーネルバイパス実装とは完全に反対です。これは、eBPFに依存するカーネルコードインジェクションテクノロジであり、ネットワークパケットがカーネルプロトコルスタックに到達する前にフィルタリングまたは処理できます。 。XDPは、ネットワークプロトコルスタックの前にあるLinuxカーネルのネットワークパケット処理フローを配置します。ネットワークデータパケットを処理する場合、ネットワークハードウェアを制御するオペレーティングシステムの機能を維持しながら、ネットワークプロトコルスタックの複雑なフローを通過する必要はありません。
XDPは、近年開発されたSDNテクノロジであり、Linuxカーネルに完全に統合されており、現在も進化を続けています。
Linuxパフォーマンスの最適化(9)-カーネルバイパス

2.XDPネットワークデータ処理フロー

Linuxカーネルネットワークスタックは、iptablesファイアウォールによって設定されたルールに従ってデータパケットの処理(ドロップ、転送)を決定します。XDPはデータパケットがネットワークカードに到着するとすぐに破棄できるため、高速データトラフィックの処理に使用できます。
Linuxパフォーマンスの最適化(9)-カーネルバイパス

3.XDP構成

データパケットがネットワークカードに到着すると、カーネルネットワークスタックがバッファを割り当ててデータパケットの内容をsk_buff構造に格納する前に、XDPプログラムが実行され、ユーザーモード制御プレーンによってBPFマップに書き込まれたデータパケット処理ルールが読み取られます。パッケージは、データパケットを直接破棄する、データパケットを現在のネットワークカードに送り返す、データパケットを他のネットワークカードまたは上位層の仮想ネットワークカードに転送する(その後、データパケットを上位層のコンテナまたは仮想マシンに直接転送する)などの対応する操作を実行します。 、またはデータパケットをカーネルプロトコルスタックに渡してから、プロトコルスタックのレイヤーごとの分析を通じてユーザープログラムに送信するか、AF_XDP特殊ソケットを介してデータパケットを上位のアプリケーションプログラムに直接転送します。
Linuxパフォーマンスの最適化(9)-カーネルバイパス
XDPドライバーフック:ネットワークカードドライバー内のXDPプログラムのマウントポイント。ネットワークカードがデータパケットを受信するたびに、XDPプログラムが実行されます。XDPプログラムは、データパケットをレイヤーごとに解析したり、ルールに従ってフィルタリングしたり、データパケットを実行したりできます。カプセル化またはカプセル化
解除、フィールドを変更してデータパケットを転送するなど。eBPF仮想マシン:XDPプログラムはユーザーによって記述され、制限されたC言語で記述され、clangフロントエンドによってコンパイルされてBPFバイトコードが生成され、バイトコードがカーネルにロードされます。 eBPF仮想マシンで実行した後、仮想マシンはジャストインタイムコンパイルによってXDPバイトコードを低レベルのバイナリ命令にコンパイルします。eBPF仮想マシンはXDPプログラムの動的なロードとアンロードをサポートします。BPF
マップ(BPFマップ):キーと値のペアをユーザーとして保存します。カーネルモードプログラムとカーネルモードXDPプログラムおよびカーネルモードXDPプログラム間の通信媒体は、プロセス間通信の共有メモリアクセスに似ています。ユーザーモードプログラムは、BPFマッピングのルールを事前に定義でき、XDPプログラムはデータパケットへのマッピングのルールと一致します。フィルタリングなどを実行します。XDPプログラムはデータパケット統計をBPFマッピングに格納し、ユーザーモードプログラムはBPFマッピングにアクセスしてデータパケット統計を取得できます
。eBPFプログラムベリファイア:XDPバイトコードをカーネルにロードする前のBPFプログラムベリファイアループがあるかどうか、プログラムの長さが制限を超えているかどうか、プログラムのメモリアクセスが範囲外かどうか、プログラムに到達不能な命令が含まれているかどうかなど、バイトコードのセキュリティチェックを実行します。プログラムがカーネルにロードされる前にコードが静的に分析され、コードがクラッシュしたり、実行中のカーネルが損傷したりすることが確認されます。

4.XDPの利点

XDPの利点は次のとおりです。
(1)XDPはLinuxカーネルネットワークプロトコルスタックと統合され、カーネルはネットワークハードウェアを制御する機能を持ち、カーネルによって提供されるセキュリティを保持し、既存のネットワーク構成管理ツールを直接使用できます。
(2)Linuxドライバーを備えたネットワークカードはすべてXDPを使用でき、XDP実行フックポイントを追加するためにネットワークカードドライバーを更新するだけで済みます。DPDKには特別なハードウェアサポートが必要です。
(3)XDPは、ルーティングテーブルやTCPスタックなどのカーネルネットワークプロトコルスタックの機能を選択的に使用できます。これにより
、ユーザースペースからカーネルスペースにネットワークデータパケットを再注入することなく、カーネルネットワークプロトコルスタックに基づくプログラムと対話するときに、既存の構成インターフェイス(4)を保持しながら、重要なネットワークデータを高速化できます
(5)ホスト上で実行されているアプリケーションに対して透過的です。
(6)サービスを中断することなく動的な再プログラミングをサポートし、ネットワークを中断することなくXDPプログラムのホットアップグレードをサポートします。
(7)パケット処理に専用のCPUコアは必要ありません。トラフィックが少ないと、CPUの使用量が少なくなり、それに応じて効率が向上し、電力が節約されます。

5.XDPの使用シナリオ

XDPの使用シナリオには、次のものが含まれます。
(1)DDoS防御
(2)ファイアウォール
(3)XDP_TXに基づく負荷分散
(4)ネットワーク統計
(5)複雑なネットワークサンプリング
(6)高速取引プラットフォーム

五、ソーラーフレア

1.ソーラーフレアの紹介

SolarflareネットワークカードはOpenOnloadネットワークカードアクセラレータをサポートしています。カーネルバイパスの実装スキームは次のとおりです。ユーザースペースにネットワークプロトコルスタックを実装し、LD_PRELOADを使用してターゲットプログラムのネットワークシステム呼び出しをカバーし、下部のネットワークカードにアクセスするときにEF_VIライブラリに依存します。
Solarflareネットワークカードは、3レベルのカーネルバイパス実装ソリューションを提供します。Onloadでは、ユーザーがコードを変更する必要はありません。ネットワークカードドライバーをインストールした後、プログラムは、シンプルで使いやすいonloadライブラリで開始できます。tcpdirectはonloadよりも高速ですが、ユーザーがコードを変更する必要があります。 ef_viは、すべてのプロトコルスタックをスキップし、ネットワークカードの特定のRXキューを直接読み取ります。
ソーラーフレア製品は、高性能で低レイテンシの機能を備えた株式および先物の高周波取引ハードウェア市場の90%を占めています。ソーラーフレアX2522と低レイテンシの光ファイバネットワークカードは、金融証券および先物の高周波取引で広く使用されており、価格は20,000RMBを超えます。現在、Solarflareの最新製品は、X2552、X2541、およびX2562超低遅延ネットワークカードです。

2、オンロード

Onloadは、Solarflareの最も古典的なカーネルバイパスネットワークプロトコルスタックです。これは透過的なカーネルバイパスであり、ソケットネットワークプログラミングと互換性のあるインターフェイスを提供します。ユーザーは独自のコードを変更する必要はなく、プログラムを開始する前にlibonload.soをプリロードするだけです。

3、ef_vi

ef_viは、生のイーサネットフレームを送受信できるレベル2の低レベルAPIですが、上位レベルのプロトコルはサポートしていません。ef_viの最大の機能はゼロコピーです。ユーザーはef_viで使用するためにいくつかのrecvバッファーを事前に割り当てる必要があります。ネットワークカードがパケットを受信すると、バッファーを直接書き込みます。ユーザーは、eventqポーリングインターフェイスを介して入力されたデータのバッファーIDを取得することにより、受信データの処理を開始できます。 、および処理後にリサイクルするためにバッファをef_viに戻します。
ef_vi APIは使用がより複雑で、上位層のプロトコルサポートがありませんが、最高のパフォーマンスを提供できます。

4、tcpdirect

tcpdirectは、ef_viに基づいて上位層のネットワークプロトコルスタックを実装し、ソケットのようなAPI:zocketを提供します。これにより、ユーザーはtcp / udpペイロードデータの読み取りと書き込みが可能になり、ef_viゼロコピーの特性も継承されます。tcpdirectでは、巨大なページを使用する必要があります。

おすすめ

転載: blog.51cto.com/9291927/2594168