[转帖]何为真正的零拷贝

何为,真正,拷贝 · 浏览次数 : 0

小编点评

**传统文件传输的缺点:** - 4次用户态和内核态上下文切换,用户态和内核态上下文切换带来的性能消耗。 - 4次数据拷贝,其中包含两次DMA拷贝,两次CPU拷贝。 - 零拷贝技术虽然能减少上下文切换次数,但依然需要数据复制两次。 **如何实现零拷贝?** - mmap()系统调用可以直接将内核缓冲区的内容映射到用户空间,从而减少数据复制次数。 - sendfile()系统调用可以替代read()和write()两个系统调用,并通过DMA技术实现高效的数据传输。 - 在Linux内核2.4y以后,对于网卡支持SG-DMA技术的情况下,sendfile系统调用的过程也发生了变化,通过DMA技术实现了真正的零拷贝。

正文

传统的文件传输有啥缺点?

传统IO的工作方式是,数据读取和写入是从用户空间和内核空间来回复制,内核空间的数据时通过操作系统层面的IO接口从磁盘读取或写入。

何为真正的零拷贝

通过上图可以看出,在我们执行read和writer之间,一共发生了4次用户态和内核态上下文切换,在高并发的场景下,用户态和内核态上下文切换带来的性能消耗将会极大的降低系统的性能。

除了上下文的切换,在这个过程也一共发生了4次数据拷贝,其中包含两次DMA拷贝,两次CPU拷贝。

  • 第一次拷贝:借助DMA完成,把磁盘上的数据拷贝到内核的缓冲区里
  • 第二次拷贝:借助CPU完成,把内核缓冲区的数据拷贝到用户的缓冲区,以便应用程序可以操作这些数据
  • 第三次拷贝:把用户缓冲区数据再拷贝到内核中Sokcet的缓冲区中,需要借助CPU完成
  • 第四次拷贝:借助DMA完成,将内核Socket缓冲区中的数据拷贝到网卡的缓冲区中

可以看到我们在一个主机上如果想把某个文件的内容通过网络发送出去,将会进行4次切换和4次拷贝,但在这4次拷贝的过程中拷贝的都是同一份数据,过多的数据拷贝造成了系统性能的下降。

因此,为了优化文件的传输性能,我们需要减少上下切换和拷贝的次数。

如何实现零拷贝?

  • mmap + write
  • sendfile

mmap + write

read()系统调用会把内核缓冲区的内容拷贝到用户空间,为了减少这一次的拷贝,我们使用mmap()系统调用替换掉read()

mmap函数会直接把内核缓冲区的数据映射到用户空间,这样操作系统内核和用户空间就不需要再进行数据的拷贝。

何为真正的零拷贝

  • 应用进程调用mmap函数以后,DMA会把磁盘的数据拷贝到内核缓冲区里,接着应用程序会和操作系统内核共享这个缓冲区
  • 应用进程再调用write函数,操作系统直接将内核中的数据拷贝到Socket缓冲区,这一步需要借助CPU
  • 最后再借助DMA将Socket缓冲区的数据拷贝到网卡缓冲区里

mmap + write的实现方式需要3次数据拷贝和4次上下文切换

sendfile

sendfile是Linux内核2.1版本中专门发送文件的系统调用函数,函数形式如下:

  1. # include <sys/socket.h>
  2. ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
  • out_fd:目的端文件描述符
  • in_fd:源端文件描述符
  • offset:源端的偏移量
  • count:复制数据的长度
  • ssize_t:返回参数,实际复制数据的长度

何为真正的零拷贝

sendfile可以替代read()和write()这两个系统调用,因此系统调用从2次变为1次,相应的上下文切换也会变为2次。

其次,sendfile可以直接把内核缓冲区的数据拷贝到Socket缓冲区,因此通过sendfile函数,我们可以将上下文切换减少为2次,数据拷贝3次。

如何实现真正的零拷贝?

上述零拷贝还不是真正的零拷贝,如果网卡支持SG-DMA技术的话,我们可以进一步减少数据拷贝的次数(即减少CPU把内核缓冲区的内容拷贝到Socket缓冲区的过程)。

$ ethtool -k eth0 | grep scatter-gather

上述命令可以查看网卡是否支持SG-DMA技术。

何为真正的零拷贝

在Linux内核2.4y以后,对于网卡支持SG-DMA技术的情况下,sendfile系统调用的过程也发生了变化:

  1. 首先通过DMA拷贝将磁盘的数据拷贝到内核缓冲区
  2. 第二步,将缓冲区描述符和数据长度传到Socket缓冲区,网卡的SG-DMA控制器可以直接将内核缓冲区的数据拷贝到网卡的缓冲区里

通过以上技术,我们真正实现了零拷贝,数据拷贝次数发生两次,并且我们全程没有让CPU介入数据拷贝过程,通过DMA技术实现了数据的拷贝。总体来看,零拷贝技术可以把文件性能至少提高一倍以上。

PageCache是什么?

在我们上面一直提到一个内核缓冲区,该内核缓冲区就是PageCache(磁盘高速缓存)。

PageCache的优点?

  • PageCache存在于内存中,读写内存速度远远快于读写磁盘速度
  • 根据程序局部性规则,刚刚访问的数据在短时间内被访问的概率很高,因此PageCache缓存了最近被访问的数据,当读磁盘数据时,优先在PageCache中查找,如果数据存在可以直接返回,如果没有就需要从磁盘中读取,当空间不足时需要淘汰最久未被访问的缓存
  • PageCache使用了预读功能,比如read方法每次只读取32kb,但内核实际上会将后面的32kb-64kb的内容也读取到PageCache,这样对于读取后续的数据成本就会变低

