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

news2024/10/7 18:30:18

在目前主流的系统中,其实大多数都是数据密集型系统,所以设计数据密集型应用一书非常经典,推荐一读。而大多数遇到的问题都是存储问题。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.coloradmin.cn/o/947031.html

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

相关文章

对class文件进行base64编码

使用以下代码 package org.springframework.cloud.gateway.sample;import org.springframework.util.Base64Utils;import java.io.*; import java.nio.charset.StandardCharsets;public class EncodeShell {public static void main(String[] args){byte[] data null;try {In…

大数据之linux入门

一、linux是什么 linux操作系统 开发者是林纳斯-托瓦兹,出于个人爱好编写。linux是一个基于posix和unix的多用户、多任务、支持多线程和多CPU的操作系统。 Unix是20世纪70年代初出现的一个操作系统,除了作为网络操作系统之外,还可以作为单…

6路液体水位检测芯片VK36W6D SOP16 抗电源干扰及手机干扰特性好

产品品牌:永嘉微电/VINKA 产品型号:VK36W6D 封装形式:SOP16/QFN16L 详细资料:13.5/5.474/4.703 概述 VK36W6D具有6个触摸检测通道,可用来检测6个点的水位。该芯片具有较高的集成度,仅需极少的外部组件便…

vscode GDB 调试linux内核 head.S

遇到的问题 此前参考如下文章 https://zhuanlan.zhihu.com/p/510289859 已经完成了在ubuntu 虚拟机用vscode 调试linux 内核。但是美中不足的是,断点最早只能加在__primary_switched() 函数。无法停在更早的断点上,比如ENTRY(stext) 位置。参考《奔跑吧…

C语言_初识C语言指针

文章目录 前言一、指针 ... 一个内存单元多大比较合适?二、地址或者编号如何产生?三、指针变量的大小 前言 内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。 所以为了有效的使用内存,就把内存划分成一个个…

记1次前端性能优化之CPU使用率

碰到这样的一个问题,用户反馈页面的图表一直加载不出来,页面还卡死 打开链接页面,打开控制台 Network 看到有个请求一直pending,结合用户描述,页面一直loading,似乎验证了我的怀疑:后端迟迟没有相应。 但是…

【工作笔记-0038】mongodb mongorestore 命令行导入 bson.gz数据

1. 导出的集合文件格式如下(也就是导出的表文件): 例如: D:\Files\xxxx集合名称.bson.gz 怎样导出,这里不做介绍,用 mongodb compass 或者 studio 3t 都可以 2. 下载命令行导入工具: 官方…

webpack(一)模块化

模块化演变过程 阶段一:基于文件的划分模块方式 概念:将每个功能和相关数据状态分别放在单独的文件里 约定每一个文件就是一个单独的模块,使用每个模块,直接调用这个模块的成员 缺点:所有的成员都可以在模块外被访问和…

Redis发布订阅

Redis发布订阅 Redis 发布订阅(pub/sub)是一种 消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis 客户端可以订阅任意数量的频道。 订阅/发布消息图: 下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —…

时间范围选择时选中日期所使用的当日内具体时刻 如00:00:00= 23:59:59

<el-form-item label"审核时间&#xff1a;"><el-date-pickerv-model"auditTime"type"datetimerange"range-separator"至"value-format"yyyy-MM-dd HH:mm:ss"start-placeholder"开始日期"end-placeholde…

智慧园区方案:AI与视频融合技术如何助力园区监管智能化升级?

一、行业背景 随着科技的不断发展&#xff0c;人工智能&#xff08;AI&#xff09;技术正在各个领域迅速应用和推广。其中&#xff0c;智慧园区是一个重要的应用场景&#xff0c;它通过AI技术的支持&#xff0c;实现了园区的智能化管理和高效运营。 1、园区管理智慧化升级需求…

Centos7 安装Docker管理工具Portainer

0、前提条件 已安装Docker并且开启Docker&#xff0c;安装Docker可参见&#xff1a;Centos7 安装 Docker_瘦身小蚂蚁的博客-CSDN博客 1、 拉取portainer-ce镜像 docker pull portainer/portainer-ce:latest [rootlocalhost ~]# docker pull portainer/portainer-ce:latest la…

git视频教程Jenkins持续集成视频教程Git Gitlab Sonar教程

[TOC这里写自定义目录标题) https://edu.51cto.com/lesson/290903.html 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。…

科技资讯|苹果Vision Pro头显申请游戏手柄专利和商标

苹果集虚拟现实和增强现实于一体的头戴式设备 Vision Pro 推出一个月后&#xff0c;美国专利局公布了两项苹果公司申请的游戏手柄专利&#xff0c;其中一项的专利图如下图所示。据 PatentlyApple 报道&#xff0c;虽然专利本身并不能保证苹果公司会推出游戏手柄&#xff0c;但是…

JVM 是怎么设计来保证new对象的线程安全

1、采用 CAS 分配重试的方式来保证更新操作的原子性 2、每个线程在 Java 堆中预先分配一小块内存&#xff0c;也就是本地线程分配缓冲&#xff08;Thread Local AllocationBuffer&#xff0c;TLAB&#xff09;&#xff0c;要分配内存的线程&#xff0c;先在本地缓冲区中分配&a…

15-mongodb

一、 MongoDB 简介 1 什么是 MongoDB MongoDB 是一个基于分布式文件存储的数据库。由 C语言编写。在为 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系…

自动化实时在线静电监控系统的构成

自动化实时在线静电监控系统是一种帮助企业监测和管理静电问题的技术解决方案。静电在许多工业和商业环境中都是一个潜在的风险和生产问题。通过使用这样的监控系统&#xff0c;企业可以及时发现并采取对策来预防或减轻可能的静电问题。 该系统通常由以下组成部分构成&#xf…

HTML及CSS入门及精通

前言 HTML&#xff08;超文本标记语言&#xff09;和CSS&#xff08;层叠样式表&#xff09;是构建网页的两个基本技术。HTML用于定义网页的结构和内容&#xff0c;而CSS用于控制网页的样式和布局。本教程将介绍HTML和CSS的入门知识&#xff0c;并逐步引导您掌握更高级的技巧和…

智安网络|探索物联网架构:构建连接物体与数字世界的桥梁

物联网是指通过互联网将各种物理设备与传感器连接在一起&#xff0c;实现相互通信和数据交换的网络系统。物联网架构是实现这一连接的基础和框架&#xff0c;它允许物体与数字世界之间的互动和协作。 一、物联网架构的概述 物联网架构是一种分层结构&#xff0c;它将物联网系…

ceph中PGLog处理流程

ceph的PGLog是由PG来维护&#xff0c;记录了该PG的所有操作&#xff0c;其作用类似于数据库里的undo log。PGLog通常只保存近千条的操作记录(默认是3000条&#xff0c; 由osd_min_pg_log_entries指定)&#xff0c;但是当PG处于降级状态时&#xff0c;就会保存更多的日志&#x…