深入学习零拷贝

在学习中遇到了一个问题就是什么是零拷贝,因此学习之后以此来记录一下。

零拷贝、直接I/O、异步I/O等,优化的目的就是为了提高系统的吞吐量,减少访问磁盘次数。访问磁盘的速度会比读写内存会慢十倍以上。因此就需要提高它的读写速度。

什么是DMA?

DMA(Direct Memory Access)是直接内存访问技术。在进行I/O设备和内存数据传输的过程中,数据搬运的过程全部交给DMA控制器,而CPU不参与任何与数据搬运的事情。

这样说可能不太明白。先看看没有DMA技术会是怎样:

  1. CPU发出对应的指令给磁盘控制器,然后返回
  2. 磁盘控制器收到命令后,将所需的数据从磁盘搬运到磁盘缓冲区中,之后发出中断
  3. CPU收到中断以后放下当前的事务优先处理中断请求(中断请求未完成不会处理其他事情),接着讲磁盘缓冲区的数据一次一个字节地读进自己的寄存器中,然后再把寄存器中的数据写入到内存。(所有图转自小林coding).

数据的传输过程都需要CPU来参与,且不能做其他事情,那么在使用千兆网络或者大量数据传输的时候一定忙不过来。于是就有了DMA技术

CPU不再参与将数据从磁盘缓冲区移动到内核缓存区中,工作全部由DMA完成。

传统的文件传输

如果服务器提供文件传输功能,最简单的方法就是将文件中磁盘中读取出来,然后通过网络协议发送给客户端。传统I/O设计到read()和write()。两次操作就会涉及到四次上下文切换(内核和用户态转换)和四次数据拷贝。

这种简单传统的文件传输中,存在冗余的上下文切换和数据拷贝,在高并发中多了很多不必要的开销。因此要提高文件传输的性能,就需要减少上下文切换和内存拷贝的次数

如何实现零拷贝?

  • mmap + write
  • senfile

mmap+write :

用mmap来替换掉read。那么mmap()系统调用函数会直接把内存缓冲区的数据映射到用户空间,这样就不需要与用户缓冲区做交换,减少了一次数据拷贝的过程,但是依旧会有4次上下文的切换与3次数据拷贝

sendfile

在Linux内核版本2.1中,提供了专门发送文件的系统调用函数sendfile()

用这一个函数代替read和write那么就意味着可以减少两次上下文切换的开销。该调用会直接将内核缓冲区的数据拷贝到socket缓冲区内,不再需要拷贝到用户态。这样就只有两次上下文切换和三次数据拷贝。

而真正的零拷贝对网卡支持SG-DMA(The Scatter-Gather Direct Memory Access)技术,还可以进一步减少数据拷贝的过程。

DMA将磁盘缓冲区的数据拷贝到内核缓冲区中,将缓冲区描述符和数据长度放到socket缓冲器中,这样SG-DMA控制器直接将内核缓存中得到数据拷贝到网卡缓存区中。减少了将数据拷贝到socket缓冲区中的过程。

这就是零拷贝技术,并没有在内存层面区拷贝数据,全程没有通过CPU去搬运。零拷贝技术可以把文件传输的性能提高至少一倍以上。

使用零拷贝技术的项目:

Kafka为什么有那么高的吞吐量原因之一就是使用到了零拷贝技术。

在Kafka文件传输的源码中会发现他调用了Java NIO库中的transferto方法,而Linux系统支持sendfile()系统调用,实际上使用到senfile()系统调用函数。

PageCache内核缓冲区

前面提到的内核缓冲区实际是PageCache(磁盘高速缓存)。

PageCache的优点:

  • 缓存最近被访问的数据
  • 预读功能

程序运行的时候,具有「局部性」,所以通常刚被访问的数据在短时间内再次被访问的概率很高,于是我们可以用 PageCache 来缓存最近被访问的数据,当空间不足时淘汰最久未被访问的缓存。

