系统性能调优必知必会
陶辉
智链达 CTO,前阿里云 P8 高级技术专家
36367 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 47 讲
系统性能调优必知必会
15
15
1.0x
00:00/00:00
登录|注册

04 | 零拷贝:如何高效地传输文件?

内存拷贝次数
上下文切换频率
提高内存利用率
减少CPU工作量
减少磁盘工作量
缺点
应用场景
缺陷
性能损失
大文件占满PageCache
提升磁盘性能
预读功能
利用PageCache缓存
减少内存拷贝次数
降低上下文切换频率
性能问题
解决方法
异步IO是否会阻塞进程
性能优化技术
直接IO
异步IO
解决阻塞问题
缺点
优点
读取磁盘数据
PageCache技术
利用Socket缓冲区
操作系统提供的新函数
减少内存拷贝次数
降低上下文切换频率
优化方向
传统方法
思考题
总结
异步IO + 直接IO
PageCache
零拷贝技术
文件传输
零拷贝:如何高效地传输文件?

该思维导图由 AI 生成,仅供参考

你好,我是陶辉。
上一讲我们谈到,当索引的大小超过内存时,就会用磁盘存放索引。磁盘的读写速度远慢于内存,所以才针对磁盘设计了减少读写次数的 B 树索引。
磁盘是主机中最慢的硬件之一,常常是性能瓶颈,所以优化它能获得立竿见影的效果。
因此,针对磁盘的优化技术层出不穷,比如零拷贝、直接 IO、异步 IO 等等。这些优化技术为了降低操作时延、提升系统的吞吐量,围绕着内核中的磁盘高速缓存(也叫 PageCache),去减少 CPU 和磁盘设备的工作量。
这些磁盘优化技术和策略虽然很有效,但是理解它们并不容易。只有搞懂内核操作磁盘的流程,灵活正确地使用,才能有效地优化磁盘性能。
这一讲,我们就通过解决“如何高效地传输文件”这个问题,来分析下磁盘是如何工作的,并且通过优化传输文件的性能,带你学习现在热门的零拷贝、异步 IO 与直接 IO 这些磁盘优化技术。

你会如何实现文件传输?

服务器提供文件传输功能,需要将磁盘上的文件读取出来,通过网络协议发送到客户端。如果需要你自己编码实现这个文件传输功能,你会怎么实现呢?
通常,你会选择最直接的方法:从网络请求中找出文件在磁盘中的路径后,如果这个文件比较大,假设有 320MB,可以在内存中分配 32KB 的缓冲区,再把文件分成一万份,每份只有 32KB,这样,从文件的起始位置读入 32KB 到缓冲区,再通过网络 API 把这 32KB 发送到客户端。接着重复一万次,直到把完整的文件都发送完毕。如下图所示:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

