当前位置: 首页 > news >正文

Kafka 零拷贝(Zero-Copy)技术详解

文章目录

    • 1. 什么是零拷贝
    • 2. Kafka 如何实现零拷贝
      • 2.1 sendfile 系统调用
      • 2.2 mmap 内存映射
    • 3. 传统拷贝 vs 零拷贝
      • 3.1 传统文件传输流程
      • 3.2 零拷贝文件传输流程
    • 4. Kafka 零拷贝的具体实现
      • 4.1 消息消费时的零拷贝
      • 4.2 日志段文件的零拷贝
    • 5. 零拷贝带来的性能优势
    • 6. 零拷贝的适用场景
    • 7. Kafka 零拷贝的局限性
    • 8. 性能对比数据
    • kafka 的零拷贝原理

1. 什么是零拷贝

零拷贝(Zero-Copy)是一种高效的数据传输技术,它允许数据在不需要CPU参与拷贝的情况下,直接从存储设备传输到网络接口卡(NIC)。在传统的数据传输过程中,数据需要在用户空间和内核空间之间多次拷贝,而零拷贝技术可以显著减少这些不必要的拷贝操作。

2. Kafka 如何实现零拷贝

Kafka 主要通过以下两种机制实现零拷贝:

2.1 sendfile 系统调用

Kafka 使用 Linux 的 sendfile() 系统调用实现零拷贝:

#include <sys/sendfile.h>ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

工作流程:

  1. 磁盘文件通过 DMA 拷贝到内核缓冲区(Page Cache)
  2. 内核缓冲区直接通过 DMA 拷贝到网卡缓冲区
  3. 整个过程完全在内核空间完成,避免了用户空间和内核空间之间的数据拷贝

2.2 mmap 内存映射

Kafka 日志文件的索引(.index 和 .timeindex 文件)使用内存映射(mmap)技术:

// Kafka 中 mmap 的实现
this.index = new MappedByteBuffer(indexFile.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, indexFile.length())
);

3. 传统拷贝 vs 零拷贝

3.1 传统文件传输流程

1. 磁盘 -> 内核缓冲区 (DMA 拷贝)
2. 内核缓冲区 -> 用户缓冲区 (CPU 拷贝)
3. 用户缓冲区 -> socket 缓冲区 (CPU 拷贝)
4. socket 缓冲区 -> 网卡 (DMA 拷贝)

共涉及:4 次上下文切换 + 2 次 CPU 拷贝 + 2 次 DMA 拷贝

3.2 零拷贝文件传输流程

1. 磁盘 -> 内核缓冲区 (DMA 拷贝)
2. 内核缓冲区 -> 网卡 (DMA 拷贝)

共涉及:2 次上下文切换 + 0 次 CPU 拷贝 + 2 次 DMA 拷贝

4. Kafka 零拷贝的具体实现

4.1 消息消费时的零拷贝

Kafka 消费者获取消息时,Broker 使用 FileChannel.transferTo() 方法(底层调用 sendfile):

// Kafka 中的实现
public long transferFrom(FileChannel fileChannel, long position, long count) throws IOException {return fileChannel.transferTo(position, count, socketChannel);
}

4.2 日志段文件的零拷贝

Kafka 的日志段(LogSegment)使用 FileChannelMappedByteBuffer

// Kafka LogSegment 部分源码
val logFile = new File(dir, filename + LogFileSuffix)
val channel = new RandomAccessFile(logFile, "rw").getChannel()
val mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, 0, maxSegmentSize)

5. 零拷贝带来的性能优势

  1. 减少 CPU 使用率:避免了不必要的 CPU 拷贝操作
  2. 减少内存带宽占用:数据不需要在用户空间和内核空间之间来回拷贝
  3. 提高吞吐量:减少了数据传输路径上的延迟
  4. 降低上下文切换:减少了用户态和内核态之间的切换次数

6. 零拷贝的适用场景

  1. 大文件传输
  2. 高吞吐量的消息系统(如 Kafka)
  3. 静态内容服务器(如 Nginx)
  4. 视频流媒体服务

7. Kafka 零拷贝的局限性

  1. 不适合小文件:零拷贝的优势在大文件传输时更明显
  2. 需要操作系统支持:依赖于 Linux 的 sendfile 和 mmap
  3. 内存映射的缺陷:mmap 可能导致内存占用过高
  4. 不能修改数据:零拷贝通常是只读操作

8. 性能对比数据

指标传统拷贝零拷贝提升幅度
CPU 使用率50-70%
吞吐量2-3 倍
内存占用30-50%
延迟30-40%

Kafka 通过零拷贝技术实现了极高的吞吐量(可达百万级 QPS),这也是 Kafka 能够成为高性能消息系统的关键设计之一。

