零拷贝原理+kafka中的零拷贝

零拷贝原理+kafka中的零拷贝

  • kafka性能之零拷贝
    • 传统IO
    • 零拷贝mmp优化
    • sendfile优化
    • sendfile +DMA scatter/gather优化
    • Kafka是怎么使用零拷贝的

kafka性能之零拷贝

kafka中的零拷贝并不是说完全避免了上下文切换与cpu拷贝的次数, 而是减少这种拷贝次数

传统IO

传统的一次IO流程

read: 数据从磁盘读取到内核缓冲区, 然后从内核缓冲区拷贝到用户缓冲区

write: 数据从用户缓冲区写入socket缓冲区, 然后写入网卡设备

  1. read之后, 也即向操作系统发出IO调用, 用户态切换到内核态
  2. DMA拷贝数据从硬盘到内核缓冲区
  3. CPU拷贝内核缓冲区数据到用户缓冲区, 内核态切换到用户态
  4. write之后, 也即发起IO调用, 用户态切换到内核态
  5. CPU拷贝用户缓冲区数据到socket缓冲区
  6. DMA拷贝socket缓冲区到网卡设备, 内核态切换到用户态

img

  • 上述过程可以看出有4次上下文切换, 4次拷贝. 其实这个地方可以优化, 我们把数据拷贝到用户缓冲区再从用户缓冲区拿出数据到socket纯属多此一举, 如果有一种操作直接可以把数据从内核缓冲区到socket缓冲区的话, 就能减少拷贝操作了

零拷贝mmp优化

mmp优化是基于虚拟内存实现的

虚拟内存是什么东西?简单来讲, 虚拟内存是由于主存不够大而出现的辅存(理论上来说, 主存想多大就多大, 实际上来说怎么可能, 主存越大价格越高, 追求性价比的情况下才出现的虚拟内存)

虚拟内存主要是干啥呢? 虚拟内存可以把内核空间和用户空间的虚拟地址映射到同一个地方, 这样用户对这个映射地址的操作, 内核空间也可以感知到, 那么内核和用户之间就可以减少拷贝了

当引入mmp机制后的IO操作

  1. mmp调用向操作系统发起IO, 用户态切换到内核态
  2. DMA拷贝数据从硬盘到内核缓冲区
  3. 内核态切换到用户态
  4. write之后, 也即发起IO调用, 用户态切换到内核态
  5. CPU拷贝内核缓冲区数据到socket缓冲区
  6. DMA拷贝socket缓冲区到网卡设备, 内核态切换到用户态

img

  • 上述操作可以看出, 我们进行了4次上下文切换, 3次拷贝, 好像还是不够优化, 我们虽然优化了拷贝次数, 但是上下文切换也很耗费时间的, 4次上下文切换能否可以优化呢?对于系统调用来说(read, write,mmp这类函数) 上下文切换是不可避免的, 想要优化就必然减少系统调用次数, 上述我们不可避免使用到了write函数,如果我们将read和write合并成一次系统调用, 在内核中实现磁盘和网课数据传输, 就能够减少上下文切换了, 也就是sendfile优化

  • 通过mmap,进程像读写硬盘一样读写内存(当然是虚拟机内存),也不必关心内存的大小有虚拟内存为我们兜底。

sendfile优化

当引入sendfile优化后的IO操作

  1. 用户进程发起sendfile进行IO,用户态切换至内核态
  2. DMA拷贝数据从硬盘到内核缓冲区
  3. CPU拷贝内核缓冲区到socket缓冲区
  4. DMA拷贝数据从socket缓冲区到网卡
  5. 内核态切换到用户态, sendfile函数返回

img

  • 上述操作发现, 我们只进行了2次上下文切换, 这下上下文切换好像是优化到极致了,但是依旧是3次拷贝, 如何继续优化拷贝次数? Linux 2.4 版本之后,对 sendfile 做了升级优化,引入了 SG-DMA技术,其实就是对DMA拷贝加入了 scatter/gather 操作,它可以直接从内核空间缓冲区中将数据读取到网卡,无需将内核空间缓冲区的数据再复制一份到 socket 缓冲区,从而省去了一次 CPU拷贝。

sendfile +DMA scatter/gather优化

当使用优化后的IO操作

  1. 用户进程发起sendfile进行IO,用户态切换至内核态
  2. DMA拷贝数据从硬盘到内核缓冲区
  3. CPU直接将文件描述符等信息(内核缓冲区的地址+偏移量)复制到socket缓冲区中
  4. DMA根据文件描述符拷贝内核区数据到网卡
  5. 内核态切换到用户态, sendfile函数返回

