当前位置: 首页 > 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.xdnf.cn/news/1322551.html

相关文章:

  • 数据赋能(401)——大数据——持续学习与优化原则
  • RAG 入门指南:从概念到最小系统搭建
  • 基于Android的随身小管家APP的设计与实现/基于SSM框架的财务管理系统/android Studio/java/原生开发
  • 从0-1使用Fastmcp开发一个MCP服务,并部署到阿里云百炼 -持续更新中
  • Flutter 自定义 Switch 切换组件完全指南
  • 深度学习——R-CNN及其变体
  • React diff——差异协调算法简介
  • 【Python面试题】写一个用元类(metaclass)实现API接口自动注册的Demo。以及装饰器在项目中典型应用场景。
  • AI行业应用深度报告:金融、医疗、教育、制造业落地案例
  • 前端环境安装
  • AI 在金融领域的落地案例
  • go语言条件语if …else语句
  • ——链表——
  • 音频算法工程师技能1
  • 调试技巧(vs2022 C语言)
  • 【速通】深度学习模型调试系统化方法论:从问题定位到性能优化
  • 剧本杀小程序系统开发:保障游戏公平,营造健康娱乐环境
  • 蔬菜批发小程序:生产商的数字化转型利器——仙盟创梦IDE
  • 云计算-云上实例部署 RocketChat:Mongodb、主从数据库、Node 环境配置指南
  • 【人工智能】2025年AI代理失控危机:构建安全壁垒,守护智能未来
  • Python 面向对象三大特性详解(与 C++ 对比)
  • 【OpenAI】今日话题: GPT-4o-Audio-Preview 多模态语音交互模型介绍+API的使用教程!
  • 【verge3d】如何在项目里调用接口
  • ⭐CVPR2025 RigGS:从 2D 视频到可编辑 3D 关节物体的建模新范式
  • 【2025CVPR-目标检测方向】RaCFormer:通过基于查询的雷达-相机融合实现高质量的 3D 目标检测
  • BeeWorks 私有化会议系统:筑牢企业会议安全防线,赋能高效协同
  • 高并发网络编程实战:深入理解epoll客户端的事件驱动模型
  • OpenCV---特征检测算法(ORB,Oriented FAST and Rotated BRIEF)
  • css word-pass
  • 【LeetCode 热题 100】198. 打家劫舍——(解法二)自底向上