ゼロコピー(Zero-copy)

ゼロコピー(Zero-copy)とは、バッファへの冗長なデータコピーを避けることで、カーネルとユーザーモード間のコンテキストスイッチの数を減らして、CPUサイクルとメモリ帯域幅を節約することでパフォーマンスを改善するテクニックです。ゼロコピーはアプリケーションのI/Oパフォーマンスで大幅な性能向上が期待できます。このテクニックはファイルコピーや、アップロード、ダウンロード等のネットワーク通信で利用されています。

Nginx の場合

Nginx では sendfile 機能を有効にすることで、オペレーティングシステムのゼロコピーをサポートします。より高速なTCPデータ転送を可能にすることができます。ただし、処理チェーンにデータにアクセスする必要があるフィルタを挿入することができません。たとえば GZIPフィルタは使用することはできません。sendfile 機能はデフォルトで無効になっていますので、明示的に有効にする必要があります。

Java の場合

オペレーティング·システムで、ゼロコピーをサポートしている場合では、Java では java.nio.channels.FileChannelのtransferTo() メソッドを介してゼロコピーをサポートすることができます。

transferTo(long position, long count, WritableByteChannel target) このチャネルのファイルから指定された書込み可能なバイト・チャネルへバイトを転送します。

このチャネルからデータを読み込んでターゲット・チャネルに書き込むという単純なループよりも、このメソッドのほうがずっと効率的に処理できる可能性があります。多くのオペレーティング・システムは、ファイル・システム・キャッシュからターゲット・チャネルへバイトを直接転送できます。このとき、バイトのコピーは行われません。

参考