零拷贝技术是针对磁盘读写性能瓶颈而设计的优化技术之一,旨在提高文件传输的效率。传统的文件传输方式存在频繁的上下文切换和大量的内存拷贝,影响了系统性能。零拷贝技术通过减少上下文切换次数和内存拷贝次数来提升文件传输性能。 零拷贝技术通过合并read和write系统调用,在内核中完成磁盘与网卡的数据交换,从而减少了上下文切换次数。其次,零拷贝技术取消了用户缓冲区,最大化利用socket缓冲区中的内存,减少了系统调用的次数和内存拷贝次数。此外,零拷贝还利用PageCache技术进一步提升性能。 通过零拷贝技术,传输大文件时可以显著减少上下文切换次数和内存拷贝次数,提高了系统的并发处理能力,降低了CPU资源消耗,从而支持更多的并发请求。综合来看,零拷贝技术可以将性能提升至少一倍以上,为文件传输带来了显著的效率提升。 在高并发场景处理大文件时,应当使用异步IO和直接IO来替换零拷贝技术。异步IO可以解决阻塞问题,而直接IO则适用于大文件难以命中PageCache缓存的情况。零拷贝技术在大文件传输时可能会受到PageCache的限制,因此需要考虑替代方案。 总的来说,零拷贝技术通过优化磁盘读写操作,减少了系统调用和内存拷贝次数,从而提高了文件传输的效率。然而,对于特定场景和文件大小,需要结合异步IO和直接IO等技术来进行综合考虑,以达到最佳的性能优化效果。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《系统性能调优必知必会》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(58)

  • 最新
  • 精选
  • Bitstream
    到现在一共更了5讲,除了开篇,每讲都是干货。不是因为不知道老师讲的知识点,而是您讲的很系统,以场景带理论,学习起来很高效。

    作者回复: 你好Bitstream,谢谢你的反馈,我会继续按照这个思路写后续的几讲

    2020-05-06
    9
  • Ken
    长肥网络定义 一个具有大带宽时延乘积的网络也被称之为长胖网络(long fat network,简写为LFN,经常发音为“elephen”)。根据RFC 1072中的定义,如果一个网络的带宽时延乘积显著大于105比特(12500字节),该网络被认为是长肥网络。

    作者回复: 谢谢ken的分享

    2020-05-08
    8
  • helloworld
    第二,读取磁盘数据时,需要先找到数据所在的位置,对于机械磁盘来说,就是旋转磁头到数据所在的扇区,再开始顺序读取数据。其中,旋转磁头耗时很长,为了降低它的影响,PageCache 使用了预读功能 那是不是使用SSD这类固态硬盘(不用旋转磁头),PageCache就没有很大的影响?

    作者回复: 对的!其实,当下的操作系统对SSD磁盘的支持还不够,当SSD广泛应用时,文件系统还需要跟上,还得获得很大的性能提升

    2020-05-13
    2
    6
  • benny
    mmap的系统调用,可以直接将磁盘和内存映射,省去了从内核态copy到用户态,看起来要比直接IO更加高效

    作者回复: 应用场景不一样,直接IO更底层点,mmap还需要保证内存与磁盘的数据一致性。

    2020-06-14
    2
    4
  • 亦知码蚁
    从图中可以看到,异步 IO 并没有拷贝到 PageCache 中,这其实是异步 IO 实现上的缺陷。经过 PageCache 的 IO 我们称为缓存 IO,它与虚拟内存系统耦合太紧,导致异步 IO 从诞生起到现在都不支持缓存 IO。 陶老师 我在异步IO图中,看到的是把磁盘数据拷贝到PageCache,是图错了嘛,如果是直接IO的话,是直接拷贝到用户进程缓存区嘛,这个过程就是绕过了内核态嘛

    作者回复: 你好问题大师,谢谢你的提醒,图上的文字错啦,我马上联系编辑小姐姐更正!

    2020-05-06
    6
    3
  • C家族铁粉
    看到陶辉老师在部落里说,最开始文章有6000字,后来不停删删删,变成了现在的版本,太可惜了,删减掉的部分可以考虑放到其他地方供读者阅读啊。

    作者回复: 没有啦,我思维中的知识是网状的,文字是线性的,你在线性阅读中能够坚持下去,最后还原为树状、网状知识,其实要求挺高的。之前我的行文枝节太多,很难让多数读者坚持下来,是编辑小姐姐对我各种指导,集中炮火攻击一点,才有现在比较通顺流畅的文章,^_^

    2020-05-08
    2
  • 烟雨登
    “由于文件太大,文件中某一部分内容被再次访问到的概率其实非常低“ 这个不能理解,我理解大文件也是能享受到pagecache带来的优势吧,毕竟是预读了一部分,即使是大文件预读的那部分,下次还是会读到吧。这里真正的影响是把pagecache沾满,影响其他文件把?

    作者回复: 是的,同时由于文件多数都是顺序访问的,因此对于GB级的大文件,某1MB被再次访问到的机率,对于LRU淘汰的PageCache来说,要小于小文件。

    2020-11-09
    1
  • MySQL在写redo log和bin log的时候都使用了PageCache。请问老师说的MySQL使用直接IO绕过PageCache是指MySQL的哪一部分逻辑?

    作者回复: 这个功能默认是不开启的,毕竟直接IO下无法使用电梯算法合并IO,减少机械磁盘的磁盘旋转时间。但是由于InnoDB等引擎都有自己的缓存,PageCache作为缓存的必要性并不大,对于Solaris AMD系统更是会降低MySQL性能,可以通过innodb_flush_method = O_DIRECT来开启直接IO功能提升性能

    2020-07-31
    2
    1
  • 不能用真名字
    老师,感觉课后题大家答的都不对啊,能给一下答案么?

    作者回复: 哪道题啊?极客时间的答题系统里,答错了不是有正确答案,以及我给的原因吗?

    2021-04-20
  • 陌上桑
    Lilux 有实现异步IO吗好多书上都是讲没有实现异步IO.只是在我们获取IO状态的时候可以非阻塞或者使用IO多路复用这样的技术。但是这些都是同步的,最终需要用户进程发送Read或者write这样的系统调用写到 内核缓冲区

    作者回复: 有的,参考:https://man7.org/linux/man-pages/man7/aio.7.html

    2020-11-23
收起评论
显示
设置
留言
58
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部