ウィキペディアの splice の紹介で、次のことがわかりました。
ソケットで splice() を使用する場合、ネットワーク コントローラ (NIC) は DMA をサポートする必要があります。
NIC が DMA をサポートしていない場合、splice() はパフォーマンスの向上を提供しません。この理由は、パイプの各ページがフレーム サイズ (ページごとに使用可能な 4096 バイトのうちの 1460 バイト) までいっぱいになるためです。
私が理解していることから、スプライスは次の理由でパフォーマンスを向上させます。
- コンテキストの切り替えが少ない
- コピーの数を最小限に抑えます (最小 2 つの DMA コピー)。
NIC が DMA コピーをサポートしていない場合は、CPU コピーを使用します。これは、ユーザー空間に移動する必要がある通常のコピーよりも優れています。
そのため、ウィキペディアが NIC で DMA をサポートしないとパフォーマンスが向上しないと言っている理由がわかりません。