【操作系统】聊聊文件传输的零拷贝、PageCache、异步IO机制

在目前主流的系统中,其实大多数都是数据密集型系统,所以设计数据密集型应用一书非常经典,推荐一读。而大多数遇到的问题都是存储问题。CPU、内存 因为本身的读写速度比较快,所以磁盘就成为了一个性能瓶颈。

针对磁盘优化的技术层出不穷,比如零拷贝、直接IO、异步IO、PageCache等,本质都是为了提升系统的吞吐量、降低操作时延。减少磁盘和CPU设备的工作量。

文件传输过程

假设,我们请求从服务端下载文件,服务端的整体处理流程是 用户进程从本地磁盘获取文件,然后将文件通过socket缓冲区发送到网络中,如果一个文件是320MB,一次拷贝32KB的话,那么整体就是拷贝1W次。
而从图中可以分析出一次文件拷贝 从用户态到内核态切换了4次。

  • 1.用户态发起read文件,切换到内核态,然后从磁盘中读取文件到pageCache中。
  • 2.内核态返回数据到用户态的用户缓冲区中。
  • 3.用户态调用write写入到socket缓冲区中。
  • 4.最后返回结果切回用户态。

而如果一次文件拷贝是4次的话,那么整体就是4W次。放在高并发系统下,虽然一次可能需要几十纳秒到几微秒。但是当请求数在几十万、百万级别的情况下,这个情况会被放大。

可以很容易分析出,问题的瓶颈在于用户态到内核态的上下文切换以及内存拷贝次数过多。
在这里插入图片描述

零拷贝

上面我们通过分析,其实性能瓶颈主要在于文件的拷贝次数,以及多次的上下文切换。

上下文切换的原因主要在于,调用read、write函数,需要系统函数进行处理。如果想减少上下文切换次数,可以将read、write进行合并,在内核中直接完成数据的交换。

减少内存拷贝次数,多余的地方在于,从pageCache到用户缓冲区,以及用户缓冲区到socket缓冲区。

优化点1. 直接从pagecache拷贝到socket缓冲区。这样整个过程就只有3次拷贝、2次上下文切换。
在这里插入图片描述
而如果网卡支持DMA技术,可以直接从pagecache写入到网卡中。只有2次拷贝。
在这里插入图片描述
所以总结一下,零拷贝的本质是通过减少上下文切换以及在用户态0次数据拷贝 以及来提升整体的文件读写性能。
而零拷贝技术是系统提升的新函数,可以接受文件描述符和TCP socket作为输入参数,可以完全在内核态完成数据的拷贝,减少了系统上下文切换,也减少了内存拷贝次数。

可以最大化利用socket缓冲区。socket缓冲区可用空间是动态变化的。
零拷贝让我们可以不必关心socket缓冲区的大小。将性能提升至少一倍以上。

PageCache

pagechache的作用主要是为了提升从磁盘读取数据的速度,并且可以采用预读功能,比如读一个文件1MB,先读取前64KB,那么后64KB也会写入到PageCahce中,并且pageCache有一定的时间局部性,以及数据淘汰策略,LRU。

但是针对于大文件读取,因为有预读功能,所以可能大文件会占满pageCache,导致小文件不能利用PageCache。所以大文件场景下不应该使用PageCahe和零拷贝。

异步IO+直接IO

那么针对大文件来说,一般采用异步IO和直接IO替换零拷贝技术。

如果是同步进行IO的话,整个过程用户进程其实是一直阻塞等待,不能很好的利用系统的并发性。
在这里插入图片描述
而异步IO,在发起读之后,直接返回,由内核准备好数据之后,通知用户进行进行操作,在整个过程中,不需要完全阻塞等待。
但是异步IO是不支持将数据写入到pageCache中。绕过pageCache称为直接IO。对于磁盘,异步IO只支持直接IO。
在这里插入图片描述

所以针对于大文件由异步IO和直接IO处理,小文件由零拷贝处理。至于文件阈值需要灵活配置。

小结

