Linux ネットワーク パフォーマンスの王様、XDP テクノロジーについて話しましょう
皆さん、こんにちは。今日はいくつかの写真を通して XDP テクノロジーについて説明します。
多くの Linux 開発者、特にネットワーク関連の開発に従事している開発者は、XDP テクノロジに馴染みがないかもしれません。 Linux 開発者で XDP テクノロジを知らない場合は、多くの機会を逃す可能性があります。
私はかつて XDP テクノロジーを適用してプロジェクトを最適化し、ネットワーク処理パフォーマンスを 3 ~ 4 倍向上させることに成功しました。プロジェクトの元々のパフォーマンスが低いため、改善の余地が非常に大きいと考える人もいるかもしれません。
現在のソフトウェア アーキテクチャでは、最適化をさらに進めたとしても、パフォーマンスのボトルネックを解消するのは簡単ではないと思います。より包括的な観点からこの問題を解決するには、より効率的なアーキテクチャを採用する必要があります。
私のフォローアップ プロジェクト Magic Box も XDP テクノロジを使用する予定です。XDP テクノロジの使用後、Magic Box のネットワーク パフォーマンスは約 3 倍向上すると推定されています。
1. XDP テクノロジーの概要
1.1 XDP の技術的背景
超高帯域幅ネットワーク技術 10G、40G、および 100G ネットワークの出現により、Linux カーネル プロトコル スタックは新しいネットワーク技術の開発にますます適応できなくなり、ボトルネックになっているようです。この厄介な状況を解決するために、Linux カーネルは、カーネル バイパス テクノロジという新しいテクノロジを導入しました。カーネル バイパス テクノロジの中心的な考え方は、ネットワーク データ パケットがカーネル プロトコル スタックをスキップし、ユーザー プログラムによって直接処理されるため、カーネルが不要になります。 プロトコル スタックのオーバーヘッドにより、ネットワーク パフォーマンスが大幅に向上します。
XDP は Linux 固有のカーネル バイパス テクノロジであり、DPDK テクノロジに対応します。 DPDK はパフォーマンスの点では優れていますが、Linux システムには完全には適していません。
1.2 XDP とは何ですか?
XDP は、eBPF メカニズムを使用してカーネル空間での高性能のパケット処理と転送を実現する Linux カーネル テクノロジです。
XDP はネットワーク パフォーマンスを大幅に向上させ、ユーザーがカスタマイズされたさまざまなネットワーク機能を実装できる柔軟なプログラミング インターフェイスを提供します。従来のユーザー空間のパケット処理と比較して、XDP はパケット処理の遅延と CPU 使用率を効果的に削減できます。
XDP テクノロジー動作モード:
ネイティブ モード (高パフォーマンス、ネットワーク カードのサポートが必要) ドライバー モードでは、ネットワーク カード ドライバーで XDP プログラムを実行し、ネットワーク カード ドライバーからのネットワーク データ パケットをリダイレクトします。このモードは、より多くのネットワーク カードをサポートし、高いパフォーマンスを発揮します。ネットワーク カードがサポートしている場合は、このモードを使用してみてください。
アンインストール モード (最高のパフォーマンス、最低サポートのネットワーク カード) は、XDP プログラムをネットワーク カードに直接アンインストールします。このモードではサポートされるネットワーク カードが少ないため、ここでは説明しません。
ユニバーサル モード (優れたパフォーマンス、最高の Linux カーネル サポート) XDP プログラムは Linux カーネル プロトコル スタックの入り口で実行され、ドライバーのサポートは必要ありません。また、パフォーマンスは他の 2 つのモードよりも低くなります。システム パフォーマンスは次のように改善されました。ある程度。
XDP テクノロジーについては将来特別なトピックが登場する予定ですが、ここでは説明しません。
2. AF_XDP の動作原理
2.1 全体的なアーキテクチャ
多くの学生は、XDP と AF_XDP テクノロジーを簡単に混同します。
- XDP テクノロジーは、BPF テクノロジーをベースにした新しいネットワーク テクノロジーです。
- AF_XDP は、XDP テクノロジーのアプリケーション シナリオであり、高性能 Linux ソケットです。
AF_XDP はソケット関数を通じて作成する必要があります。
リーリーAF_XDP テクノロジーには、いくつかの重要な知識ポイントが含まれます:
###写真###AF_XDP では、ネットワーク データ パケットの送受信を完了するために XDP プログラムの協力が必要です。
- XDP プログラムの主な仕事は、MAC アドレス、5 倍の情報などのイーサネット フレームの関連情報に基づいてデータ パケットをフィルタリングし、リダイレクトすることです。
- AF_XDP はイーサネット データ フレームを処理するため、ユーザー プログラムはイーサネット データ フレームを送受信します。
- ユーザープログラムAF_XDP、XDPはUMEMと呼ばれる共有メモリ領域を操作します。
- ネットワーク データ パケットの送受信には、4 つのロックフリー リング キューを使用する必要があります。
2.2 UMEM 共有メモリ UMEM 共有メモリは、setsockopt 関数を通じて適用されます。
リーリーUMEM 共有メモリは通常 1 ユニットとして 4K で、各ユニットはデータ パケットを保存できます。UMEM 共有メモリは通常 4096 ユニットです。
送受信されたデータ パケットは UMEM メモリ ユニットに保存されます。
ユーザープログラムもカーネルもこのメモリ領域を直接操作できるため、データパケットの送受信時には単純なメモリコピーのみでシステムコールは必要ありません。
用户程序需要维护一个UMEM内存使用记录,记录每一个UMEM单元是否已被使用,每个记录都会有一个相对地址,用于定位UMEM内存单元地址。
2.2 无锁环形队列
AF_XDP socket总共有4个无锁环形队列,分别为:
- 填充队列(FILL RING)
- 已完成队列(COMPLETION RING)
- 发送队列(TX RING)
- 接收队列(RX RING)
图片
环形队列创建方式:
//创建FILL RINGsetsockopt(fd, SOL_XDP, XDP_UMEM_FILL_RING,&umem->config.fill_size, sizeof(umem->config.fill_size)); //创建COMPLETION RINGsetsockopt(fd, SOL_XDP, XDP_UMEM_COMPLETION_RING,&umem->config.comp_size, sizeof(umem->config.comp_size));//创建RX RING setsockopt(xsk->fd, SOL_XDP, XDP_RX_RING,&xsk->config.rx_size, sizeof(xsk->config.rx_size));//创建TX RINGsetsockopt(xsk->fd, SOL_XDP, XDP_TX_RING, &xsk->config.tx_size, sizeof(xsk->config.tx_size));
4个环形队列实现方式基本相同,环形队列是对数组进行封装的数据结构,环形队列由5个重要部分组成:
- 生产者序号(producer)
生产者序号用于指示数组当前可生产的元素位置,如果队列已满,将不能再生产。
- 消费者序号(consumer)
消费者序号用于指示当前可消费的元素位置,如果队列已空,将不能再消费。
- 队列长度(len)
队列长度即数组长度。
- 队列掩码(mask)
mask=len-1,生产者和消费者序号不能直接使用,需要配合掩码使用,producer,consumer和mask进行与运算,可以获取到数组的索引值。
- 固定长度数组
数组的每一个元素记录了UMEM单元的相对地址,如果UMEM单元有发送和接收的数据包,还会记录数据包的长度。
环形队列的无锁化通过原子变量来实现,原子变量和原子操作在高性能编程中经常会用到。
2.3 AF_XDP接收数据包
AF_XDP接收数据包需要FILL RING,RX RING两个环形队列配合工作。
第一步:XDP程序获取可用UMEM单元。
FILL RING记录了可以用来接收数据包的UMEM单元数量,用户程序根据UMEM使用记录,定期的往FILL RING生产可用UMEM单元。
第二步:XDP填充新的接收数据包
XDP程序消费FILL RING中UMEM单元用于存放网络数据包,接收完数据包后,将UMEM单元和数据包长度重新打包,填充至RX RING队列,生产一个待接收的数据包。
第三步:用户程序接收网络数据包
用户程序检测到RX RING有待接的收数据包,消费RX RING中数据包,将数据包信息从UMEM单元中拷贝至用户程序缓冲区,同时用户程序需要再次填充FILL RING队列推动XDP继续接收数据。
图片
2.4 AF_XDP发送数据包
AF_XDP发送数据包需要COMP RING,TX RING两个环形队列配合工作。
第一步:用户程序确保有足够的UMEM发送单元
COMP RING记录了已完成发送的数据包(UMEM单元)数量,用户程序需要回收这部分UMEM单元,确保有足够的UMEM发送单元。
第二步:用户程序发送数据包
用户程序申请一个可用的UMEM单元,将数据包拷贝至该UMEM单元,然后生产一个待发送数据包填充值TX RING。
第三步:XDP发送数据包
XDP程序检测到TX RING中有待发送数据包,从TX RING消费一个数据包进行发送,发送完成后,将UMEM单元填充至COMP RING,生产一个已完成发送数据包,用户程序将对该数据包UMEM单元进行回收。
图片
3. AF_XDP高效的秘密
AF_XDP之所以高效,主要有三大原因:
- 内核旁路技术
内核旁路技术在处理网络数据包的时候,可以跳过Linux内核协议栈,相当于走了捷径,这样可以降低链路开销。
- 内存映射
用户程序和内核共享UMEM内存和无锁环形队列,采用mmap技术将内存进行映射,用户操作UMEM内存不需要进行系统调用,减少了系统调用上下文切换成本。
- 无锁环形队列
无锁环形队列采用原子变量实现,可以减少线程切换和上下文切换成本。
基于以上几点,AF_XDP必然是一个高性能的网络技术,由于目前没有一个能够测试XDP极限性能的测试环境,大家如果对AF_XDP技术感兴趣,可以自行上网搜索相关资料。
以上がLinux ネットワーク パフォーマンスの王様、XDP テクノロジーについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









