首页 > 其他分享 >2023-07-16:讲一讲Kafka与RocketMQ中零拷贝技术的运用?

2023-07-16:讲一讲Kafka与RocketMQ中零拷贝技术的运用?

时间:2023-07-16 22:47:15浏览次数:40  
标签:07 16 buffer Kafka 缓冲区 拷贝 copy 数据 socket

2023-07-16:讲一讲Kafka与RocketMQ中零拷贝技术的运用?

答案2023-07-16:

什么是零拷贝?

零拷贝(英语: Zero-copy) 技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。

➢零拷贝技术可以减少数据拷贝和共享总线操作的次数,消除传输数据在存储器之间不必要的中间拷贝次数,从而有效地提高数据传输效率

➢零拷贝技术减少了用户进程地址空间和内核地址空间之间因为上:下文切换而带来的开销

可以看出没有说不需要拷贝,只是说减少冗余[不必要]的拷贝。

下面这些组件、框架中均使用了零拷贝技术:Kafka、Netty、Rocketmq、Nginx、Apache。

传统数据传送机制

比如:读取文件,再用socket发送出去,实际经过四次copy。

伪码实现如下:

buffer = File.read()

Socket.send(buffer)

1、第一次:将磁盘文件,读取到操作系统内核缓冲区;

2、第二次:将内核缓冲区的数据,copy到应用程序的buffer;

3、第三步:将application应用程序buffer中的数据,copy到socket网络发送缓冲区(属于操作系统内核的缓冲区);

4、第四次:将socket buffer的数据,copy到网卡,由网卡进行网络传输。

分析上述的过程,虽然引入DMA来接管CPU的中断请求,但四次copy是存在“不必要的拷贝”的。实际上并不需要第二个和第三个数据副本。应用程序除了缓存数据并将其传输回套接字缓冲区之外什么都不做。相反,数据可以直接从读缓冲区传输到套接字缓冲区。

显然,第二次和第三次数据copy 其实在这种场景下没有什么帮助反而带来开销(DMA拷贝速度一般比CPU拷贝速度快一个数量级),这也正是零拷贝出现的背景和意义。

打个比喻:200M的数据,读取文件,再用socket发送出去,实际经过四次copy(2次cpu拷贝每次100ms ,2次DMS拷贝每次10ms)

传统网络传输的话:合计耗时将有220ms

mmap内存映射(RocketMQ使用的)

硬盘上文件的位置和应用程序缓冲区(application buffers)进行映射(建立一种一一对应关系),由于mmap()将文件直接映射到用户空间,所以实际文件读取时根据这个映射关系,直接将文件从硬盘拷贝到用户空间,只进行了一次数据拷贝,不再有文件内容从硬盘拷贝到内核空间的一个缓冲区。

mmap内存映射将会经历:3次拷贝: 1次cpu copy,2次DMA copy;

打个比喻:200M的数据,读取文件,再用socket发送出去,如果是使用MMAP实际经过三次copy(1次cpu拷贝每次100ms ,2次DMS拷贝每次10ms)合计只需要120ms

从数据拷贝的角度上来看,就比传统的网络传输,性能提升了近一倍。

RocketMQ源码中的MMAP运用

RocketMQ源码中,使用MappedFile这个类类进行MMAP的映射

Kafka中的零拷贝

Kafka两个重要过程都使用了零拷贝技术,且都是操作系统层面的狭义零拷贝,一是Producer生产的数据存到broker,二是 Consumer从broker读取数据。

Producer生产的数据持久化到broker,采用mmap文件映射,实现顺序的快速写入;

Customer从broker读取数据,采用sendfile,将磁盘文件读到OS内核缓冲区后,直接转到socket buffer进行网络发送。

sendfile

linux 2.1支持的sendfile

当调用sendfile()时,DMA将磁盘数据复制到kernel buffer,然后将内核中的kernel buffer直接拷贝到socket buffer。在硬件支持的情况下,甚至数据都并不需要被真正复制到socket关联的缓冲区内。取而代之的是,只有记录数据位置和长度的描述符被加入到socket缓冲区中,DMA模块将数据直接从内核缓冲区传递给协议引擎,从而消除了遗留的最后一次复制。

一旦数据全都拷贝到socket buffer,sendfile()系统调用将会return、代表数据转化的完成。socket buffer里的数据就能在网络传输了。

