首页 > 其他分享 >零拷贝IO

零拷贝IO

时间:2024-09-02 13:02:59浏览次数:13  
标签:内核 IO 缓冲区 磁盘 拷贝 PageCache

以下内容参考和转载自:小林coding,原来 8 张图,就可以搞懂「零拷贝」了

1、DMA

  在没有DMA(直接内存访问)技术之前,调用read()读取磁盘文件的话,会有5个步骤:CPU向磁盘发起IO请求—>磁盘控制器将数据放到磁盘缓冲区中后产生一个IO中断—>CPU收到IO中断信号后将磁盘缓冲区数据拷贝到内核缓冲区(PageCache)—>CPU将内核缓冲区的数据拷贝到用户缓存区—>然后read()返回。

  在CPU收到IO中断信号一直到read()返回中间这些步骤都是靠CPU完成的,而有了DMA技术后,磁盘不再产生IO中断而是通知DMA控制器,DMA将数据从磁盘缓冲区拷贝到内核缓冲区(PageCache)后向CPU发出信号,CPU再从内核缓冲区中数据拷贝到用户缓冲区。也就是说原来CPU干的活(将数据从磁盘缓冲区拷贝到内核缓冲区)现在交给了DMA,这样CPU在这段时间就能去干其他事情了。

  现在每个 I/O 设备里面都有自己的 DMA 控制器。

 2、上下文切换

  传统 I/O 的工作方式是,数据读取/写入是从用户空间到内核空间来回切换,如下所示的是从磁盘文件读取数据后发送到网卡的过程,一次read()或write()就会产生两次切换。之所以要发生上下文切换,这是因为用户空间没有权限操作磁盘或网卡,设备的操作都需要交由系统内核来完成:当read()/wirte()的时候,从用户态切换到内核态,当内核执行完任务后,再切换回用户态交由进程代码执行。

   

3、零拷贝

  从上面我们可以看到,一次read()+write()会产生2次+2次即4次拷贝:比如read()会将数据从磁盘拷贝到内核缓冲区(PageCache),然后再将数据从内核缓冲区拷贝到用户缓冲区,调用write()到socket的话,会将数据从用户缓冲区拷贝到socket缓冲区,然后再将数据从socket缓冲区拷贝到网卡缓冲区后发送数据。而read()+write()总共会产生4次上下文切换。如果我们能减少数据拷贝次数,并且减少上下文切换次数的话就会提高IO效率,这就是零拷贝技术。

  可以使用mmap()+sendfile()来实现零拷贝:mmap()可以将内核缓冲区内容「映射」到用户空间,这样内核缓冲区就是用户缓冲区,用户缓冲区也就是内核缓冲区,从而减少内核缓冲区到用户缓冲区的这一次拷贝。而使用sendfile()替换read()+write()的话,如果网卡支持 SG-DMA技术,那么sendfile()内部将内核缓冲区描述符和数据长度传到 socket 缓冲区后,SG-DMA 控制器可以直接将内核缓冲区的数据发送到网卡缓冲区,这样原来的4次拷贝就变成了现在的2次。而且由于内核缓冲区和socket缓冲区都属于内核态,原来的4次上下文切换现在也变成了2次,如下图所示。因为拷贝次数和上下文切换都少了一半,而且两次拷贝都不需要通过CPU,所以零拷贝技术可以将文件传输性能提高一倍以上。

  

4、PageCache

  前面所说的内核缓冲区,实际上是磁盘高速缓存(PageCache),PageCache会缓存最近被访问的数据(当空间不足时淘汰最久未被访问的缓存):读磁盘数据的时候,优先在 PageCache 找,如果数据存在则可以直接返回;如果没有,则从磁盘中读取,然后缓存到PageCache 中。PageCache还使用了“预读功能”:比如我们read() 0到32KB的数据的时候,其还会将后面32~64 KB的数据读取到PageCache,这样后面读取 32~64 KB 的成本就很低。

  所以,使用PageCache 的优点主要是两个:缓存最近被访问的数据,预读功能,这两个优点会大大提高读写磁盘的性能。

  然而,传输大文件的时候,使用PageCache会出现一些问题:一个就是大文件每当用户访问这些大文件的时候,内核就会把它们载入 PageCache 中,于是 PageCache 空间很快被这些大文件占满,所以现在PageCache中全是大文件的缓存数据,然而这些数据再次被访问的概率是比较低的,这样缓存光占了PageCache空间而未起作用。第二个问题就是由于文件太大,PageCache 空间很容易被这些大文件的缓存数据占满,这样其他「热点」的小文件数据就无法缓存到PageCache中。