VSコードシステムの要件:オペレーティングシステム:オペレーティングシステム:Windows 10以降、MACOS 10.12以上、Linux Distributionプロセッサ:最小1.6 GHz、推奨2.0 GHz以上のメモリ:最小512 MB、推奨4 GB以上のストレージスペース:最低250 MB以上:その他の要件を推奨:安定ネットワーク接続、XORG/WAYLAND(Linux)

VSコード拡張機能のインストールの理由は、ネットワークの不安定性、許可不足、システム互換性の問題、VSコードバージョンが古すぎる、ウイルス対策ソフトウェアまたはファイアウォール干渉です。ネットワーク接続、許可、ログファイル、およびコードの更新、セキュリティソフトウェアの無効化、およびコードまたはコンピューターの再起動を確認することにより、問題を徐々にトラブルシューティングと解決できます。

VSコードはMacで利用できます。強力な拡張機能、GIT統合、ターミナル、デバッガーがあり、豊富なセットアップオプションも提供しています。ただし、特に大規模なプロジェクトまたは非常に専門的な開発の場合、コードと機能的な制限がある場合があります。

VSコードは、Microsoftが開発した無料のオープンソースクロスプラットフォームコードエディターと開発環境であるフルネームVisual Studioコードです。幅広いプログラミング言語をサポートし、構文の強調表示、コード自動完了、コードスニペット、および開発効率を向上させるスマートプロンプトを提供します。リッチな拡張エコシステムを通じて、ユーザーは、デバッガー、コードフォーマットツール、GIT統合など、特定のニーズや言語に拡張機能を追加できます。 VSコードには、コードのバグをすばやく見つけて解決するのに役立つ直感的なデバッガーも含まれています。

