Kafka速度快的原因-sendfile零拷贝介绍

所谓的零拷贝是指将数据直接从磁盘文件复制到网卡设备中,而不需要经由应用程序之手。零拷贝大大提高了应用程序的性能,减少了内核和用户模式之间的上下文切换。对 Linux 操作系统而言,零拷贝技术依赖于底层的 sendfile() 方法实现。对应于 Java 语言,FileChannal.transferTo() 方法的底层实现就是 sendfile() 方法。

所谓零拷贝,就是减少上下文切换,不经由用户空间,直接在内核空间把数据发往网卡接口。
Kafka速度快的原因-sendfile零拷贝介绍_第1张图片
操作系统底层提供的sendfile(transferTo()函数),零拷贝
Kafka速度快的原因-sendfile零拷贝介绍_第2张图片
sendfile
Linux2.1内核开始引入了sendfile函数,用于将文件通过socket传送。开始时跟mmap没什么区别,但是Linux2.4做出了重大优化,将零拷贝推到顶峰。

优化后的处理过程如下:

将文件拷贝到kernel buffer中;
向socket buffer中追加当前要发生的数据在kernel buffer中的位置和偏移量;
根据socket buffer中的位置和偏移量直接将kernel buffer的数据copy到网卡设备中;
Kafka速度快的原因-sendfile零拷贝介绍_第3张图片

你可能感兴趣的:(kafka)