数据传输-零拷贝机制

2023-11-10

传统 IO

在开始谈零拷贝之前,首先要对传统的 IO 方式有一个概念。基于传统的 IO 方式,底层实际上通过调用read()和write()来实现。通过read()把数据从硬盘读取到内核缓冲区,再复制到用户缓冲区;然后再通过write()写入到socket 缓冲区,最后写入网卡设备
在这里插入图片描述
整个过程发生了4 次用户态和内核态的上下文切换和4 次拷贝,具体流程如下:

用户进程通过 read()方法向操作系统发起调用,此时上下文从用户态转向内核态
DMA 控制器把数据从硬盘中拷贝到读缓冲区
CPU 把读缓冲区数据拷贝到应用缓冲区,上下文从内核态转为用户态, read()返回
用户进程通过 write()方法发起调用,上下文从用户态转为内核态
CPU 将应用缓冲区中数据拷贝到 socket 缓冲区
DMA 控制器把数据从 socket 缓冲区拷贝到网卡,上下文从内核态切换回用户态, write()返回

在这里插入图片描述
那么,这里指的用户态、内核态指的是什么?上下文切换又是什么?
简单来说,用户空间指的就是用户进程的运行空间,内核空间就是内核的运行空间。如果进程运行在内核空间就是内核态,运行在用户空间就是用户态。为了安全起见,他们之间是互相隔离的,而在用户态和内核态之间的上下文切换也是比较耗时的。从上面我们可以看到,一次简单的 IO 过程产生了 4 次上下文切换,这个无疑在高并发场景下会对性能产生较大的影响。

DMA拷贝

因为对于一个 IO 操作而言,都是通过 CPU 发出对应的指令来完成,但是相比 CPU 来说,IO 的速度太慢了,CPU 有大量的时间处于等待 IO 的状态。因此就产生了 DMA(Direct Memory Access)直接内存访问技术,本质上来说他就是一块主板上独立的芯片,通过它来进行内存和 IO 设备的数据传输,从而减少 CPU 的等待时间。但是无论谁来拷贝,频繁的拷贝耗时也是对性能的影响。

零拷贝

零拷贝技术是指计算机执行操作时,CPU 不需要先将数据 buffer 从某处内存复制到另一个特定区域,这种技术通常用于通过网络传输文件时节省 CPU 周期和内存带宽。那么对于零拷贝而言,并非真的是完全没有数据拷贝的过程,只不过是减少用户态和内核态的切换次数以及 CPU 拷贝的次数。这里,仅仅有针对性的来谈谈几种常见的零拷贝技术。

mmap+write

mmap+write 简单来说就是使用mmap替换了 read+write 中的 read 操作,减少了一次 CPU 的拷贝。
mmap主要实现方式是将读缓冲区的地址和用户缓冲区的地址进行映射,内核缓冲区和应用缓冲区共享,从而减少了从读缓冲区到用户缓冲区的一次 CPU 拷贝。
在这里插入图片描述
整个过程发生了4 次用户态和内核态的上下文切换和3 次拷贝,具体流程如下:

用户进程通过 mmap()方法向操作系统发起调用,上下文从用户态转向内核态
DMA 控制器把数据从硬盘中拷贝到读缓冲区
上下文从内核态转为用户态,mmap 调用返回
用户进程通过 write()方法发起调用,上下文从用户态转为内核态
CPU 将读缓冲区中数据拷贝到 socket 缓冲区
DMA 控制器把数据从 socket 缓冲区拷贝到网卡,上下文从内核态切换回用户态, write()返回

mmap的方式节省了一次 CPU 拷贝,同时由于用户进程中的内存是虚拟的,只是映射到内核的读缓冲区,所以可以节省一半的内存空间,比较适合大文件的传输。

最后,这种mmap的映射机制由于还是需要用户态保存文件的映射信息,数据复制的过程也需要用户态的参与,这其中的变数还是非常多的。所以,mmap机制适合操作小文件,如果文件太大,映射信息也会过大,容易造成很多问题。通常mmap机制建议的映射文件大小不要超过2G 。而RocketMQ的CommitLog文件保持在1G固定大小,也是为了方便文件映射。

sendfile

