0%

Kafka 零拷贝原理

从字面意思理解就是数据不需要来回的拷贝,大大提升了系统的性能


前言

“零拷贝”是指计算机操作的过程中,CPU 不需要为数据在内存之间的拷贝消耗资源。而它通常是指计算机在网络上发送文件时,不需要将文件内容拷贝到用户空间(User Space)而直接在内核空间(Kernel Space)中传输到网络的方式。

零拷贝并不是不需要拷贝,而是减少不必要的拷贝次数。通常是说在 IO 读写过程中

缓冲区

缓冲区是所有 I/O 的基础,I/O 讲的无非就是把数据移进或移出缓冲区

进程执行I/O操作,就是向操作系统发出请求,让它要么把缓冲区的数据排干(写),要么填充缓冲区(读)

下面看一个 Java 进程发起读请求加载数据大致的流程图

  1. 进程发起读请求之后,内核接收到读请求之后,会先检查内核空间中是否已经存在进程所需要的数据,
    如果已经存在,则直接把数据拷贝给进程的缓冲区

  2. 如果内核缓冲区没有命中随即向磁盘控制器发出命令,要求从磁盘读取数据,磁盘控制器把数据直接写入内核read缓冲区,这一步通过DMA完成

  3. 接下来内核将数据拷贝到进程的缓冲区

DMA 是一种硬件和软件之间的数据传输的技术,且 DMA 进行数据传输的过程中几乎不需要 CPU 参与

虚拟内存

所有现代操作系统都使用虚拟内存,使用虚拟的地址取代物理地址,这样有两个好处:

  1. 一个以上的虚拟地址可以指向同一个物理内存地址
  2. 虚拟内存空间可大于实际可用的物理地址

利用第一条特性可以把内核空间地址和用户空间的虚拟地址映射到同一个物理地址,
这样DMA就可以填充对内核和用户空间进程同时可见的缓冲区了,大致如下图所示:

零拷贝技术

本人水平有限,零拷贝技术可以阅读下方链接

Kafka 通过 sendfile 实现的零拷贝 I/O,理想状态下的零拷贝I/O需要接触 DMA 完成。