本篇主要介绍了零拷贝技术,零拷贝通过减少上下文切换次数,以及数据拷贝次数,提升整体的文件读写能力。并且还利用PageCache 来提升从磁盘读取文件的性能。而pageCache缓冲了最近访问的数据,并且有自己的数据淘汰策略。LRU。进一步提升了零拷贝技术。pageCache还提升了整体的写性能,先将数据写入到PageCache中,然后将数据异步到磁盘。
不对针对于大文件来说,建议直接使用异步IO+直接IO。
所以总结一下,为了提升文件传输的性能。基本上就是三个点。减少磁盘的工作量(pageCache缓存)、减少CPU的工作量(直接IO)
、提高内存利用率(零拷贝)。

并且很多中间件技术也通过零拷贝来提升性能,比如Kakfa、Netty等。

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

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

相关文章

Harbor 私有仓库迁移

文章目录 一.私有仓库迁移的介绍1.为何要对Harbor 私有仓库的迁移2.Harbor 私有仓库的迁移特点3. Harbor 私有仓库的迁移注意要点 二.私有仓库迁移配置1.源Harbor配置(192.168.198.11)(1)接着以下操作查看容器状况及是否可以登录 …

C语言之数组题

目录 1.使用函数实现数组操作 2.冒泡排序 3.三子棋 4.【一维数组】交换数组 5.扫雷 6.概念辨析tips 我又来了,今天是数组题,本人还在补军训真的热!🆗 1.使用函数实现数组操作 2.冒泡排序 3.三子棋 4.【一维数组】交换数组 …

Windows10 系统安装教程

多虚不如少实。 一、 下载安装包 下载前景:网上下载的 windows10 系统一般都有捆绑软件,用户体验不爽,所以建议到 正规渠道下载 windows10 系统的不同版本。另外网上也有一些 windows10 系统的镜像文件 可以直接一键安装,…

科技政策 | 四川省科学技术厅关于发布2024年第一批省级科技计划项目申报指南的通知

原创 | 文 BFT机器人 近日,四川省科学技术厅发布了2024年第一批省级科技计划项目申报指南;其中包括自然科学基金项目、重点研发计划、科技成果转移转化引导计划、科技创新基地(平台)和人才计划。 01 自然科学基金项目 实施周期 …

YOLOv5引入FasterNet主干网络,目标检测速度提升明显

目录 一、背景介绍1.1 目标检测算法简介1.2 YOLOv5简介及发展历程 二、主干网络选择的重要性2.1 主干网络在目标检测中的作用2.2 YOLOv5使用的默认主干网络 三、FasterNet简介与原理解析3.1 FasterNet概述3.2 FasterNet的网络结构3.2.1 基础网络模块3.2.2 快速特征融合模块3.2.…

打造互动体验:品牌 DTC 如何转变其私域战略

越来越多的品牌公司选择采用DTC 模式与消费者进行互动,而非仅仅销售产品。通过与消费者建立紧密联系,DTC模式不仅可以提供更具成本效益的规模扩张方式,还能够控制品牌体验、获取宝贵的第一方数据并提升盈利能力。然而DTC模式的经济模型比许多…

【C++】—— 异常处理

前言: 本期,我将给大家讲解的是有关 异常处理 的相关知识! 目录 (一)C语言传统的处理错误的方式 (二)C异常概念 (三)异常的使用 1、异常的抛出和捕获 1️⃣ 异常的…

layui 多选限制选择3个

可以使用 layui 的表单组件进行多选&#xff0c;然后通过 JavaScript 代码限制用户最多只能选择 3 个选项。具体的实现步骤如下&#xff1a; 在 layui 的表单组件中&#xff0c;使用多选框进行多选。 <div class"layui-form-item"><label class"layu…

【LeetCode-中等题】98. 验证二叉搜索树

文章目录 题目方法一&#xff1a;BFS 层序遍历方法二&#xff1a; 题目 方法一&#xff1a;BFS 层序遍历 利用层序遍历 拿到每一个节点 并且给每一个结点配备一个最大值和最小值的队列 只要节点在最大值和最小值之间就满足二叉搜索树的条件 public boolean isValidBST(TreeNo…