相比mmap来说,sendfile同样减少了一次 CPU 拷贝,而且还减少了 2 次上下文切换。
sendfile是 Linux2.1 内核版本后引入的一个系统调用函数,通过使用sendfile数据可以直接在内核空间进行传输,因此避免了用户空间和内核空间的拷贝,同时由于使用sendfile替代了read+write从而节省了一次系统调用,也就是 2 次上下文切换。
在这里插入图片描述
整个过程发生了2 次用户态和内核态的上下文切换和3 次拷贝,具体流程如下:

用户进程通过 sendfile()方法向操作系统发起调用,上下文从用户态转向内核态
DMA 控制器把数据从硬盘中拷贝到读缓冲区
CPU 将读缓冲区中数据拷贝到 socket 缓冲区
DMA 控制器把数据从 socket 缓冲区拷贝到网卡,上下文从内核态切换回用户态, sendfile调用返回

sendfile方法 IO 数据对用户空间完全不可见,所以只能适用于完全不需要用户空间处理的情况,比如静态文件服务器。
sendfile机制非常适合大数据的复制转移。

sendfile+DMA Scatter/Gather

Linux2.4 内核版本之后对sendfile做了进一步优化,通过引入新的硬件支持,这个方式叫做 DMA Scatter/Gather 分散/收集功能。
它将读缓冲区中的数据描述信息–内存地址和偏移量记录到 socket 缓冲区,由 DMA 根据这些将数据从读缓冲区拷贝到网卡,相比之前版本减少了一次 CPU 拷贝的过程
在这里插入图片描述
整个过程发生了2 次用户态和内核态的上下文切换和2 次拷贝,其中更重要的是完全没有 CPU 拷贝,具体流程如下:

用户进程通过 sendfile()方法向操作系统发起调用,上下文从用户态转向内核态
DMA 控制器利用 scatter 把数据从硬盘中拷贝到读缓冲区离散存储
CPU 把读缓冲区中的文件描述符和数据长度发送到 socket 缓冲区
DMA 控制器根据文件描述符和数据长度,使用 scatter/gather 把数据从内核缓冲区拷贝到网卡
sendfile()调用返回,上下文从内核态切换回用户态

DMA gather和sendfile一样数据对用户空间不可见,而且需要硬件支持,同时输入文件描述符只能是文件,但是过程中完全没有 CPU 拷贝过程,极大提升了性能。

应用场景

RocketMQ 和 Kafka 都使用到了零拷贝的技术。
对于 MQ 而言,无非就是生产者发送数据到 MQ 然后持久化到磁盘,之后消费者从 MQ 读取数据。

对于 RocketMQ 来说这两个步骤使用的是mmap+write,而 Kafka
则是使用mmap+write持久化数据,发送数据使用sendfile。
Netty使用的零拷贝技术更多的是文件的传输

