零拷贝原理+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.mfbz.cn/a/474014.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

32.768K晶振X1A000141000300适用于无人驾驶汽车电子设备

科技的发展带动电子元器件的发展电子元器件-“晶振”为现代的科技带来了巨大的贡献,用小小的身体发挥着大大的能量。 近两年无人驾驶汽车热度很高,不少汽车巨头都已入局。但这项技术的难度不小,相信在未来几年里,无人驾驶汽车这项…

【研究僧总结】回顾第1095个创作日

目录 前言一. 机缘二. 日常三. 展望 前言 感觉刚过1024不久,现在又来个1095创作日 一. 机缘 研究僧一直在找平台做笔记,方便之后的回顾总结,也让各位网友见证你我的成长,相互学习 止不住的写文止不住的成长,大家共同…

个人App上架步骤详解

想要成功将个人开发的App上架到应用商店,需要经过一系列关键步骤,包括注册开发者账号、准备应用材料、提交审核等。以下将对这些步骤进行详细介绍。 一、注册开发者账号 在将应用程序发布至应用商店之前,开发者需要注册开发者账号。目前&…

国内智能驾驶芯片领先供应商地平线智能驾驶芯片介绍

地平线国内智能驾驶芯片领先供应商,由国际著名机器学习专家余凯博士于2015年7月创建;2017年12月,地平线即推出了首款 智能芯片征程1和旭日1;2019年8月,宣布量产中国首款车规级智能芯片征程2并于同年10月发 布新一代AIo…

【Python】实现学校教务管理系统(附源码)

目录 1、系统需求分析1.1系统功能简介1.2 软件环境与开发工具 2.数据库设计2.1 概要结构设计2.2 逻辑结构设计 1、系统需求分析 1.1系统功能简介 教务管理系统是基于现代化的教务管理理念和信息化管理技术,将学生学籍管理、教学计划管理、开课计划管理、排课管理、…

void QLayout::addItem(QLayoutItem *item)

写程序时发生了内存泄漏: 经过排查,发现是重复delete了verticalSpacer。 class Widget : public QWidget {Q_OBJECTpublic:explicit Widget(QWidget *parent 0);~Widget(); private:Ui::Widget *ui;QSpacerItem* verticalSpacer;QVBoxLayout* v_layou…

网络编程:数据库

一、作业 1> 创建一个工人信息库,包含工号(主键)、姓名、年龄、薪资。 2> 添加三条工人信息(可以完整信息,也可以非完整信息) 3> 修改某一个工人的薪资(确定的一个) 4> …

31.网络游戏逆向分析与漏洞攻防-网络通信数据包分析工具-其它消息的实现与使用优化

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果 内容参考于:易道云信息技术研究院VIP课 上一个内容:30.数据搜索功能…

基于SpringBoot的学生成绩管理系统

基于SpringBootVue的家教管理系统的设计与实现~ 开发语言:Java 数据库:MySQL 技术:SpringBoot 系统功能结构展示 登录界面图 现今,越来越多的人乐于选择一项合适的管理方案,但是普通用户往往受到管理经验地限制&…

html5cssjs代码 029 CSS计数器

html5&css&js代码 029 CSS计数器 一、代码二、解释 该HTML代码定义了一个网页的结构和样式。在头部,通过CSS样式定义了body和h1-h2元素的样式。body元素的样式包括文本居中、计数器重置、字体颜色和背景颜色。h2元素的样式使用了CSS计数器来自动在标题前添加…

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

第十三章:接口、协议和 ABCs 针对接口编程,而不是实现。 Gamma、Helm、Johnson、Vlissides,《面向对象设计的第一原则》 面向对象编程关乎接口。在 Python 中理解类型的最佳方法是了解它提供的方法——即其接口——如 “类型由支持的操作定义…

FPGA学习_跨时钟域问题

文章目录 前言一、什么是跨时钟域问题二、单bit跨时钟域(快到慢)三、单bit跨时钟域(慢到快)四、单bit跨时钟域(任意时钟域之间)五、多bit跨时钟域 前言 跨时钟域问题是FPGA以及IC设计中最常见的话题&#…

ASP.NET-Global.asax使用详解

本文介绍了如何使用Global.asax文件来增强ASP.NET Web应用程序的功能。首先,介绍了Global.asax文件的作用和基本功能。接着,详细探讨了在Global.asax中实现定时任务、应用程序级别的错误处理、应用程序启动和结束时执行特定逻辑等功能。随后,…

函数重载(简易)

1.函数重载的原理: 编译器为了实现函数重载,也是默认为我们做了一些幕后的工作,编译器用不同的参数类型来修饰不同的函数名,比如void func();编译器可能会将函数名修饰成_func,当编译器碰到voi…

YOLOV4-车道线检测-车距离预测

1.前言 最近在看华为的CANN框架,发现了一些很有意思的开源算法(本文所有的代码都出自华为开源git发布的代码),华为最近出了AI PRO开发板,想着现在开发板上用用(不想重新配置环境了,麻烦还累),看着代码有onnx的模型&…

种植新革命:科技赋能绿色未来

《种植新革命:科技赋能绿色未来》 一、种植技术的颠覆式创新 随着科技的飞速发展,种植技术也在经历一场颠覆式的创新。传统的种植方式,虽然历史悠久,经验丰富,但在面对现代化、大规模、高效的需求时,逐渐…

Centos7部署单节点MongoDB(V4.2.25)

🎈 作者:互联网-小啊宇 🎈 简介: CSDN 运维领域创作者、阿里云专家博主。目前从事 Kubernetes运维相关工作,擅长Linux系统运维、开源监控软件维护、Kubernetes容器技术、CI/CD持续集成、自动化运维、开源软件部署维护…

学点Java_Day6_基于Copyright和Actions On Save的IDEA自动更新文件最后编辑时间的方法研究(IDEA2021.2及以上)

0 版本要求 IDEA2021.2及以上,我用的IntelliJ IDEA 2023.2.4 1 操作 1.1 Copyright设置 ① CtrlAltS打开设置(Settings)→ Editor → Copyright   ② Copyright → Copyright Profiles → → 取名 → OK   ③ 复制下面内容到框里&am…

2024蓝桥杯每日一题(并查集)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一:奶酪 试题二:合并集合 试题三:连通块中点的数量 试题四:网络分析 试题一:奶酪 【题目描述】 现有一块大奶酪,它的高度为 hℎ…

PyTorch 深度学习(GPT 重译)(六)

十四、端到端结节分析,以及接下来的步骤 本章内容包括 连接分割和分类模型 为新任务微调网络 将直方图和其他指标类型添加到 TensorBoard 从过拟合到泛化 在过去的几章中,我们已经构建了许多对我们的项目至关重要的系统。我们开始加载数据&#xf…
最新文章