Kafka06——高效读写数据

一、写数据(生产数据-顺序写磁盘)
 Kafka 的 producer 生产数据,要写入到 log 文件中,写的过程是一直追加到文件末端,为顺序写。官网有数据表明,同样的磁盘,顺序写能到 600M/s,而随机写只有 100K/s。这与磁盘的机械机构有关,顺序写之所以快,是因为其省去了大量磁头寻址的时间。

二、读数据(消费数据)
 Kafka 高吞吐量的其中一个重要功臣就是“零拷贝”。从字面上理解就是数据不需要多次拷贝,系统性能大幅度提升。其实,不仅在kafka中,Java NIO,netty,rocketMQ 等框架中也都用到了零拷贝。
 1、传统的文件拷贝
  传统的文件拷贝通常需要将拷贝请求从用户态转到核心态,经过核心态的read buffer,然后再返回到用户态的应用层buffer,然后再从用户态把数据拷贝到核心态的socket buffer,最后发送到网卡。如下图所示:
在这里插入图片描述
  传统的数据传输需要多次的用户态和核心态之间的切换,而且还要把数据复制多次,最终才打到网卡。如果减少了用户态与核心态之间的切换,是不是就会更快了呢?如下图:
在这里插入图片描述
  用户态“空空如也”。数据没有来到用户态,而是直接在核心态就进行了传输,但这样依然还是有多次复制。首先数据被读取到read buffer中,然后发到socket buffer,最后才发到网卡。虽然减少了用户态和核心态的切换,但依然存在多次数据复制。如果可以进一步减少数据复制的次数,甚至没有数据复制是不是就会做到最快呢?
 2、DMA
  DMA,全称叫Direct Memory Access(直接内存访问),一种让某些硬件子系统去直接访问系统主内存而不用依赖CPU的计算机系统的功能。传统的内存访问都需要通过CPU的调度来完成,而 DMA 可以跳过CPU,直接访问主内存。如下图:
通过CPU访问内存
  绕过CPU访问内存:
直接访问内存
  很多硬件都支持DMA,这其中就包括网卡。
在这里插入图片描述
 3、零拷贝
  有了DMA后,就可以实现零拷贝了,因为网卡是直接去访问系统主内存的。如下图:
在这里插入图片描述
  在Java中零拷贝的实现在FileChannel中,其中有个方法transferTo(position,fsize,src)。transferTo方法底层是基于操作系统的sendfile这个system call来实现的(不再需要拷贝到用户态了),sendfile负责把数据从某个fd(file descriptor)传输到另一个fd。
在这里插入图片描述
  Kafka在文件传输的过程中正是使用了零拷贝技术对文件进行拷贝,因此大大提升了文件传输的性能。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值