总结
由于 CPU 和 IO 速度的差异问题,产生了 DMA 技术,通过 DMA 搬运来减少 CPU 的等待时间。
传统的 IO read+write方式会产生 2 次 DMA 拷贝+2 次 CPU 拷贝,同时有 4 次上下文切换。
而通过mmap+write方式则产生 2 次 DMA 拷贝+1 次 CPU 拷贝,4 次上下文切换,通过内存映射减少了一次 CPU 拷贝,可以减少内存使用,适合大文件的传输
sendfile方式是新增的一个系统调用函数,产生 2 次 DMA 拷贝+1 次 CPU 拷贝,但是只有 2 次上下文切换。因为只有一次调用,减少了上下文的切换,但是用户空间对 IO 数据不可见,适用于静态文件服务器。
sendfile+DMA gather方式产生 2 次 DMA 拷贝,没有 CPU 拷贝,而且也只有 2 次上下文切换。虽然极大地提升了性能,但是需要依赖新的硬件设备支持。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据传输-零拷贝机制 的相关文章

  • Jmeter 性能-并发量计算

    并发概念 指网站在同一时间访问的人数 人数越大瞬间带宽要求更高 服务器并发量分为 业务并发用户数 最大并发访问数 系统用户数 同时在线用户数 估算业务并发量的公式 C nL T C C 3 C的平方根 说明 C是平均的业务并发用户数 n是l
  • 步骤详图 教你在linux搭建容器环境

    警告 切勿在没有配置 Docker YUM 源的情况下直接使用 yum 命令安装 Docker 1 准备工作 系统要求 要安装Docker CE 社区版 操作系统的最低要求是CentOS7 7以下版本都不被支持 卸载旧版本 Docker改版
  • 如何使用Imagewheel搭建一个简单的的私人图床无公网ip也能访问

    文章目录 1 前言 2 Imagewheel网站搭建 2 1 Imagewheel下载和安装 2 2 Imagewheel网页测试 2 3 cpolar的安装和注册 3 本地网页发布 3 1 Cpolar临时数据隧道
  • 基于java的物业管理系统设计与实现

    基于java的物业管理系统设计与实现 I 引言 A 研究背景和动机 物业管理系统是指对物业进行管理和服务的系统 该系统需要具备对物业信息 人员信息 财务信息等进行管理的能力 基于Java的物业管理系统设计与实现的研究背景和动机主要体现在以下
  • 一台java服务器可以跑多少个线程?

    一台java服务器可以跑多少个线程 一台java服务器能跑多少个线程 这个问题来自一次线上报警如下图 超过了我们的配置阈值 打出jstack文件 通过IBM Thread and Monitor Dump Analyzer for Java
  • 国外拨号VPS指南:开启你的全球网络之旅

    在当今数字化时代 互联网已经成为了我们生活的一部分 而要在全球范围内畅通无阻地访问互联网 拥有一个可靠的国外拨号VPS是非常重要的 无论您是为了工作 学习还是娱乐 国外拨号VPS都可以为您提供更广泛的网络体验 本文将为您提供国外拨号VPS的
  • GitLab CI 实现项目A更新代码自动触发项目B更新错误码文档

    一 CI CD简介 CI CD 是持续集成 Continuous Integration 和持续交付 持续部署 Continuous Delivery Continuous Deployment 的缩写 是一种软件开发和交付的最佳实践 这两
  • 为什么我强烈推荐大学生打CTF!

    前言 写这个文章是因为我很多粉丝都是学生 经常有人问 感觉大一第一个学期忙忙碌碌的过去了 啥都会一点 但是自己很难系统的学习到整个知识体系 很迷茫 想知道要如何高效学习 这篇文章我主要就围绕两点 减少那些罗里吧嗦的废话 直接上干货 CTF如
  • ESP10B 锁定连接器

    ESP10B 锁定连接器 ESP10B 电机新增内容包括双极型号标准 NEMA 尺寸 17 23 和 34 的步进电机现在包括输出扭矩范围从 61 盎司英寸到 1291 盎司英寸的双极型号 该电机配有带锁定连接器的尾缆 可轻松连接 每转可步
  • 【安全】简单解析统一身份认证:介绍、原理和实现方法

    深入解析统一身份认证 介绍 原理和实现方法 导语 统一身份认证是什么 统一身份认证的原理 统一身份认证的实现 结语 导语 随着互联网的发展和各种在线服务的普及 用户在不同的应用和平台上需要进行多次身份验证 为了简化用户的登录和减少重复操作
  • 2023下半年软考「单独划线」合格标准公布

    中国计算机技术职业资格网发布了 关于2023年度下半年计算机软件资格考试单独划线地区合格标准的通告 2023下半年软考单独划线地区合格标准各科目均为42分 01 官方通告 关于2023年度下半年计算机软件资格考试单独划线地区合格标准的通告
  • 如何知道Netty ByteBuf中是否没有数据可读取?

    我是 Netty 新手 文件传输的问题让我困惑了好几天 我想发送image文件从客户端到服务器 下面的代码是可执行的 但只有我shutdown服务器强制我可以正常打开收到的图像文件 否则 显示 您似乎没有查看此文件的权限 检查权限并重试 所
  • 客户端 ECC SSL 证书包含“未知命名曲线”

    问题背景 我正在一个现有的库中工作 该库在远程服务器上使用 SSL 和 netty 框架 我遇到 SSL TLS 握手错误 错误如下 javax net ssl SSLProtocolException java io IOExceptio
  • Netty 4. ByteToMessageCodec之后的并行处理

    If a NioEventLoopGroup被用作workerGroup 之后的消息ByteToMessageDecoder处理程序 对于单个连接 通过以下处理程序以顺序 单线程 方式处理NioEventLoop 是否有可能让它们在之后由另
  • Netty 4.0多端口,每个端口有不同的协议

    我想 netty 是我所知道的最好的 java 网络框架 在阅读并尝试一些示例后我有疑问 1 使用netty 4 0创建具有不同协议的多端口网络服务器的最佳方法是什么 每个服务器创建 EventLoopGroup bossGroup new
  • Netty:如何处理从 ChunkedFile 接收到的块

    我是 netty 新手 我正在尝试将分块文件从服务器传输到客户端 发送块工作得很好 问题在于如何处理接收到的块并将它们写入文件 我尝试的两种方法都会给我带来直接缓冲区错误 任何帮助将不胜感激 Thanks Override protecte
  • Netty中如何发送带有POST参数的请求?

    我正在尝试在 Netty 中发送带有 POST 参数的请求 我搜索了 Netty API Google 和这里 Stack Overflow 但没有找到什么好的办法 这可能是我糟糕的搜索技巧的错 如果是这样 我道歉 有没有什么API可以轻松
  • Netty 和字节顺序

    由于文档不完善并且缺乏 Netty 经验 我遇到了一些问题 我不知道如何设置默认的 ByteOrder 我需要一个小尾数法默认设置 如果有人能给我一些关于这方面的提示 我会很高兴 你可以使用Bootstrap setOption 去做这个
  • 不同的 Netty 版本及其用途

    我现在使用Netty有一段时间了 但永远无法解决这个问题 一个人可以下载四个不同的版本 其中三个正在积极开发中 3 x 4 0 x 4 1 x 5 x 据我了解 3 x 适用于 JRE 1 5 而 JRE 的其他所有版本都高于此版本 我使用
  • 为什么我的 Camel Netty 路由会在 JMS 消息的开头添加换行符?

    我有一个 Camel Netty 路由 它将 XML 发送到服务器端口并将其放入 JMS 消息中 在第一条消息之后 所有其他消息的顶部都有一个换行符 导致当 GUI 收到它时 我的 XML 无法解组 我的路线是这样的

