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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Linux WIFI优先连接5G频段「建议收藏」

    Linux WIFI优先连接5G频段「建议收藏」最近遇到一个项目,要求树莓派无线优先连接5G,目前测试了一个方法,先记录下来,测试下来是有用的。现场无线网络知识2.4G和5G双频,SSID和密码都是相同的,树莓派在这个环境中,优先连接2.4G网络。由于2.4G网络干扰问题,网络通讯不稳定,因此需要树莓派优先连接到5G网络。有查到通过修改wpa_supplicant.conf文件中,定义frep_list的频点值,可以修改单独连接到5WIFI.后来经过测试,将5G频段排序到2.4G频段之前,无线会优先连接5G网络,如果5G网络不可用,也可以连接到

    2022年10月20日
    0
  • goland2021.07激活码【最新永久激活】[通俗易懂]

    (goland2021.07激活码)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.htmlS3…

    2022年3月22日
    108
  • 《前端运维》一、Linux基础–03Shell基础及补充「建议收藏」

    诶诶欸?不是学Linux么?怎么要讲shell了?shell是啥?啥是shell?别急,我们先简单了解下shell是什么。Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。

    2022年3月25日
    36
  • 解二元微分通解和特解的关系,量子力学中的奇异点分析与高数中通解与特解的关系

    解二元微分通解和特解的关系,量子力学中的奇异点分析与高数中通解与特解的关系解二元微分通解和特解的关系,量子力学中的奇异点分析与高数中通解与特解的关系

    2022年4月24日
    71
  • branch_git fetch

    branch_git fetch问:Igoogledandreadmanyposts,butnonecouldmakemeunderstandthebranchdivergenceproblemyet.IfI’veremotetrackingbranch,Ioftengetintothefollowing:$gitstatus#Onbranch

    2022年10月26日
    0
  • 贴片电阻符号表示_怎样识别贴片电阻的阻值

    贴片电阻符号表示_怎样识别贴片电阻的阻值1、贴片电阻阻值和精度贴片电阻本体颜色为黑色,电阻体上一般标注为白色数字(小型电阻无标识,称无印字贴片电阻),如图4所示。贴片电阻在电路板上的元件序列号(常称位号)为R(如R1、R2等)。贴片电阻的基本参数有标称阻值、额定功率、误差级别、最高电压、温度系数等,但在实际使用中,只需关注标称阻值和额定功率值这两项参数就可以了。主要有三位表示和四位表示两种方法三位表示:前2位数字分别为十位、个位值,称为有效数值,第3位数字是10的X次方,误差值在+-%5。…

    2022年8月21日
    3

发表回复

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

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