1 简介
零拷贝是指将数据直接从磁盘文件复制到网卡,而不需要经由应用之手。
零拷贝大大提高了应用程序的性能,减少了内核和用户模式之间的上下文切换。
对Linux操作系统而言,零拷贝技术依赖于底层的sendfile()方法实现,对于Java语言,FileChannel.transferTo()方法的底层实现就是sendfile()方法。
不使用零拷贝的话,图示如下:
1)磁盘数据到buffer
2)buffer到应用
3)应用再到buffer
4)buffer到客户端
如果采用零拷贝,2和3就可以省略了
2 kafka消息
kafka中,持久化的消息不需要交给kafka处理,可以直接返回给consumer。所以可以零拷贝
3 kafka持久化结构
先把消息存到缓存,再持久化到磁盘
4 kafka的零拷贝
由于kafka消息是没有发生变化的,所以从cache找到消息后,不需要返回给kafka处理,可以直接返回给consumer。
整个过程中,找到消息后,没有返给kafka,直接交给内核发到consumer,减少了把消息从cache发给kafka,再从kafka到内核的过程。