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到内核的过程。