预读:假设read每次读取32kb,虽然read只读取这么多,但内核会将32-64kb也读取到PageCache中,这样读取后面的内容成本就很低。在这些数据被清理之前读到就会减少很多开销。

但是在大文件传输中,PageCache很可能会不起作用,就会浪费DMA多做的一次数据拷贝,造成性能降低。

大文件传输的问题:

  • PageCache被大文件占据,其他热点文件啊可能无法享受到福利
  • PageCache 中的大文件数据,由于没有享受到缓存带来的好处,但却耗费 DMA 多拷贝到PageCache 一次;

因此为何总是将大文件的传输需要是要另外的方式实现。

大文件传输实现方式

可以使用异步IO+直接IO的方式。

异步IO:

内核向磁盘发起读请求,可以不等数据就会就返回,处理其他事情。内核将磁盘中的数据拷贝到进程缓冲区后,进程收到内核的通知再去处理数据。

异步IO直接绕过PageCache,绕过PageCache的叫做直接IO。通常对于磁盘异步IO只支持直接IO

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

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

相关文章

视频融合项目中的平台抉择:6大关键要素助力精准选型

随着安防监控系统行业的快速发展,视频融合项目逐渐成为城市治理、企业管理及智能建筑等领域的重要组成部分。视频融合平台作为视频数据整合、管理和分析的核心,其选择直接影响到项目的成功与否。 在当前智慧业务类项目的集成过程中,我们不仅…

【网络协议】网络劫持 - ARP/DNS欺骗篇

前言 网络劫持是一种网络攻击技术,攻击者通过拦截、篡改或重定向数据流量,控制用户的网络通信路径,干扰正常的网络服务。其方式可能包括DNS劫持、ARP欺骗和HTTP劫持等。通过这些手段,攻击者可以窃取敏感信息如个人身份数据和财务信…

【实现100个unity特效之20】用unity实现物品悬浮和发光像素粒子特效

最终效果 文章目录 最终效果新增飞升粒子效果光圈效果修改不同颜色完结 新增飞升粒子效果 效果 光圈效果 效果 修改不同颜色 完结 赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持…

望获实时Linux与EtherCAT的硬实时解决方案

在追求极致实时性与可靠性的工业自动化领域,望获实时Linux以其卓越的实时性能和广泛的兼容性,正逐步成为工业控制领域的核心力量。结合EtherCAT这一高效通信协议,我们共同打造了一套创新的硬实时工业控制方案,旨在满足现代工业对快…

数学建模——评价决策类算法(层次分析法、Topsis)

一、层次分析法 概念原理 通过相互比较确定各准则对于目标的权重, 及各方案对于每一准则的权重,这些权重在人的思维过程中通常是定性的, 而在层次分析法中则要给出得到权重的定量方法. 将方案层对准则层的权重及准则层对目标层的权重进行综合, 最终确定方案层对目标…

6.mysql事务

MYSQL事务 1.事务简介2.事务操作2.1 方式一2.2 方式二 3.事务四大特性(ACID)4.并发事务问题5.事务隔离级别 1.事务简介 事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有操作作为一个整体一起想系统提交或撤销操作…

不懂就问,猫咪一到夏天就疯狂掉毛?宠物毛发异味怎么处理?

相信很多新手铲屎官都有这样的疑问,随着气温升高,家里的猫孩子疯狂掉毛,还有愈演愈烈的趋势。不用担心,这是因为宠物到了换毛季。猫咪的换毛季一年两次,多集中在春天和秋天,但也有很多猫咪的掉毛期无限延长…

中小型企业可用的数据采集监控平台 为生产带来众多改变

中小型企业采用数据采集监控平台可以显著提升生产效率、优化生产流程、增强决策能力,并带来一系列积极的改变。 数据采集监控平台可提供从边缘感知设备到云端的数据采集、存储、分析、可视化等服务,实现生产工艺流程仿真、设备运行状态监控、数据报表、趋…

【无标题】Unity Asset Hunter 插件