kafka 的零拷贝原理

零拷贝是一种减少数据拷贝的机制,能够有效提升数据的效率
它的原理是:将磁盘文件映射到内存,用户通过修改内存就能修改磁盘文件。使用这种方式可以获取很大的 I/O 提升,省去了用户空间到内核空间复制的开销。

零拷贝指计算机执行 IO 操作时,CPU 不需要将数据从一个存储区域复制到另一个存储区域,从而可以减少上下文切换以及 CPU 拷贝时间。一种I/O 操作优化技术。
传统的IO编写的,它的执行过程大致是这样的:
1、从磁盘中读取目标文件内容拷贝到内核缓冲区
2、CPU控制器再把内核缓冲区的数据赋值到用户空间的缓冲区中
3、接着在应用程序中,调用write()方法,把用户空间缓冲区中的数据拷贝到内核下的Socket Buffer中。
4、最后,把在内核模式下的SocketBuffer中的数据赋值到网卡缓冲区(NIC Buffer)
5、网卡缓冲区再把数据传输到目标服务器上。
在这个过程中我们可以发现,数据从磁盘到最终发送出去,要经历4次拷贝,而在这四次拷贝过
程中,有两次拷贝是浪费的,分别是:
1、从内核空间赋值到用户空间
2、从用户空间再次复制到内核空间
除此之外,由于用户空间和内核空间的切换会带来CPU的上线文切换,对于CPU性能也会造成性能影响。
而零拷贝,就是把这两次多于的拷贝省略掉,应用程序可以直接把磁盘中的数据从内核中直接传输给Socket,而不需要再经过应用程序所在的用户空间

零拷贝通过DMA(Direct Memory Access)技术把文件内容复制到内核空间中的Read Buffer,
接着把包含数据位置和长度信息的文件描述符加载到Socket Buffer中,DMA引擎直接可以把
数据从内核空间中传递给网卡设备。在这个流程中,数据只经历了两次拷贝就发送到了网卡中,并且减少了2次cpu的上下文切换,对于效率有非常大的提高。
在程序中实现零拷贝的方式有三种:
1、在Linux中,零拷贝技术依赖于底层的sendfile()方法实现
2、在Java中,FileChannal.transferTo() 方法的底层调用的就是 sendfile() 方法。
3、MMAP 文件映射机制。它的原理是,将磁盘文件映射到内存, 用户通过修改内存就能修改磁盘文件。使
用这种方式可以获取很大的I/O提升,省去了用户空间到内核空间复制的开销。

http://www.lryc.cn/news/624764.html

相关文章:

  • C++面试中的手写快速排序:从基础到最优的完整思考过程
  • IEC EN 62040 不间断电源系统(UPS)安全要求标准
  • 【音视频】芯片、方案、市场信息收集
  • 恒创科技:日本服务器 ping 不通?从排查到解决的实用指南
  • 政策技术双轮驱动智慧灯杆市场扩容,塔能科技破解行业痛点
  • 【轨物交流】轨物科技与华为鲲鹏生态深度合作 光伏清洁机器人解决方案获技术认证!
  • 微算法科技(NASDAQ: MLGO)研究分片技术:重塑区块链可扩展性新范式
  • 【P38 6】OpenCV Python——图片的运算(算术运算、逻辑运算)加法add、subtract减法、乘法multiply、除法divide
  • Maven resources资源配置详解
  • 深度研究系统、方法与应用的综述
  • kubeadm方式部署k8s集群
  • zsh 使用笔记 命令行智能提示 bash智能
  • 视频因为264问题无法网页播放,解决方案之一:转化视频
  • 【matlab】考虑源荷不平衡的微电网鲁棒定价研究
  • 第7节 神经网络
  • grep命令要点、详解和示例
  • 淘宝扭蛋机小程序开发:引领电商娱乐化新潮流
  • 剧本杀小程序系统开发:保障游戏公平,营造健康娱乐环境
  • 香港数据合集:建筑物、手机基站、POI、职住数据、用地类型
  • 27.Linux 使用yum安装lamp,部署wordpress
  • 【CV 目标检测】Fast RCNN模型③——模型训练/预测
  • 短剧小程序系统开发:推动短剧行业规范化与标准化发展
  • 移动端PFD预览组件Vue3(非插件)
  • Nacos-6--Naco的QUIC协议实现高可用的工作原理
  • Linux系统启动原理及故障排除
  • GitHub Actions 从核心思想到最佳实践
  • Go语言基础结构全解析
  • 海洋牧场:奏响乡村振兴的蓝色乐章
  • Mysql——前模糊索引失效原因及解决方式
  • Linux软件编程(七)线程间同步与进程间通信