5、大文件传输与异步IO

  大文件传输使用PageCache的话,很难享受到PageCache缓存带来的好处,那也就没必要将数据缓存到PageCache上了,而异步IO就是这样,它不使用PageCache:在发起读请求后立即返回,数据直接从磁盘控制器拷贝到用户缓冲区,然后再通知用户,如下图所示。绕开 PageCache 的 I/O 叫直接 I/O,使用 PageCache 的 I/O 则叫缓存 I/O。通常,对于磁盘,异步 I/O 只支持直接 I/O。

  

  

  所以,传输文件的时候,我们要根据文件的大小来使用不同的方式:

  • 传输大文件的时候,使用「异步 I/O + 直接 I/O」;
  • 传输小文件的时候,则使用「零拷贝技术」;

  在 nginx 中,我们可以用如下配置,来根据文件的大小来使用不同的方式,当文件大小大于1G后,使用「异步 I/O + 直接 I/O」,否则使用「零拷贝技术」:

location /video/ { 
    sendfile on; 
    aio on; 
    directio 1024m; 
}

  如果应用已经实现了磁盘数据的缓存,那么可以不需要 PageCache 再次缓存,以减少额外的性能损耗。比如在 MySQL 数据库中,可以通过参数来开启直接 I/O(避免使用PageCache),默认是不开启的。

5、异步IO与完成端口

  实际上,从形式上来讲,异步IO也是属于零拷贝IO,比如对于读来说是直接从网卡拷贝到用户缓冲区,没有中间的DMA拷贝。在网上看到说使用完成端口实现异步通信的时候,需要将SO_RCVBUF设置为0以实现零拷贝,但是有另一种说法是在Win2K之后,不再需要将SO_RCVBUF设置为0,系统会自动将数据复制到用户的接收缓冲区中。

标签:内核,IO,缓冲区,磁盘,拷贝,PageCache
From: https://www.cnblogs.com/milanleon/p/18388781

相关文章

  • Istio 基于头部分流
    分离部署istio下面的示例把数据平面和控制平面分开部署。自动生成配置文件可以istioctlprofiledumpempty加上配置文档然后进行修改。生产集群注意配置资源限制。apiVersion:install.istio.io/v1alpha1kind:IstioOperatormetadata:name:control-planespec:profile:d......
  • SQL中使用UNION对两个查询结果进行数据透视
    在SQL中,UNION操作符用于将两个或多个查询结果集合并为一个结果集。然而,UNION本身并不直接支持数据透视功能。数据透视是一种将数据按照特定的维度进行汇总和分组的操作,通常需要使用其他方法来实现。一种常见的方法是在应用程序或脚本中处理合并后的结果集,并使用编程语言的功能......
  • Goolge earth studio 高阶1——缓动设置需求
    缓动设置能够控制动画在两个关键帧之间的移动方式,使运动更加动态和自然。1、创建新项目首先,创建一个快速示例项目,命名为“Easing”,导航到东京的新宿地区,那里有非常好的3D数据。相机定位好,使建筑物位于右侧,公园位于左侧。为了清楚地看到缓动如何影响运动,我们将只关注一个属......
  • Stable Diffusion majicMIX_realistic模型的介绍及使用
    一、简介majicMIX_realistic模型是一种能够渲染出具有神秘或幻想色彩的真实场景的AI模型。这个模型的特点是在现实场景的基础上,通过加入一些魔法与奇幻元素来营造出极具画面效果和吸引力的图像。传统意义的现实场景虽然真实,但通常情况下缺乏奇幻性,而majicMIX_realistic模型就是为了......
  • 【一文看懂深度补全】Deep Depth Completion from Extremely Sparse Data: A Survey
    【综述】从稀疏的数据中进行深度补全:DeepDepthCompletionfromExtremelySparseData:ASurvey摘要1.引言贡献概述2.基于深度学习的深度补全2.1问题表述2.2分类方法3.无引导深度补全3.1稀疏感知CNN3.2归一化CNN3.3使用辅助图像进行......
  • animation 巧用 delay 做 暂停动画
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>animationdelayballmove......
  • 2022-2023 ICPC East Central North America Regional Contest (ECNA 2022):JL
    前言这场状态绝对不对劲,rk倒1没啥可说的。A.A-MazingPuzzle这题绝对能做!等我抽空回来补!(不挂在这的话,说不定就摆烂了)J.SimpleSolitaire题意英语阅读理解。自己读去。解法也不写了,纯暴力模拟。认罪认罚具结书好像是第一次当战犯吧。大约3个半小时的时候,我自告奋勇做这......
  • 2019-2020 ICPC Northwestern European Regional Programming Contest (NWERC 2019):GH
    前言目前打过的最逆天的一场,前半场CF评测机度假去了,全场Inqueue,两小时左右评测机终于回来了,Standings遍地开花,听取WA声一片。昨天就有好几道题是因为没及时看题所以没做,赛后还和队友商量说应该先把所有题大致看一遍,结果今天不长记性,还没看H和J,就去写思路不一定对+实现起来难得......
  • mac M1 android studio 安装
    1、官网下载安装包https://developer.android.google.cn/studio?hl=en2、下载完成后,双击安装,中间需要配置代理这个,配置即可,然后点击下一步一直安装 3、到最后的时候会安装androidsdk报错,这个时候打开下面的地址看哪个时间最短,然后配置host代理https://ping.chinaz.com/dl.......
  • LIN总线CAPL函数—— 主节点波特率测试(ChkStart_LINMasterBaudrateViolation)
    ......