零拷贝(Zero Copy)技术

零拷贝(Zero Copy)技术是直接从内核空间(DMA的)到内核空间(Socket的)、然后发送网卡

传统的网络I/O操作流程,大体上分为以下4步:

  1. OS从硬盘把数据读到内核区的PageCache。
  2. 用户进程把数据从内核区Copy到用户区。
  3. 然后用户进程再把数据写入到Socket,数据流入内核区的Socket Buffer上。
  4. OS再把数据从Buffer中Copy到网卡的Buffer上,这样完成一次发送。

从上图可以看出,传统网络IO会历经两次Context Switch,四次数据拷贝。实际上IO读写,需要进行IO中断,需要CPU响应中断(带来上下文切换),尽管后来引入DMA来接管CPU的中断请求,但四次copy是存在“不必要的拷贝”的。

同一份数据在内核buffer与用户buffer之间重复拷贝,效率低下。其中2,3两步没有必要,完全可以直接在内核空间完成数据拷贝。这也是sendfile所解决的问题,经过sendfile优化后,整个I/O过程变成了下面的样子:

从上图可以看出,通过sendfile 系统调用,提供了零拷贝。磁盘数据通过 DMA 拷贝到内核态 Buffer 后,直接通过 DMA 拷贝到 NIC Buffer(socket buffer),无需 CPU 拷贝,所以称为零拷贝。除了减少数据拷贝外,因为整个读文件 – 网络发送由一个 sendfile 调用完成,整个过程只有两次上下文切换,因此大大提高了性能。