当前位置:首页 > 经验 >

零拷贝和非零拷贝有什么区别(零拷贝通俗理解)

来源:原点资讯(www.yd166.com)时间:2022-10-24 22:34:18作者:YD166手机阅读>>

大文件传输用什么方式实现?

那针对大文件的传输,我们应该使用什么方式呢?

我们先来看看最初的例子,当调用 read 方法读取文件时,进程实际上会阻塞在 read 方法调用,因为要等待磁盘数据的返回,如下图:

零拷贝和非零拷贝有什么区别,零拷贝通俗理解(17)

具体过程:

  • 当调用 read 方法时,会阻塞着,此时内核会向磁盘发起 I/O 请求,磁盘收到请求后,便会寻址,当磁盘数据准备好后,就会向内核发起 I/O 中断,告知内核磁盘数据已经准备好;

  • 内核收到 I/O 中断后,就将数据从磁盘控制器缓冲区拷贝到 PageCache 里;

  • 最后,内核再把 PageCache 中的数据拷贝到用户缓冲区,于是 read 调用就正常返回了。

对于阻塞的问题,可以用异步 I/O 来解决,它工作方式如下图:

零拷贝和非零拷贝有什么区别,零拷贝通俗理解(18)

它把读操作分为两部分:

  • 前半部分,内核向磁盘发起读请求,但是可以不等待数据就位就可以返回,于是进程此时可以处理其他任务;

  • 后半部分,当内核将磁盘中的数据拷贝到进程缓冲区后,进程将接收到内核的通知,再去处理数据;

而且,我们可以发现,异步 I/O 并没有涉及到 PageCache,所以使用异步 I/O 就意味着要绕开 PageCache。

绕开 PageCache 的 I/O 叫直接 I/O,使用 PageCache 的 I/O 则叫缓存 I/O。通常,对于磁盘,异步 I/O 只支持直接 I/O。

前面也提到,大文件的传输不应该使用 PageCache,因为可能由于 PageCache 被大文件占据,而导致「热点」小文件无法利用到 PageCache。

于是,在高并发的场景下,针对大文件的传输的方式,应该使用「异步 I/O 直接 I/O」来替代零拷贝技术。

直接 I/O 应用场景常见的两种:

  • 应用程序已经实现了磁盘数据的缓存,那么可以不需要 PageCache 再次缓存,减少额外的性能损耗。在 MySQL 数据库中,可以通过参数设置开启直接 I/O,默认是不开启;

  • 传输大文件的时候,由于大文件难以命中 PageCache 缓存,而且会占满 PageCache 导致「热点」文件无法充分利用缓存,从而增大了性能开销,因此,这时应该使用直接 I/O。

另外,由于直接 I/O 绕过了 PageCache,就无法享受内核的这两点的优化:

  • 内核的 I/O 调度算法会缓存尽可能多的 I/O 请求在 PageCache 中,最后「合并」成一个更大的 I/O 请求再发给磁盘,这样做是为了减少磁盘的寻址操作;

  • 内核也会「预读」后续的 I/O 请求放在 PageCache 中,一样是为了减少对磁盘的操作;

于是,传输大文件的时候,使用「异步 I/O 直接 I/O」了,就可以无阻塞地读取文件了。

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

  • 传输大文件的时候,使用「异步 I/O 直接 I/O」;

  • 传输小文件的时候,则使用「零拷贝技术」;

在 Nginx 中,我们可以用如下配置,来根据文件的大小来使用不同的方式:

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

当文件大小大于 directio值后,使用「异步 I/O 直接 I/O」,否则使用「零拷贝技术」。

零拷贝和非零拷贝有什么区别,零拷贝通俗理解(19)

总结

早期 I/O 操作,内存与磁盘的数据传输的工作都是由 CPU 完成的,而此时 CPU 不能执行其他任务,会特别浪费 CPU 资源。

于是,为了解决这一问题,DMA 技术就出现了,每个 I/O 设备都有自己的 DMA 控制器,通过这个 DMA 控制器,CPU 只需要告诉 DMA 控制器,我们要传输什么数据,从哪里来,到哪里去,就可以放心离开了。后续的实际数据传输工作,都会由 DMA 控制器来完成,CPU 不需要参与数据传输的工作。

传统 IO 的工作方式,从硬盘读取数据,然后再通过网卡向外发送,我们需要进行 4 上下文切换,和 4 次数据拷贝,其中 2 次数据拷贝发生在内存里的缓冲区和对应的硬件设备之间,这个是由 DMA 完成,另外 2 次则发生在内核态和用户态之间,这个数据搬移工作是由 CPU 完成的。

为了提高文件传输的性能,于是就出现了零拷贝技术,它通过一次系统调用(sendfile 方法)合并了磁盘读取与网络发送两个操作,降低了上下文切换次数。另外,拷贝数据都是发生在内核中的,天然就降低了数据拷贝的次数。

