04 | 零拷贝:如何高效地传输文件?
该思维导图由 AI 生成,仅供参考
你会如何实现文件传输?
- 深入了解
- 翻译
- 解释
- 总结
零拷贝技术是针对磁盘读写性能瓶颈而设计的优化技术之一,旨在提高文件传输的效率。传统的文件传输方式存在频繁的上下文切换和大量的内存拷贝,影响了系统性能。零拷贝技术通过减少上下文切换次数和内存拷贝次数来提升文件传输性能。 零拷贝技术通过合并read和write系统调用,在内核中完成磁盘与网卡的数据交换,从而减少了上下文切换次数。其次,零拷贝技术取消了用户缓冲区,最大化利用socket缓冲区中的内存,减少了系统调用的次数和内存拷贝次数。此外,零拷贝还利用PageCache技术进一步提升性能。 通过零拷贝技术,传输大文件时可以显著减少上下文切换次数和内存拷贝次数,提高了系统的并发处理能力,降低了CPU资源消耗,从而支持更多的并发请求。综合来看,零拷贝技术可以将性能提升至少一倍以上,为文件传输带来了显著的效率提升。 在高并发场景处理大文件时,应当使用异步IO和直接IO来替换零拷贝技术。异步IO可以解决阻塞问题,而直接IO则适用于大文件难以命中PageCache缓存的情况。零拷贝技术在大文件传输时可能会受到PageCache的限制,因此需要考虑替代方案。 总的来说,零拷贝技术通过优化磁盘读写操作,减少了系统调用和内存拷贝次数,从而提高了文件传输的效率。然而,对于特定场景和文件大小,需要结合异步IO和直接IO等技术来进行综合考虑,以达到最佳的性能优化效果。
《系统性能调优必知必会》,新⼈⾸单¥59
全部留言(58)
- 最新
- 精选
- Bitstream到现在一共更了5讲,除了开篇,每讲都是干货。不是因为不知道老师讲的知识点,而是您讲的很系统,以场景带理论,学习起来很高效。
作者回复: 你好Bitstream,谢谢你的反馈,我会继续按照这个思路写后续的几讲
2020-05-069 - Ken长肥网络定义 一个具有大带宽时延乘积的网络也被称之为长胖网络(long fat network,简写为LFN,经常发音为“elephen”)。根据RFC 1072中的定义,如果一个网络的带宽时延乘积显著大于105比特(12500字节),该网络被认为是长肥网络。
作者回复: 谢谢ken的分享
2020-05-088 - helloworld第二,读取磁盘数据时,需要先找到数据所在的位置,对于机械磁盘来说,就是旋转磁头到数据所在的扇区,再开始顺序读取数据。其中,旋转磁头耗时很长,为了降低它的影响,PageCache 使用了预读功能 那是不是使用SSD这类固态硬盘(不用旋转磁头),PageCache就没有很大的影响?
作者回复: 对的!其实,当下的操作系统对SSD磁盘的支持还不够,当SSD广泛应用时,文件系统还需要跟上,还得获得很大的性能提升
2020-05-1326 - bennymmap的系统调用,可以直接将磁盘和内存映射,省去了从内核态copy到用户态,看起来要比直接IO更加高效
作者回复: 应用场景不一样,直接IO更底层点,mmap还需要保证内存与磁盘的数据一致性。
2020-06-1424 - 亦知码蚁从图中可以看到,异步 IO 并没有拷贝到 PageCache 中,这其实是异步 IO 实现上的缺陷。经过 PageCache 的 IO 我们称为缓存 IO,它与虚拟内存系统耦合太紧,导致异步 IO 从诞生起到现在都不支持缓存 IO。 陶老师 我在异步IO图中,看到的是把磁盘数据拷贝到PageCache,是图错了嘛,如果是直接IO的话,是直接拷贝到用户进程缓存区嘛,这个过程就是绕过了内核态嘛
作者回复: 你好问题大师,谢谢你的提醒,图上的文字错啦,我马上联系编辑小姐姐更正!
2020-05-0663 - C家族铁粉看到陶辉老师在部落里说,最开始文章有6000字,后来不停删删删,变成了现在的版本,太可惜了,删减掉的部分可以考虑放到其他地方供读者阅读啊。
作者回复: 没有啦,我思维中的知识是网状的,文字是线性的,你在线性阅读中能够坚持下去,最后还原为树状、网状知识,其实要求挺高的。之前我的行文枝节太多,很难让多数读者坚持下来,是编辑小姐姐对我各种指导,集中炮火攻击一点,才有现在比较通顺流畅的文章,^_^
2020-05-082 - 烟雨登“由于文件太大,文件中某一部分内容被再次访问到的概率其实非常低“ 这个不能理解,我理解大文件也是能享受到pagecache带来的优势吧,毕竟是预读了一部分,即使是大文件预读的那部分,下次还是会读到吧。这里真正的影响是把pagecache沾满,影响其他文件把?
作者回复: 是的,同时由于文件多数都是顺序访问的,因此对于GB级的大文件,某1MB被再次访问到的机率,对于LRU淘汰的PageCache来说,要小于小文件。
2020-11-091 - 鱼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-3121 - 不能用真名字老师,感觉课后题大家答的都不对啊,能给一下答案么?
作者回复: 哪道题啊?极客时间的答题系统里,答错了不是有正确答案,以及我给的原因吗?
2021-04-20 - 陌上桑Lilux 有实现异步IO吗好多书上都是讲没有实现异步IO.只是在我们获取IO状态的时候可以非阻塞或者使用IO多路复用这样的技术。但是这些都是同步的,最终需要用户进程发送Read或者write这样的系统调用写到 内核缓冲区
作者回复: 有的,参考:https://man7.org/linux/man-pages/man7/aio.7.html
2020-11-23