上架学姐 8 张图,就可以搞懂「零拷贝」了,原来( 五 )
内核收到I/O中断后 , 就将数据从磁盘控制器缓冲区拷贝到PageCache里;
最后 , 内核再把PageCache中的数据拷贝到用户缓冲区 , 于是read调用就正常返回了 。
对于阻塞的问题 , 可以用异步I/O来解决 , 它工作方式如下图:

文章图片
它把读操作分为两部分:
前半部分 , 内核向磁盘发起读请求 , 但是可以不等待数据就位就可以返回 , 于是进程此时可以处理其他任务;
后半部分 , 当内核将磁盘中的数据拷贝到进程缓冲区后 , 进程将接收到内核的通知 , 再去处理数据;
而且 , 我们可以发现 , 异步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/{sendfileon;aioon;directio1024m;}
当文件大小大于directio值后 , 使用「异步I/O+直接I/O」 , 否则使用「零拷贝技术」 。
早期I/O操作 , 内存与磁盘的数据传输的工作都是由CPU完成的 , 而此时CPU不能执行其他任务 , 会特别浪费CPU资源 。
于是 , 为了解决这一问题 , DMA技术就出现了 , 每个I/O设备都有自己的DMA控制器 , 通过这个DMA控制器 , CPU只需要告诉DMA控制器 , 我们要传输什么数据 , 从哪里来 , 到哪里去 , 就可以放心离开了 。 后续的实际数据传输工作 , 都会由DMA控制器来完成 , CPU不需要参与数据传输的工作 。
传统IO的工作方式 , 从硬盘读取数据 , 然后再通过网卡向外发送 , 我们需要进行4上下文切换 , 和4次数据拷贝 , 其中2次数据拷贝发生在内存里的缓冲区和对应的硬件设备之间 , 这个是由DMA完成 , 另外2次则发生在内核态和用户态之间 , 这个数据搬移工作是由CPU完成的 。
为了提高文件传输的性能 , 于是就出现了零拷贝技术 , 它通过一次系统调用(sendfile方法)合并了磁盘读取与网络发送两个操作 , 降低了上下文切换次数 。 另外 , 拷贝数据都是发生在内核中的 , 天然就降低了数据拷贝的次数 。
Kafka和Nginx都有实现零拷贝技术 , 这将大大提高文件传输的性能 。
推荐阅读
- 华为|支持5G!曝华为Mate 40E Pro将于3月3日上架:搭载麒麟9000L
- NVIDIA|RTX 3060 Ti悄然变"心":索泰上架三款GA103核心新版本
- Intel|Intel全新阿特拉斯峡谷NUC迷你机上架:10nm 10W奔腾、2999元
- 爱奇艺|爱奇艺奇遇Dream VR一体机上架:2699元 一年内打卡300天0元购
- 显示器|首发12999元!外星人34英寸量子点带鱼屏显示器上架:4K/175Hz
- 华为|4599元到手!华为新款MateBook D15锐龙版上架:搭载R5 5500U
- 太阳|有史以来在单张图像中观测到的最大日珥喷发:没有指向地球!
- 天猫|天猫上架100万只冰墩墩全部售罄:你抢到几个
- 天猫|最后实现“一户一墩”的机会来了!天猫今天上架100万只冰墩墩
- 蓝牙耳机|小米有品上架高颜值真无线耳机:40dB主动降噪 地铁变卧室