Asset Hunter PRO是Unity的一款插件,用于分析工程内的资源使用情况,资源大小,分析资源依赖关系,可以用来清理项目中未使用的资源。尤其是项目较大时,删除没有使用的资源很有帮助。 对于项目UI图片修改次数过多时&…

C++ | list

前言 本篇博客讲解cSTL中的list 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青年 (pu-tong-young-man) - Gitee.com 若有问题 评论区见📝 🎉欢迎大家点赞&…

FMR—Feature-metric Registration论文解读

目录 一、导言 二、先导知识 1、逆组合算法 三、相关工作 1、优化算法为主的配准工作 2、基于特征的点云配准 3、端到端学习的配准 四、FMR框架 1、Encoder模块 2、Decoder分支模块 3、特征指标配准分支模块 4、损失函数 五、数据集 1、ModelNet40 2、7Scene数据…

SpringBoot快速入门(自动创建)

目录 前言 步骤 1 创建项目 2 选择生成器springBoot 3 修改后,如图所示 4 点击下一步 5 点击Web----SpringWeb 6 点击创建 6.1 如果发生报错如: 6.2 替换合适版本,等待重新加载 7 添加contronller类 7.1 添加HelloController 类 8 ​​创建…

基于JAVA的医院管理住院系统研究与实现

点击下载源码 基于JAVA的医院管理住院系统研究与实现 摘 要 医院管理住院系统是一项集多类学科为一体的系统,其中包含医学、信息、计算机等学科,广泛的应用在当今欧美等发达国家,给治疗患者们提供了很大的便利。假如全面实现了这一系统&…

【启明智显技术分享】工业级HMI芯片Model3A开发过程中问题记录笔记

一、Model3A芯片介绍 Model3A是启明智显针对工业、行业以及车载产品市场推出的一款高性能、低成本的工业级HMI(Human-Machine Interface,人机界面)芯片。该芯片主要应用于工业自动化、智能终端HMI、车载仪表盘、两轮车彩屏仪表、串口屏、智能…

Docker容器管理之FAQ

一、前言 某次,某容器服务发现无法使用了,查看状态为restaring状态,后看是云主机重启了,导致本地的nfs-server未自动启动,导致关联的集群主机,远程挂载点无法使用,影响容器服务运行。故此&#…

老师分班查询助手,新学期老师都在用!

作为一名教师,您是否曾经在新学期伊始,面对着一堆学生名单和分班结果,感到无从下手?是否曾经历过在黑板上一笔一划地写下每个学生的名字和班级,然后一遍又一遍地回答家长和学生的询问?这样的场景&#xff0…

web页面的性能测试

背景 测试大模型主要web页面的性能 使用工具 通过google自带的lighthouse测试页面的性能 各个参考指标 First Contentful Paint(FCP):测量在用户导航到页面后浏览器呈现第一段 DOM 内容所花费的时间。页面上的图像、非白色<canvas>元素和 SVG 被视为 DOM 内容&#…

ECMAScript6语法:类

在 ES6 中新增了类的概率&#xff0c;多个具有相同属性和方法的对象就可以抽象为类。类和对象的关系如下&#xff1a; &#xff08;1&#xff09;类抽象了对象的公共部分&#xff0c;它泛指某一大类&#xff08;class&#xff09;。 &#xff08;2&#xff09;对象特指通过类…

Linux:基础IO

目录 1. stdin & stdout & stderr 2. 系统文件I/O 1. 接口介绍 open write read close lseek 2. open函数返回值 3. 文件描述符fd 0 & 1 & 2 文件描述符的分配规则 重回定向 dup2 简易Shell的模拟实现 4. FILE 5. 再谈对文件的理解 1. stdin …

threejs webgl效果 功能特效

雷达效果 ​飘扬的红旗 光柱效果 OD线 下雪 下雨 光墙效果 能源球 烟火效果 threejs烟花效果 光圈效果 threejs 光圈 波动 function initScene() {scene new THREE.Scene();}function initCamera() {camera new THREE.PerspectiveCamera(45, window.innerWidth / window.inne…