kafka零拷贝原理_通俗易解中的解是什么意思

kafka零拷贝原理_通俗易解中的解是什么意思Kafka之所以那么快,其中一个很大的原因就是零拷贝(Zero-copy)技术,零拷贝不是kafka的专利,而是操作系统的升级,又比如Netty,也用到了零拷贝。下面我就画图讲解零拷贝,如果对你有帮助请点个赞支持。传统IOkafka的数据是要落入磁盘的,那么必然牵扯到磁盘的IO,传统磁盘IO又叫缓存IO,效率是很低的,那么为什么效率低呢?我们先来粗略讲讲操作系统的知识。用户空间以及内核空间的概念:我们知道现在操作系统都是采用虚拟存储器。那么对32位操作系统而言,它的寻址空间(虚拟存储空间)

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Kafka之所以那么快,其中一个很大的原因就是零拷贝(Zero-copy)技术,零拷贝不是kafka的专利,而是操作系统的升级,又比如Netty,也用到了零拷贝。下面我就画图讲解零拷贝,如果对你有帮助请点个赞支持。

传统IO

kafka的数据是要落入磁盘的,那么必然牵扯到磁盘的IO,传统磁盘IO又叫缓存IO,效率是很低的,那么为什么效率低呢?我们先来粗略讲讲操作系统的知识。

用户空间以及内核空间的概念:

我们知道现在操作系统都是采用虚拟存储器。那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方)。操心系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限。为了保证用户进程不能直接操作内核,保证内核的安全,操心系统将虚拟空间划分为两部分,一部分为内核空间(Kernel space),一部分为用户空间(User space)。针对Linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空间,而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为用户空间。每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。

传统的文件读写或者网络传输,通常需要将数据从内核态转换为用户态。应用程序读取用户态内存数据,写入文件 / Socket之前,需要从用户态转换为内核态之后才可以写入文件或者网卡当中。我们可以称之为read/write模式,此模式的步骤为:

  1. 首先,调用read时,磁盘文件拷贝到了内核态;
  2. 之后,CPU控制将内核态数据copy到用户态下;
  3. 调用write时,先将用户态下的内容copy到内核态下的socket的buffer中;
  4. 最后将内核态下的socket buffer的数据copy到网卡设备中传送;

 DMA

DMA(Direct Memory Access,直接存储器访问) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载 。通俗来讲,就是DMA 传输将数据从一个地址空间复制到另外一个地址空间,当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成,也就是两个硬件之间完成的,而没有CPU的参与,那么CPU就可以释放出来做别的事情,这样极大地提高了效率。我们常见的硬件设备如网卡、磁盘设备、显卡、声卡之类的都支持DMA。

所以上面所说的read/write模式大概如图所示:

kafka零拷贝原理_通俗易解中的解是什么意思

传统IO有两个很大的缺点导致很慢:

  1. 我们可以清楚的看到共产生了4次copy,从磁盘文件到Kernal的相互读写是支持DMA copy的,但即使是这样,从Kernal到User没有硬件的支持所以不支持DMA,还有两次CPU copy。
  2. Kafka只是把文件存放到磁盘之后通过网络发出去,中间并不需要修改什么数据,那read和write的两次CPU copy的操作完全是多余的。

 零拷贝

mmap

mmap是零拷贝的一种,主要就是去掉read write这两次CPU copy以提升性能,调用mmap()来代替read调用:

buf = mmap(diskfd, len);
write(sockfd, buf, len);

此模式步骤为:

  1. 用户程序调用 mmap(),磁盘上的数据会通过 DMA被拷贝的内核缓冲区;
  2. 接着操作系统会把这段内核缓冲区与用户程序共享,这样就不需要把内核缓冲区的内容往用户空间拷贝;
  3. 用户程序再调用 write(),操作系统直接将内核缓冲区的内容拷贝到 socket缓冲区中;
  4. 最后, socket缓冲区再把数据发到网卡去。

kafka零拷贝原理_通俗易解中的解是什么意思

这显然是一个伟大的进步,把上下文的切换次数从4次减少到2次,同时也把数据copy的次数从4次降低到了3次。