img

  • 至此, 我们通过两次上下文切换+两次拷贝完成零拷贝终极优化
  • 这里的两次拷贝不是cpu拷贝, 而是DMA拷贝, 零拷贝的意义也是在减少cpu拷贝, 使用mmp和sendfile实现的也叫做零拷贝, 只是不够那么零

Kafka是怎么使用零拷贝的

简单来说:

Kafka的两个过程

  1. Producer生产数据到broker ->数据持久化到磁盘 -> 使用了mmp
  2. Consumer从broker获取数据 ->磁盘文件发送到网卡 -> 使用了sendfile

image-20240321005854139

mmap也有一个很明显的缺陷——不可靠,写到mmap中的数据并没有被真正的写到硬盘,操作系统会在程序主动调用flush的时候才把数据真正的写到硬盘。Kafka提供了一个参数——producer.type来控制是不是主动flush;如果Kafka写入到mmap之后就立即flush然后再返回Producer叫同步(sync);写入mmap之后立即返回Producer不调用flush叫异步(async)。

RocketMQ选择了mmap + write这种零拷贝方式,适用于业务级消息这种小块文件的数据持久化和传输;而Kafka采用的是sendfile这种零拷贝方式,适用于系统日志消息这种高吞吐量的大块文件的数据持久化和传输。但是值得注意的一点是,Kafka的索引文件使用的是mmap+write方式,数据文件使用的是sendfile方式。

这里有一篇详细一点的文章, 网上讲kafka中如何实现零拷贝的好像比较少, 大部分围绕着零拷贝是什么展开的, 找了半天觉得这个比较好,感兴趣的可以戳这个大佬的链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/280493.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习开发小程序的起航日记

2024年3月16日 不知不觉中三月份还只剩了一半的光景,我想写的内容还很多没有写,或者更应该说,是想积累的还有很多。现在最应该去完善Java的内容,可还是想先等等。想等搞清楚小程序部分,想等积累完小程序的内容。 这几…

华为综合案例-普通WLAN全覆盖配置(2)

组网图 结果验证 在AC_1和AC_2上执行display ap all命令,检查当前AP的状态,显示以下信息表示AP上线成功。[AC_1] display ap all Total AP information: nor : normal [1] ExtraInfo : Extra information P : insufficient power supply ---…

冒泡排序的原理及其实现

✨✨✨学习的道路很枯燥,希望我们能并肩走下来! 目录 前言 一、冒泡排序的原理 二、代码实现 总结 前言 本篇详细介绍了冒泡排序的原理及其实现,让使用者对冒泡排序的原理及其实现有进一步认识,而不是仅仅停留在表面,更好的模…

xercesc库保存XML功能实现

目录 一 参考链接 二 运行结果 三 代码 一 参考链接 DOM Programming Guide (apache.org) Xerces-c DOM XML文件的构造_xerces-c domimplementation-CSDN博客 Xerces-c库的使用-CSDN博客 二 运行结果 三 代码 #if 1//参考链接: https://blog.csdn.net/RGBMa…

流畅的 Python 第二版(GPT 重译)(九)

第四部分:控制流 第十七章:迭代器、生成器和经典协程 当我在我的程序中看到模式时,我认为这是一个麻烦的迹象。程序的形状应该只反映它需要解决的问题。代码中的任何其他规律性对我来说都是一个迹象,至少对我来说,这表…

【数据可视化】Echarts中的其它图表

个人主页 : zxctscl 如有转载请先通知 文章目录 1. 前言2. 绘制散点图2.1 绘制基本散点图2.2 绘制两个序列的散点图2.3 绘制带涟漪特效的散点图 3. 绘制气泡图3.1 绘制标准气泡图3.2 绘制各国人均寿命与GDP气泡图3.3 绘制城市A、城市B、城市C三个城市空气污染指数气…

Tech Talks技术讲座中文培训-报名学习LPWAN、Matter、蓝牙和Wi-Fi最新开发技能!

Silicon Labs(亦称“芯科科技”)主办新一轮2024年“亚太区Tech Talks在线技术讲座”即将在5月9日至8月8日(中文系列场次),以及4月24日至8月7日(英文系列场次)正式展开,现正热烈报名中…

uniapp使用Canvas给图片加水印把临时文件上传到服务器

