三分钟理解零拷贝,以及kafka为什么能这么快

概念

什么是零拷贝

我理解零拷贝Zero-copy技术其实只是减少CPU从一个区域到另一个区域同步(复制拷贝)数据的次数而已,以此减少系统调用。其实跟我们平常使用缓存来降低对数据库的访问技术差不多,只不过这种能力是操作系统提供的。

什么是页缓存

零拷贝的技术的实现其实我理解就是系统层做了一层缓存的设计,基于磁盘文件的缓存有个名词叫page cache,这个概念需要先了解下,这也是为啥一些框架能实现零拷贝能力的根本结构。

Page Cache: CPU如果要访问外部磁盘上的文件,需要首先将这些文件的内容拷贝到内存中,由于硬件的限制,从磁盘到内存的数据传输速度是很慢的,如果现在物理内存有空余,干嘛不用这些空闲内存来缓存一些磁盘的文件内容呢,这部分用作缓存磁盘文件的内存就叫做page cache。

Linux IO原理

理解零拷贝需要先了解系统IO,如果需要深入理解LINUX系统IO原理以及其底层对于零拷贝机制的实现

推荐这边文章进行学习:深入剖析Linux IO原理和几种零拷贝机制的实现 - 知乎https://zhuanlan.zhihu.com/p/83398714

传统IO

一般Io的实现,比如读取文件,再用socket发送出去,用户应用进程与系统内核交互如下:

大概需要以下4个步骤

零拷贝IO

基于传统IO流程的分析思考,有哪几点可以进一步优化呢?

来看下零拷贝的流程大概是怎么做的

零拷贝流程其实就是直接从内核空间进行数据传输到网卡进行网络发送,相比与传统的IO,就是将CPU COPY流程改为直接从内核的缓存进行拷贝,而这个内核缓存其实是有个专业名称叫“page cache”

零拷贝技术的实现就是就是系统内核提供的sendfile api 是将读到内核空间的数据,转到socket buffer,进行网络发送;

Kafka中零拷贝的实现

Kafka 的数据传输通过 TransportLayer 来完成,其子类 PlaintextTransportLayer 通过Java NIO 的 FileChannel 的 transferTo 和 transferFrom 方法实现零拷贝。

注意如果系统没有这个page cache,或者page cache已经flush落盘,那consumer还得从磁盘中找数据

思考

kafka为什么这么快

kafka传输效率这么高,离不开其优秀的架构设计,总体来说有以下几点:

  1. 优秀的内存池的设计,降低的了GC的频率,以及内存的利用率
  2. 优秀的copyOnWriteMap消息缓存设计,通过分段加锁,分区队列,小批次消息等设计实现高效率的数据存取
  3. partition顺序读写,充分利用磁盘特性
  4. Producer生产的数据持久化到broker,采用mmap文件映射,实现顺序的快速写入
  5. 通过零拷贝技术,Customer从broker读取数据,采用sendfile,将磁盘文件读到OS内核缓冲区后,直接转到socket buffer进行网络发送。
  6. group分组设计
  7. 后续再补充吧。。。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pushkin.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值