Kafka零拷贝

Kafka零拷贝

在这里插入图片描述

在实际应用中,如果需要把磁盘中的某个文件内容,发送到远程服务器上,那么他必须要经过几个拷贝的过程。
1,从磁盘读取目标文件内容,copy到内核缓冲区;
2, cpu控制器把内核缓冲区的数据, copy到用户空间的缓冲区中;
3,在应用程序中,调用 write()方法,把用户空间缓冲区中的数据,拷贝到内核空间的Socket Buffer中;
4,把内核模式下的Socket Buffer中的数据,复制到网卡缓冲区(NIC Buffer),
最后, 网卡缓冲区再把数据传输到目标服务器上;
在这个过程中,可以发现, 数据从磁盘到最终发出去,要经历4次拷贝,而在这四次拷贝过程中,
有两次拷贝是浪费的。
    1.从内核空间拷贝到用户空间;
    2.从用户空间再次拷贝到内核空间;
除此之外,由于用户空间和内核空间的切换,会带来Cpu上下文切换,对于Cpu的性能也会造成影响,

而所谓的零拷贝,就是把这两次多余的拷贝忽略掉,应用程序可以直接把磁盘中的数据,
从内核中直接传输到Socket, 而不需要再次经过应用程序所在的用户空间。
零拷贝通过DMA(Direct Memory Access)技术,把文件内容 复制到内核空间中的Read Buffer,
接着把包含数据长度和位置的信息文件描述符, 加载到 SocketBuffer 中,
DMA引擎直接可以把数据从内核空间传递到网卡设备,在这个流程中,
数据只经历了两次拷贝,就把数据发送到网卡中,并且减少了2次Cpu的上下文切换,
对于效率是有非常大的提高。

所以,所谓的零拷贝并不是完全没有数据的拷贝,只是相对用户空间来说,不需要再进行数据的拷贝。
只是减少了不必要的拷贝次数而已。

在应用程序中如何实现零拷贝

linux系统中,零拷贝技术依赖于底层的sendfile()方法去实现的;
而在java中,FileChannel.transferTo()方法的底层实现就是sendfile()方法;

除此之外,还有一个mmap的文件映射机制,它的原理就是把磁盘文件映射到内存,
用户通过修改内存就可以修个磁盘文件,使用这种方式,可以获得很大的I/O提升,
省去了用户空间到内核空间的复制开销。

以上就是对kafka零拷贝技术的理解

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值