概念
什么是零拷贝
我理解零拷贝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传输效率这么高,离不开其优秀的架构设计,总体来说有以下几点:
- 优秀的内存池的设计,降低的了GC的频率,以及内存的利用率
- 优秀的copyOnWriteMap消息缓存设计,通过分段加锁,分区队列,小批次消息等设计实现高效率的数据存取
- partition顺序读写,充分利用磁盘特性
- Producer生产的数据持久化到broker,采用mmap文件映射,实现顺序的快速写入
- 通过零拷贝技术,Customer从broker读取数据,采用sendfile,将磁盘文件读到OS内核缓冲区后,直接转到socket buffer进行网络发送。
- group分组设计
- 后续再补充吧。。。