PageCache的缺点?

  • 不适合传输大文件(GB级别),在传输大文件时,PageCache会失效,也就是说DMA的数据拷贝是一次多余的操作。
  • PageCache如果长时间被大文件占据,热点的小文件就无法使用到PageCache

所以针对大文件的传输,不应该使用零拷贝技术。

如何解决大文件传输问题?

异步IO + 直接IO。

何为真正的零拷贝

异步IO主要解决read方法调用时的阻塞问题,通过上图可以看出:

  • 在内核向磁盘发起读请求时,可以不等待数据就位就可以返回,此时进程依旧可以处理其他任务
  • 当磁盘中的数据拷贝到用户缓冲区时,进程将收到内核的通知,此时进程就可以去处理数据了

异步IO整个过程没有涉及到PageCache,绕开PageCache的IO也可以成为直接IO。通常对于磁盘来说,异步IO只支持直接IO。

所以在传输大文件时,可以使用异步IO+直接IO无阻塞的读取文件。

直接IO的使用场景?

  • 应用程序已经实现了磁盘数据的缓存,那么便不再需要PageCache了。在MySQL数据库中,可以通过参数开启直接IO
  • 传输大文件时,由于大文件无法命中PageCache缓存,因此也应该使用直接IO

与[转帖]何为真正的零拷贝相似的内容:

[转帖]何为真正的零拷贝

传统的文件传输有啥缺点? 传统IO的工作方式是,数据读取和写入是从用户空间和内核空间来回复制,内核空间的数据时通过操作系统层面的IO接口从磁盘读取或写入。 通过上图可以看出,在我们执行read和writer之间,一共发生了4次用户态和内核态上下文切换,在高并发的场景下,用户态和内核态上下文切换带来的

[转帖]一篇文章真正彻底讲透美国房产税,看看对中国有何借鉴?(上)

https://zhuanlan.zhihu.com/p/373501177 我系统的讲了我国征收房产税的本质和目的,并提了英美国家征收房产税的目的和方式,作为参考。那么,外国都是怎么征收房产税的呢?他们的房产税制度和体系,到底是怎么样的呢?对我国有何借鉴呢?我国在即将开始征收的房产税,会学习国外吗

[转帖]何为SSL证书以及SSL证书的类型都有哪些

http://www.tuidc.com/helpinfo/28573.html 简述: 什么是SSL证书呢?我们都知道目前互联网安全威胁愈演愈烈,各类入侵、劫持事件层出不穷,欺诈、钓鱼网站比比皆是。https加密传输方案在传输层可有效防止他人截获,同时客户端浏 什么是SSL证书呢?我们都知道目前互

[转帖]小白科普丨何为树、二叉树和森林?

摘要:本文为大家带来树、二叉树和森林的表示及如何进行相互转换。 本文分享自华为云社区《树、二叉树和森林的表示及相互转换》,作者:1+1=王。 树的基本概念 树的定义:树是n(n >= 0)个节点的==有限==集。当n=0是,称为空树。 树的特点: (1)树的根没有前驱,除根外的其他节点有且仅有一个前

[转帖]Kafka 与RocketMQ 落盘机制比较

https://www.jianshu.com/p/fd50befccfdd 引言 前几期的评测中,我们对比了Kafka和RocketMQ的吞吐量和稳定性,本期我们要引入一个新的评测标准——软件可靠性。 何为“可靠性”? 先看下面这种情况:有A,B两辆越野汽车,在城市的周边地区均能很好应对泥泞的路况

[转帖]QSFP-DD封装有何优势?800G光模块是否会沿用QSFP-DD封装?

https://baijiahao.baidu.com/s?id=1715831828043988994&wfr=spider&for=pc QSFP-DD作为400G光学器件最小尺寸的封装,可提供较高的端口密度,且可向后兼容QSFP+/QSFP28封装,备受供应商热捧。如今,不少供应商纷纷都推出了

[转帖]QSFP-DD封装有何优势?800G光模块是否会沿用QSFP-DD封装?

https://baijiahao.baidu.com/s?id=1715831828043988994&wfr=spider&for=pc QSFP-DD作为400G光学器件最小尺寸的封装,可提供较高的端口密度,且可向后兼容QSFP+/QSFP28封装,备受供应商热捧。如今,不少供应商纷纷都推出了

[转帖]Armv9 架构相比 Armv8 有何升级/区别:全面性能提升

https://baijiahao.baidu.com/s?id=1695708603852200216&wfr=spider&for=pc 自 2011 年 10 月 Arm 首次公布 Armv8 架构以来,已经有近 10 年的时间了,这是计算领域相当多变的 10 年,因为指令集架构通过移动领域到

[转帖]【技术剖析】8. 相同版本 JVM 和 Java 应用,在 x86 和AArch64 平台性能相差30%,何故?

https://bbs.huaweicloud.com/forum/thread-168532-1-1.html 作者: 吴言 > 编者按:目前许多公司同时使用 x86 和 AArch64 2 种主流的服务器。这两种环境的算力相当,内存相同的情况下:相同版本的 JVM 和 Java 应用,相同的 J

[转帖]科技部重组,不再参与具体科研项目评审和管理,有何深意?

https://news.ifeng.com/c/8Nyvc4r1A4h 昨天下午,新一轮的《国务院机构改革方案》出炉,根据这份方案,中华人民共和国科学技术部(以下简称“科技部”)将迎来重组,这也是5年内科技部的第二次重组。 在2018年的国务院机构改革中,科学技术部、国家外国专家局的职责整合,重新