生成的临时路径是没有完整的路径没办法上传到服务器 16:37:40.993 添加水印后的路径, _doc/uniapp_temp_1710923708347/canvas/17109238597881.png 16:37:41.041 添加水印后的完整路径, file://storage/emulated/0/Android/data/com.jingruan.zjd/apps/__UNI__BE4B000/doc/…

ES 常见面试题及答案

目录 es 写入数据流程 es 删除数据流程 es 读数据流程 es 部署的服务有哪些角色 es 的实现原理 es 和lucence 关系 如何提高写入效率 提高搜索效率 es doc value指的啥 分片指的啥,定义后可不可义再修改 深分页如何优化 对于聚合操作是如何优化的 元数据…

adobe animate 时间轴找不到编辑多个帧按钮

如题,找了半天,在时间轴上找不到编辑多个帧按钮,导致无法批量处理帧 然后搜索发现原来是有些版本被隐藏了,需要再设置一下 勾选上就好了

POI和EasyExcel区别和操作Excel

POI和EasyExcel操作Excel 常用场景 1、将用户信息导出为excel表格(导出数据… ) 2、将Excel表中的信息录入到网站数据库(文件数据上传… ) 开发中经常会设计到excel的处理,如导出Excel,导入Excel到数据库…

鸿蒙Harmony应用开发—ArkTS-转场动画(组件内隐式共享元素转场)

geometryTransition用于组件内隐式共享元素转场,在组件显示切换过程中提供平滑过渡效果。通用transition机制提供了opacity、scale等转场动效,geometryTransition通过id绑定in/out组件(in指入场组件、out指出场组件),使得组件原本独立的trans…

Gateway新一代网关

Gateway新一代网关 1、概述 ​ Cloud全家桶中有个很重要的组件就是网关,在1.x版本中都是采用的Zuul网关; ​ 但在2.x版本中,zuul的升级一直跳票,SpringCloud最后自己研发了一个网关SpringCloud Gateway替代Zuul。 ​ 官网&…

手机运营商二要素检测:重塑信任基石,筑牢信息安全屏障

随着移动互联网的普及和数字经济的快速发展,用户信息安全的重要性日益凸显。运营商二要素检测作为一种强大的安全验证机制,以其精准匹配与实时验证的特性,为各类应用场景提供了一种可靠的身份识别解决方案,正在成为众多企业和服务…

C++:继承:面向对象编程的重要特性

(❁◡❁)(●◡●)╰(*▽*)╯(*/ω\*)(^///^)(❁◡❁)(❁◡❁)(●◡●)╰(*▽*)╯(*/ω\*)(❁◡❁)(●’◡’●)╰(▽)╯(/ω\)(///) C:继承:面向对象编程的重要特性 前言**继承**1.继承的概念及定义1.1继承的概念1.2继…

Redis6.0多线程的疑惑解答

1.Redis6.0之前的版本真的是单线程吗? Redis在处理客户端的请求是,包括获取(socket读)、解析、执行、内容返回(socket 写)等都有一个 顺序串行的主线程处理,这就是所谓的"单线程"。但如果严格来讲并不是单线程,除了主线…

SpringMVC学习笔记

SpringMVC 本篇笔记是基于尚硅谷学习资料的整理,涉及到其笔记的简化,补充,以及我在学习中遇到的与无法理解的问题及解决,如果想看完整及后续的笔记,可以去https://www.wolai.com/v5Kuct5ZtPeVBk4NBUGBWF查看官方笔记。…

演讲嘉宾公布 | 3D音频专题论坛将于3月27日举办

一、3D音频专题论坛 3D音频技术不仅能够提供更加真实、沉浸的虚拟世界体验,跨越时空的限制,探索未知的世界。同时,提供更加丰富、立体的情感表达和交流方式,让人类能够更加深入地理解彼此,建立更加紧密的联系。3D音频未…

MongoDB系列之查询计划

概述 一个查询具体如何被执行的过程,称为查询计划。MongoDB采用自底向上的方式来构造查询计划,每一个查询计划(query plan)都会被分解为若干个有层次的阶段(stage)。整个查询计划最终会呈现出一颗多叉树。…

Windows管理多版本nodejs方法

参考:window操作系统安装多个版本的nodejs——nodejs版本控制工具nvm_windows node多版本共存-CSDN博客 前排: 建议把原来电脑装的nodejs卸载干净,再干这个步骤,可以避免出现一些状况;;;另&…