sendfile会经历:3次拷贝,1次CPU copy ,2次DMA copy;硬件支持的情况下,则是2次拷贝,0次CPU copy, 2次DMA copy。

标签:07,16,buffer,Kafka,缓冲区,拷贝,copy,数据,socket
From: https://www.cnblogs.com/moonfdd/p/17558741.html

相关文章

  • 7.16
    #include<iostream>usingnamespacestd;intmain(){intT[100];//用于确认所有身分是否都正确intN;//输入的身份证的个数cin>>N;inta=0;charA[100][18];//储存输入的身份证号//首先将z值和校验码m的值对应起来intZ[17]={7,9,10......
  • 2023-07-16:讲一讲Kafka与RocketMQ中零拷贝技术的运用?
    2023-07-16:讲一讲Kafka与RocketMQ中零拷贝技术的运用?答案2023-07-16:什么是零拷贝?零拷贝(英语:Zero-copy)技术是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。这种技术通常用于通过网络传输文件时节省CPU周期和内存带宽。➢零拷贝技术可以减少数据拷贝和......
  • 《摆与混》第十四章--7月16日--周日
    周日,平淡却轻松;1.今天做了什么:今天10点起。洗漱后,觉得时间太晚就没有吃早餐,上午随便混了混,今天去外婆家吃饭(已经很久没去了),下午小小摆烂时间,学了会弥补一下上午,5点出发健身锻炼(周末也不断),晚上去了一家早就想去好吃的店,然后经典PTA,周末接着起飞呀!!!!2.解决了什么问题:Java课程推进,PTA......
  • 7.16总结
    昨晚睡得很早,起床后头疼的症状也缓解了,然后起床在床上刷了会视频,起来后将pta弄到了1500分,上午还有人问我题,我就讲了一下,这对我来说也是复习提升吧。中午自己炒了个菜,手法很生疏,做的很失败,但也能吃,吃完之后刷视频,看了一会javaweb知识,更新了sql的笔记,快整理完了,整理的也是简单的常用......
  • 7月16号周日
    今天学习了c++中vector,queue这两个容器,学习了堆栈和队列的相关知识,感觉受益匪浅。明天决定使用pta固定题目集的一些题目来帮助自己掌握并熟练这两大知识点,以扩宽自己的能力。明天,决定继续进行学习和相应题目的练习并进行适当放松,达到利益最大化。......
  • 闲话 Day16.5
    困死了困死了困死了困死了困死了困死了。才两天中午没睡觉打UNR精神状态就已经完全寄掉了。那么,显然,这几天是不会有学术题材的。这么看,可能闲话Day17是不会再有了的吧(悲)不过其实也还好。让闲话停留在Day16,正好也是一个2的整数幂。也算是比较圆满的结束了吧。本来打......
  • 每日总结2023年7月16日
    今日学习:批处理的学习;java连接池C3P0的连接。遇到的问题:今天在做批处理的时候发现一个问题,就是我的MySQL数据表好像只能存储1000条数据,那么如果数据量远大于此我该如何解决?明天的计划:开启Spring学习。......
  • 161 第七天
    早上。。逐渐暴躁,学右入库六天半了(中间大概有一天半没去),还是差那点东西不够好,现在有点越学越差的感觉了。不知道明天能不能学左入库呜呜呜,学了的话还要挨骂下午,下午第一次,本来心态就不好,还被插队,练的好差劲。第二轮,调整心态后,基本没什么问题。也不知道明天会怎样,唉。最好是练......
  • 7月16日 --指针
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<string.h>structstu{ charname[20]; intage; charid[20];};intmain(){ inta=0; structstus1={"张三",20,"775513640"}; structstu*ps=&a......
  • 7.16 后记
    听不懂(悲)DP知识刷表和填表SleepingCowsP主要难点在提前钦定不用来匹配的牛,状态加一个0/1,代表当前点之前是否有被钦定的牛若当前为牛棚,则\(f_{i,j,0}=f_{i−1,j,0}+(j+1)f_{i−1,j+1,0}\)\(f_{i,j,1}=(j+1)f_{i−1,j+1,1}\)若当前为牛牛,则\(f_{i,j,0}=f_{i−1,j−1,0}\)......