【ゼロコピー】

ゼロコピー とは?

最終更新:
💡 不要なデータの持ち替えを減らして転送する

データ転送で不要なコピーを省いたり減らしたりする技術。たとえばLinuxのsendfile()は、ファイルを送る際のユーザー空間とのデータの往復を省く。どのコピーを減らすかは方式によって異なり、処理全体のコピーや負荷が必ずゼロになるわけではない。

📌 このページのポイント
ゼロコピー:データの往復を省く read() と write() の例 カーネル ファイル アプリ バッファ カーネル 送信先 ユーザー空間へ渡して戻す sendfile() の例 ファイル カーネル 送信先 カーネル 転送 アプリのバッファを往復しない
Linuxのファイル転送の概念比較。sendfile()はアプリが指示し、データはユーザー空間のバッファを往復しない。コピー全体が必ずゼロになる図ではない。
ひよこ ひよこ
本当にコピーがゼロ?
ペンギン先生 ペンギン先生
どのコピーを省くかが大事だよ。方式によって減らせる範囲が違い、メモリや機器の間の転送まで全部なくなるとは限らない。Linuxのsendfile()は、ユーザー空間とのデータの往復を省く例なんだ。
ひよこ ひよこ
普通の送信と何が違う?
ペンギン先生 ペンギン先生
ファイルをread()でアプリへ読み、write()で送り出すと、データをユーザー空間へ渡してから戻すよ。加工せず送るだけなら、この通り道を省く方法を検討できるんだ。
ひよこ ひよこ
sendfile()ならアプリは不要?
ペンギン先生 ペンギン先生
アプリが転送を指示するよ。データのコピーはカーネル内で行われ、アプリのバッファを往復しないという意味なんだ。対応するファイルなどの条件があり、成功しても要求した全量を一度で送れるとは限らないよ。
ひよこ ひよこ
ほかの方法もある?
ペンギン先生 ペンギン先生
Linuxのsplice()は少なくとも片側がパイプの転送、mmap()は仮想アドレス空間への対応付けだよ。同じコピー削減という話でもAPIの役割は違う。mmap()では、対応したファイルの末尾を越えたページへのアクセスはSIGBUSの原因になるんだ。
ひよこ ひよこ
TLSだと使えない?
ペンギン先生 ペンギン先生
暗号化をどこで行うかによるよ。LinuxのカーネルTLSにはsendfile()でTLSレコードを送る仕組みもある。nginxにもsendfile()を使う設定があるけれど、環境と負荷を確かめ、名前だけで速度やコピー回数を保証しないんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「ゼロコピー」って出てきたら「転送時の不要なデータコピーを減らす工夫」と思えばだいたいOK!
📖 おまけ:英語の意味
「Zero-copy」 = コピーをゼロにする(減らす)こと
💬 本来は不要なデータのコピーをなくす(ゼロにする)ことを目指すから、この名前だよ。実際には完全にゼロにならない場合もあるんだ

参考資料

← 用語集にもどる