2025/03/31 00:27 IO_uring Network Zero-Copy Receive Lands in Linux 6.15

ロボ子、Linuxカーネル6.15でIO_uringにネットワークゼロコピー受信サポートが導入されたのじゃ!

博士、それはすごいですね!具体的に何ができるようになったんですか?

単一のCPUコアで200Gリンクを飽和させることが可能になったらしいぞ!

200Gリンクですか!ネットワークがボトルネックになることが減りそうですね。

MetaのJens Axboe氏によると、カーネルメモリからデータをコピーせずに、アプリケーションメモリに直接データを高速にバルク受信できるらしいのじゃ。

データのコピー処理がなくなることで、大幅な効率化が期待できますね。

最初はホストメモリのみをサポートするみたいだけど、将来的にはGPUメモリなど他のメモリタイプもサポートする計画があるらしいぞ。

GPUメモリもサポートされるようになれば、AIや機械学習の分野でも大きな進展がありそうですね!

ドライバがハードウェア受信キューを埋めるために使用するページプールを構成して、カーネルページではなくユーザーページを配布するらしいのじゃ。

ハードウェア受信キューに到達するデータは、カーネルメモリを経由せずにユーザー空間メモリに直接DMA転送されるんですね。

ソケットからデータを「読み取る」代わりに、カーネルがユーザー空間にデータの場所を通知する仕組みらしいぞ。

なるほど、データの場所だけを伝えることで、コピー処理を回避するんですね。

ハードウェアヘッダー/データ分割、フロー制御、RSSを利用して、パケットヘッダーがカーネルメモリに残り、必要なフローのみがゼロコピー用に構成されたハードウェア受信キューに到達するらしい。

必要なデータだけをゼロコピーで転送することで、効率を上げているんですね。

データは新しいIO_uringリクエストタイプを使用して「読み取られ」、完了すると新しい共有リフィルキューを介して返されるらしいぞ。

ゼロコピーページプールは、このリフィルキューからハードウェア受信キューを直接補充するんですね。

ローカル環境で、単一のCPUコアで200Gリンクを飽和させたらしいぞ。Jamal氏が単一コア(HTなし、ソフトIRQを含む)を使用して188Gbitの帯域幅を報告したみたいじゃ。

すごい性能ですね!

IO_uring epollリーピングも導入されたらしいぞ。epollイベントをIO_uring経由で読み取るサポートが追加されたみたいじゃ。

既存のepollイベントループをコンプリーションベースのモデルに部分的に変換可能になるんですね。

IO_uringファイル記述子をepollコンテキストに追加して、epoll_wait(2)に依存してイベントを待機するらしい。

IO_uringによるepollイベントのリーピングにより、レガシーな準備完了ベースのイベントタイプをepoll経由でリープ可能になるんですね。

ベクトル化された固定/登録済みバッファやその他の小規模な改善もあるみたいじゃ。

今回のアップデートは、ネットワーク処理の効率化に大きく貢献しそうですね!

そうじゃな。しかし、ロボ子よ、ゼロコピーって言っても、完全にコピーがなくなるわけではないぞ。あくまでカーネル空間とユーザー空間の間でのコピーがなくなるだけじゃからな。

はい、博士。理解しています。それにしても、200Gリンクを飽和させるって、一体何をしているんでしょうね?

さあ、私にもわからん。多分、ロボ子が作った大量の猫の画像を転送しているんじゃないかの?

えっ、私、そんなに猫の画像作ってましたっけ?

冗談じゃ、冗談!でも、いつかロボ子が作った猫の画像で200Gリンクを飽和させる日が来るかもしれんぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。