随机推荐

  • element-UI使用el-select做字典映射时label值不显示问题

    问题描述 在使用elementUI的el select组件时做了字典影射 但是在选择option选项后选择框内并没有选中的值出现 这是通过调试发现被绑定的值已经改变 进行别的操作更新完dom后发现选项更新 操作 点击选择test选项 此处是
  • 简单了解YOLOv8

    简单介绍YOLOv8 这里主要关注模型的backbone和后处理的过程 并通过对比YOLOv5的架构来更深入的了解YOLOv8 模型框架 YOLOv5中的C3替换为更精简的C2f 即增加了更多的跳跃连接和split操作 Backbone 中
  • uniapp 自定义标题情况下,让标题和右侧胶囊对齐

    实现效果 无论手机类型怎么切换 自定义标题始终跟胶囊平齐 实现 在pages json文件中配置标题自定义 在index vue页面 编写自定义的标题内容 在onLoad里可以计算高度
  • 【深度学习】入门理解ResNet和他的小姨子们(三)---ResNeXt

    文章名称 Aggregated Residual Transformations for Deep Neural Networks 文章链接 https arxiv org abs 1611 05431 其实ResNeXt这个网络结构严格说
  • 大规模流量下的云边端一体化流量调度体系

    火山引擎是字节跳动旗下的云服务平台 将字节跳动快速发展过程中积累的增长方法 技术能力和工具开放给外部企业 提供云基础 视频与内容分发 数智平台VeDI 人工智能 开发与运维等服务 帮助企业在数字化升级中实现持续增长 LiveVideoSta
  • 构建领域驱动的Java应用

    引言 在现代软件开发中 设计和构建复杂的应用程序是一项充满挑战的任务 为了更好地满足业务需求和提供可维护的代码 软件开发者需要采用一些强大的工具和技术 领域驱动设计 Domain Driven Design 简称DDD 是一种优秀的方法 它
  • Codeforces 1210 D Konrad and Company Evaluation —— 暴力

    This way 题意 现在有n个人 第i个人的工资一开始是i 现在有一些人相互讨厌 然后如果第x个人和第y个人相互讨厌 并且x的工资比y高 那么x就会向y炫耀 x y z这三个人的组合是危险的 当x会向y炫耀 y会向z炫耀 每次修改一个人
  • 用户消费行为分析

    消费品用户行为分析 根据CDNOW的一段用户订单数据进行消费行为分析 CDNow是一家在线音乐零售平台 后被德国波泰尔斯曼娱乐集团公司出资收购 其资产总价值在最辉煌时曾超过10亿美元 下面主要通过分析CDNow网站的用户购买明细来分析该网站
  • Kafka拉取某一个时间段內的消息

    一般来说我们都使用Kafka来记录用户的操作记录以便后续分析 但是通常使用的时候需要按天来统计每天的去重用户数 点击量之类的 这个时候如果直接拉某个topic的数据的话 就需要判断每个消息的时间戳 还要兼顾把所有的Partition都拉完才
  • 考试系统服务器考试机,考试系统

    考试系统为 B S 结构 考试中心需具备 Win2000 服务器且安装 IIS5 0 的软件环境和一定规模的局域网硬件环境 视参加考试的学员人数决定 客户端须安装 IE5 0 或以上浏览器版本 本系统从技术上充分考虑了考试过程的完整性和安全
  • 为自己量身打造一个 Rust 项目模板/脚手架

    摘要 quick start rs quick start a rust project 是用于快速创建一个 rust 项目的脚手架 模板 标题 为自己量身打造一个 Rust 项目模板 脚手架 深度参考 Rust Code Quick St
  • 【运维工程师笔试试题】

    一 选择题 1 下列系统默认端口号错误的是 A SSH端口22 B mysql端口3306 C Telnet端口20 D Https端口443 2 linux系统中查看ip地址的命令是 A ipconig B ifconfig C icmp
  • java编写es搜索程序

    开发环境 java8 springboot pom文件导入依赖
  • 前端HTML网页之间传递数据多种办法,附代码案例

    先看效果 目前常用的有三种办法 session传递 cookie传递 url传递 url会暴露参数 其余的两个是保存在服务端和浏览器中 不会暴露在地址栏里面 使用url 下面依次介绍 一 session传递 index html h1 We
  • 微服务连接云端Sentinel 控制台失败及连接成功后出现链路空白问题(已解决)

    sentinel控制台服务器部署在云端 首先打算在本地启动微服务连接云上的sentinel 发现仅能注册进服务 却不能显示监控信息和链路信息 查询日志后发现 云上的sentinel只能从注册中心拿到微服务 但是还是没有真正的连上8179端口
  • CSS—— @keyframes 动画关键帧

    disc 动画名 可自定义 keyframes disc from transform rotate 0deg to transform rotate 360deg 说明 keyframes 1 from to 用于简单动画 只有起始和结束
  • 我是如何从不知道怎么写,到完成二十万字书稿的?

    一 去年过年的时候 父母从乡下来到我在洛阳的家 晚上陪他们看完新闻联播后 我忍不住激动的心情 特意把北航出版社给我签的书稿 Web全栈开发进阶之路 合同捧出来给他们看 并郑重其事地介绍了一番 我以为他们会大吃一惊 像孙权对吕蒙那样对我刮目相
  • 双层双向长短期记忆神经网络(bi-LSTM)的多输入时间序列回归预测——附代码

    目录 摘要 研究背景 滑动时间窗口的构建 双层双向长短期记忆神经网络构造 程序计算结果 本文Matlab代码分享 摘要 为了充分挖掘电力负荷与多维特征因素的非线性关系 提高负荷预测精度 提出了一种基于随机森林和双向长短期记忆 Bi LSTM
  • hp服务器显示完logo就黑屏,惠普电脑开机出现惠普标志后 便黑屏了是为什么

    惠普电脑开机出现惠普标志后黑屏的原因及解决办法 一 原因 1 内存条 显示器 显卡等硬件设备接触不良 2 电脑灰尘比较多使得散热不良致使CPU或显卡芯片温度过高而死机 3 恶意病毒入侵 破坏系统 4 系统文件损坏 二 解决办法 1 检查显示
  • 数据传输-零拷贝机制

    传统 IO 在开始谈零拷贝之前 首先要对传统的 IO 方式有一个概念 基于传统的 IO 方式 底层实际上通过调用read 和write 来实现 通过read 把数据从硬盘读取到内核缓冲区 再复制到用户缓冲区 然后再通过write 写入到so