Kafka 和 Nginx 都有实现零拷贝技术,这将大大提高文件传输的性能。

零拷贝技术是基于 PageCache 的,PageCache 会缓存最近访问的数据,提升了访问缓存数据的性能,同时,为了解决机械硬盘寻址慢的问题,它还协助 I/O 调度算法实现了 IO 合并与预读,这也是顺序读比随机读性能好的原因。这些优势,进一步提升了零拷贝的性能。

需要注意的是,零拷贝技术是不允许进程对文件内容作进一步的加工的,比如压缩数据再发送。

另外,当传输大文件时,不能使用零拷贝,因为可能由于 PageCache 被大文件占据,而导致「热点」小文件无法利用到 PageCache,并且大文件的缓存命中率不高,这时就需要使用「异步 IO 直接 IO 」的方式。

在 Nginx 里,可以通过配置,设定一个文件大小阈值,针对大文件使用异步 IO 和直接 IO,而对小文件使用零拷贝。

零拷贝和非零拷贝有什么区别,零拷贝通俗理解(20)

栏目热文

深拷贝和浅拷贝的实现原理(深拷贝浅拷贝零拷贝的区别是什么)

深拷贝和浅拷贝的实现原理(深拷贝浅拷贝零拷贝的区别是什么)

用js处理数据的时候经常遇到这样一个问题,需要保留原始数据不变情况下,进行一系列数据操作,这时候需要制作一份原始数据的副...

2022-10-24 22:36:32查看全文 >>

直接复制和浅拷贝和深拷贝的区别(深拷贝与浅拷贝示意图)

直接复制和浅拷贝和深拷贝的区别(深拷贝与浅拷贝示意图)

概述今天主要来看看Python中的浅拷贝和深拷贝内容,这里用一个实例来说明~需求:将一个列表的数据复制到另一个列表中。思...

2022-10-24 22:39:34查看全文 >>

高拷贝和低拷贝的区别(深拷贝浅拷贝零拷贝的区别是什么)

高拷贝和低拷贝的区别(深拷贝浅拷贝零拷贝的区别是什么)

一、如何判断我的质粒是高拷贝还是低拷贝质粒?高拷贝质粒每 1 ml LB 培养物应产生 3-5 ug DNA,而低拷贝质...

2022-10-24 22:41:09查看全文 >>

深拷贝和浅拷贝有哪些应用

深拷贝和浅拷贝有哪些应用

大家好我是发哥,本期说说C 深拷贝和浅拷贝。对于基本类型的数据以及简单的对象,它们之间的拷贝非常简单,就是按位复制内存...

2022-10-24 22:41:01查看全文 >>

谈谈你对浅拷贝和深拷贝的理解(零拷贝和深拷贝)

谈谈你对浅拷贝和深拷贝的理解(零拷贝和深拷贝)

先说下自己的理解吧,浅拷贝,即在定义一个类A,使用类似A obj; A obj1(obj);或者A obj1 = obj...

2022-10-24 22:24:54查看全文 >>

深拷贝和浅拷贝的相同点(深拷贝和浅拷贝举例)

深拷贝和浅拷贝的相同点(深拷贝和浅拷贝举例)

前言在阿里Java开发手册中,有这么一条建议:慎用 Object 的 clone 方法来拷贝对象。对象 clone 方法...

2022-10-24 22:29:41查看全文 >>

禾秆草泡水喝的功效(禾秆草图片)

禾秆草泡水喝的功效(禾秆草图片)

广东有三宝——陈皮、咸榄、禾秆草!不少“老广”都会有居家自备“三宝扎”的习惯:用陈皮包裹橄榄,再用禾秆草捆扎,置入粗盐罐...

2022-10-24 22:52:32查看全文 >>

禾秆草功效与禁忌(禾秆草有什么功能)

禾秆草功效与禁忌(禾秆草有什么功能)

广东三宝广东三宝是指:老姜、陈皮、禾秆草。前两样好理解,但是禾秆草,也就是稻草,怎么也能入选“三宝”呢?禾杆草为什么被广...

2022-10-24 22:53:23查看全文 >>

为什么稻草灰可以吃(稻草灰功效与作用)

为什么稻草灰可以吃(稻草灰功效与作用)

来源:上游新闻-重庆晨报俗话说:“民以食为天!”不同的地域特征和生活习性,烹制出不同的美味。稻草成灰,原本平凡无奇,但与...

2022-10-24 22:22:59查看全文 >>

禾麻草图片功效作用(野麻子治什么病)

禾麻草图片功效作用(野麻子治什么病)

2020年7月22日,贵州省毕节市威宁自治县,中药材一一禾麻草(荨麻)。[陶泽祥 摄影]禾麻草霍麻草禾麻荨麻,...

2022-10-24 22:16:20查看全文 >>

文档排行