NotePadはJavaコードを直接実行することはできませんが、他のツールを使用することで実現できます。コマンドラインコンパイラ(Javac)を使用してByteCodeファイル(filename.class)を生成します。 Javaインタープリター(Java)を使用して、バイトコードを解釈し、コードを実行し、結果を出力します。

Linuxの主な用途には、1。Serverオペレーティングシステム、2。EmbeddedSystem、3。Desktopオペレーティングシステム、4。開発およびテスト環境。 Linuxはこれらの分野で優れており、安定性、セキュリティ、効率的な開発ツールを提供します。

Visual Studio Code(VSCODE)は、Microsoftが開発したクロスプラットフォーム、オープンソース、および無料のコードエディターです。軽量、スケーラビリティ、および幅広いプログラミング言語のサポートで知られています。 VSCODEをインストールするには、公式Webサイトにアクセスして、インストーラーをダウンロードして実行してください。 VSCODEを使用する場合、新しいプロジェクトを作成し、コードを編集し、コードをデバッグし、プロジェクトをナビゲートし、VSCODEを展開し、設定を管理できます。 VSCODEは、Windows、MacOS、Linuxで利用でき、複数のプログラミング言語をサポートし、マーケットプレイスを通じてさまざまな拡張機能を提供します。その利点には、軽量、スケーラビリティ、広範な言語サポート、豊富な機能とバージョンが含まれます

VSコードワンステップ/次のステップショートカットキー使用法:ワンステップ(後方):Windows/Linux:Ctrl←; macOS:CMD←次のステップ(フォワード):Windows/Linux:Ctrl→; macOS:CMD→