sendfile

Linux2.1内核开始引入了sendfile函数,用于将文件通过socket传送。开始时跟mmap没什么区别,但是Linux2.4做出了重大优化,将零拷贝推到顶峰。

优化后的处理过程如下:

  1. 将文件拷贝到kernel buffer中;
  2. 向socket buffer中追加当前要发生的数据在kernel buffer中的位置和偏移量;
  3. 根据socket buffer中的位置和偏移量直接将kernel buffer的数据copy到网卡设备中;

如图:

kafka零拷贝原理_通俗易解中的解是什么意思

经过上述过程,数据只经过了2次copy就从磁盘传送出去了。这个才是真正的Zero-Copy(这里的零拷贝是针对kernel来讲的,数据在kernel模式下是Zero-Copy)。

正是Linux2.4的内核做了改进,Java中的TransferTo()实现了Zero-Copy。

测试

在Windows10上测试:

kafka零拷贝原理_通俗易解中的解是什么意思

测试结果仅供参考 ,并不是平均数,所以可能偏差较大。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191178.html原文链接:https://javaforall.net

(0)
上一篇 2026年2月6日 下午12:15
下一篇 2026年2月6日 下午12:43


相关推荐

  • jar包如何读取jar包内的applicationContext.xml[通俗易懂]

    jar包如何读取jar包内的applicationContext.xml[通俗易懂]jar包如何读取jar包内的applicationContext.xml?可以用FileSystemXmlApplicationContext。

    2022年7月16日
    21
  • 阿里千问发布最新旗舰模型Qwen3-Max-Thinking,性能据称超GPT-5.2

    阿里千问发布最新旗舰模型Qwen3-Max-Thinking,性能据称超GPT-5.2

    2026年3月13日
    2
  • 转一篇 台湾人写的 webgame开发文章

    转一篇 台湾人写的 webgame开发文章1。游戏制作的主要流程电脑游戏开发小组中的任何一个人(这个角色通常有策划担任),只要有了一个新的想法或念头,就孕育着一个新游戏的诞生。在这个创意被充分讨论之后,再加上对其操作过程的趣味性及市场销售的可行性的预测等因素的准确判断,一个完整的策划方案才可能产生。在经过充分的讨论后,策划人员必须将讨论的重点写成文字,也就是提出完整的策划方案,经决策者同意认可后,才能进下一步的工作。这份策划方案就像一…

    2022年5月27日
    44
  • 网卡TSO

    网卡TSO网卡 TSO 功能当一个系统需要通过网络发送一大段数据时 计算机需要将这段数据拆分为多个长度较短的数据 以便这些数据能够通过网络中所有的网络设备 这个过程被称作分段 而当网卡支持 TSO 时 TCP 层会逐渐增大 mss 总是整数倍数增加 当 TCP 层向下发送大块数据时 仅仅计算 TCP 头 网卡接到到了 IP 层传下的大数据包后自己重新分成若干个 IP 数据包 添加 IP 头 复制 TCP 头并且重新计算校验和等相关数据 TCP 分段卸载将 TCP 的分片运算 如将要发送的 1M 字节的数据拆分为 MTU 大小的包 交给网卡处理

    2026年3月18日
    2
  • OMNeT++学习—TicToc(1)

    OMNeT++学习—TicToc(1)nbsp nbsp nbsp nbsp 首先 让我们从一个由两个节点组成的 网络 开始 节点将做一些简单的事情 其中一个节点将创建一个数据包 两个节点将继续来回传递相同的数据包 我们将节点称为 tic 和 toc 以下是从头开始实施第一个模拟的步骤 1 创建一个名为 tictoc 的工作目录 并 cd 到此目录 2 通过创建拓扑文件来描述您的示例网络 拓扑文件是一个文本文件 用于标识网络的节点及其之间的链接 您可以使

    2026年3月19日
    2
  • 即梦ai对口型教程:手把手教你玩转AI对口型,宝藏教程建议收藏!

    即梦ai对口型教程:手把手教你玩转AI对口型,宝藏教程建议收藏!

    2026年3月12日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号