Docker的运用

文章目录 一、 Docker介绍二、Docker常用命令三、Docker 部署微服务项目四、Docker 使用场景五、Docker模拟场景5.1 模拟部署Nacos5.2 模拟部署Mongodb5.3 模拟部署RabbitMQ 一、 Docker介绍 Docker是一种开源软件平台&#xff0c;用于在不同的操作系统&#xff08;如Windows、…

RxJS如何根据事件创建Observable对象?

RxJS提供了一些用来创建Observable对象的函数&#xff0c;我们可以根据事件、定时器、Promise&#xff0c;AJAX等来创建Observable对象。 下面是根据事件创建Observable对象的几个例子。 this.outsideClick$ fromEvent(document, click).subscribe((event: MouseEvent) > …

C语言日常刷题6

文章目录 题目答案与解析1234567 题目 1、以下对C语言函数的有关描述中&#xff0c;正确的有【多选】&#xff08; &#xff09; A: 在C语言中&#xff0c;一个函数一般由两个部分组成&#xff0c;它们是函数首部和函数体 B: 函数的实参和形参可以是相同的名字 C: 在main()中定…

三电平离网逆变器接不平衡负载仿真

文章目录 **0、系统框图****1、纯阻性负载R****2、纯感性负载L****3、纯容性负载C****4、 RL负载****5、RC负载****6、CL负载****7、RLC负载** 0、系统框图 闭环控制 PWM调制 逆变桥 LCL滤波电路 负载&#xff08;可配置&#xff09; 坐标变换&#xff08;采样得到&#xff09;…

HTTP:http上传文件的原理及java处理方法的介绍

为了说明原理&#xff0c;以下提供一个可以上传多个文件的例子&#xff0c;html页面代码如下&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>http upload file</title> </head> <body>…

《存储IO路径》专题:IO虚拟化初探

大家好&#xff0c;欢迎来到今天的科技小课堂。今天我们要聊聊的是一项非常有趣且实用的技术——I/O虚拟化&#xff08;Input/Output Virtualization&#xff0c;简称IOV&#xff09;。想象一下&#xff0c;如果把物理硬件资源比作一道丰盛的大餐&#xff0c;那么IOV就是那位神…

【VRRP】虚拟路由冗余协议

什么是VRRP&#xff1f; 虚拟路由冗余协议VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;是一种用于提高网络可靠性的容错协议。通过VRRP&#xff0c;可以在主机的下一跳设备出现故障时&#xff0c;及时将业务切换到备份设备&#xff0c;从而保障网络通信的…

SQL注入之联合查询

文章目录 联合查询是什么&#xff1f;联合查询获取cms账号密码尝试登录 联合查询是什么&#xff1f; 适用数据库中的内容会回显到页面中来的情况。联合查询就是利用union select 语句&#xff0c;该语句会同时执行两条select 语句&#xff0c;实现跨库、跨表查询。 必要条件 两…

centos7安装docker-compose—及常见错误排解

目录 一、Docker-Compose概述Compose有2个重要的概念&#xff1a;一、安装docker-compose1.从github上下载docker-compose二进制文件安装 二、Docker-compose实战 二、Dcoker-compose 不好下载&#xff0c;你直接使用docker 一个一个的安装使用dockerfile安装各种服务组件 一、…

电商API接口的研发和应用!

API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;指的是为不同的软件应用程序提供编程接口的一组协议、规则以及工具的集合&#xff0c;以便它们能够互相交互&#xff0c;实现数据通信和功能调用。API已成为了现代软件开发和商业应用…

countDown+react+hook

道阻且长&#xff0c;行而不辍&#xff0c;未来可期 知识点一&#xff1a; new Date().getTime()可以得到得到1970年01月1日0点零分以来的毫秒数。单位是毫秒 new Date().getTime()/1000获取秒数1分钟60秒&#xff0c;1小时60分钟1hour:60*60>单位是秒 60*60*1000>单位…