深入学习零拷贝

news2025/1/10 18:15:19

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

零拷贝、直接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.coloradmin.cn/o/2040611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

uniapp自定义请求头信息header

添加请求头:uniapp自定义请求头信息header 代码

Java性能优化之并发编程:深入解析与实战技巧

在Java应用程序的性能优化中,并发编程是一个关键领域。通过合理使用并发编程技术,可以充分利用多核CPU的计算能力,提高程序的执行效率。本文将深入探讨Java并发编程的优化策略,并提供一些实用的代码示例和实战技巧。 1. 线程与同…

Linux Day1 系统编程和文件操作

系统编程内容 文件I/O (输入/输出): 1)使用标准库函数如fopen, fclose, fread, fwrite, fgetc, fputc, fgets, fprintf, fscanf等进行文件操作。 2)使用open, close, read, write等系统调用来实现底层文件操作。 进程管理: 1)使用fork, e…

力扣 3152. 特殊数字Ⅱ

题目描述 queries二维数组是nums数组待判断的索引区间(左闭右闭)。需要判断每个索引区间中的nums相邻元素奇偶性是否不同,如果都不同则该索引区间的搜索结果为True,否则为False。 暴力推演:也是我最开始的思路 遍历q…

招聘技术研发类岗位,HR会考察候选人哪些方面?

技术研发团队在当下的企业视为发展的核心,对于企业长期发展和市场竞争力至关重要,作为HR,如何选拔技术研发岗位的人才,也是难度较大的工作。 作为应聘者来说,同样应该主动去了解HR是如何考察技术性人才,以…

使用docker部署rabbitmq集群

部署环境准备 192.168.81.128 rabbitmq-1 192.168.81.129 rabbitmq-2 192.168.81.130 rabbitmq-3 首先创建挂载目录(三个节点都创建) systemctl stop firewalld && setenforce 0 关闭防火墙和selinux mkdir /data/rabbitmq -p cd /da…

加和分数、训练、测试

一、加和所有alignment的分数 1、路线图中 2、l_i只与token有关,有一个专门训练的网络;h_i变化只与null有关 3、distribution生成的概率不受路径影响,只要到达位置概率就是一样的 4、计算alignment分数的总和 (1)αi…

Word转html并移植到web项目

1.打开对应word文件 建议使用web视图查看文档 这样可以提前预览转转成html样式 2.如果有图片修改图片大小及格式 在web视图下,把图片调制适当大小,不然导出的html可能图片较小 3.点击另存为 4.选择网页格式,同时将后缀修改为html(默认是h…

从springBoot框架服务器上下载文件 自定义一个启动器

在springboot框架中下载服务器存储的图片: 1)springboot默认访问放行的目录只有static,在static目录下存放图片资源 2)编译后的static目录中有一个1.png 2.5)编写控制器: Controller //RequestMapping("/upload&q…

如何在 Linux 内核中高效使用链表:原理与实践

文章目录 前言一、Linux内核链表源码分析1.链表的初始化1. 静态初始化宏 LIST_HEAD_INIT(name)宏 LIST_HEAD(name) 2. 动态初始化函数 INIT_LIST_HEAD(struct list_head *list) 对比总结2.链表的添加list_add 函数的定义函数参数内部实现__list_add 函数 list_add 的功能总结使…

Java Spring|day4.SpringCloud

SpringCloud 定义 springcloud是分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体,俗称微服务全家桶。实现的功能有服务注册与发现,服务调用,服务熔断,负载均衡,服务降级,…

Excel公式合并同类项

Excel公式合并同类项 1、新建表,用公式引用要处理的数据,快速选中表格复制公式2、 合并同类项,复制数据,删除重复项3、 sumif()合并同类项4、vlookup()复制同类项 1、新建表,用公式引用要处理的数据,快速选…

docker数据卷:

docker数据卷: 容器和宿主机之间数据共享 容器和宿主机之间数据共享——————挂载卷————容器内的目录和宿主机的目录进行挂载,实现数据文件共享 容器的生命周期有限,一旦重启所有对容器内部文件数据的修改以及保存的数据都会被初始…

深入理解 iOS 中的 AutoLayout(二)

目录 前言 一、UIStackView自动布局 1.简单的UIStackView 2.嵌套的UIStackView 二、AutoLayout高级用法 1.以编程方式创建约束 1.布局锚点 1.主要特点 2.常见子类 1.NSLayoutXAxisAnchor 2.NSLayoutYAxisAnchor 3.NSLayoutDimension 3.常用方法 4.…

SQL server数据库备份和还原

新手小白都懂的sql server数据库备份和还原 一、备份 1.打开sql server数据库找到 2.展开找到对应的数据库文件 鼠标右击—任务–备份 3.复制名称 4.复制完点击添加 5.点击添加完之后再次点击查找路径 6.分别两个路径 原路径和新路径 (新路径是找到原路径新建了一…

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. 问题解决

问题描述 原来我的服务器docker服务运行正常,但在某次尝试用时, 根据系统的错误提示执行了snap install docker指令之后, 再执行docker ps命令则提示Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running…

Arm Linux 串口 open 标志引起的问题

一、测试环境 硬件&#xff1a;nuc980 开发版 系统&#xff1a;Linux 4.4 二、open 函数描述 函数 open 的介绍 头文件 #include <fcntl.h>原型 #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>int open(const char *pathname,…

LabVIEW开发HVAC总成真空检测及监控系统

在HVAC&#xff08;Heating, Ventilation, and Air Conditioning&#xff0c;供暖、通风与空气调节&#xff09;总成制造过程中&#xff0c;真空检测是确保产品质量的重要环节。真空度是判断HVAC总成密封性能和气密性的关键指标&#xff0c;因此需要一个自动化、精准且可追溯的…

上海泌尿专家来黄山新晨医院义诊,解决患者前列腺等疑难疾病

为满足广大男性对自身健康的关爱、让男性患者不出远门&#xff0c;就能享受到高质量的上海男科诊疗服务&#xff0c;7月28日黄山新晨医院特邀请上海第四人民医院泌尿外科周铁主任团队到院&#xff0c;开展男科疾病义诊活动。 周铁主任为中华医学会泌尿外科分会男科学组委员&…

【docker系列】docker删除指定容器

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…