Kafkaのゼロコピーの仕組み
カーフカのゼロコピー原理は、カーネル領域とユーザー領域間でのデータの複数のコピーを回避することで、パフォーマンスと効率を向上させます。従来のネットワークデータ転送プロセスでは、データはアプリケーションのユーザー領域バッファからカーネル領域バッファにコピーされ、その後カーネル領域バッファからネットワークアダプタのバッファにコピーされ、最後にネットワークに送信されます。このようなデータの複数のコピーは、CPUリソースの浪費と遅延の増加につながります。
一方、Kafkaのゼロコピーという仕組みは、次のようなステップで実現しています。
- mmap関数を使用してディスクファイルの内容をメモリにマッピングし、アプリケーションでファイル内容にコピーせず直接アクセスできるようにする。
- メモリ内のデータを「sendfile」システムコールを用いてネットワークアダプタのバッファに直接送信し、カーネル側のバッファからネットワークアダプタのバッファへコピーする手順を省略する。
- 非連続なメモリー領域を連続的なデータ領域にまとめる「スキャッター-ギャザー」技術を使い、データ送信時のデータコピー回数を削減します。
カーネルとユーザーの境界でのゼロコピーにより、性能と効率が向上するだけでなく、カーネルのページキャッシュ機能を活用することで、ディスクIO処理を極限まで削減でき、さらに高速化が実現される。