Skip to content

ZeroCopy(零拷贝技术)

一、传统的文件发送步骤

file通过网络发送需要经历四个copy的步骤:

  1. 调用read,将文件拷贝到kernel内核(如linux内核)

  2. CPU控制kernel态(内核态)的数据拷贝到用户态(应用程序里)

  3. 调用write时,user态下的数据拷贝到socket的buffer中。

  4. 最后将socket buffer的数据copy到网卡设备当中发送

缺点:内核态到用户态会进行上下文切换,进行两次上下文切换(2和3步骤)耗费了性能

二、ZeroCopy(零拷贝技术)

请求的kernel直接将disk(硬盘里的文件)的data传输给socket(因为kernel和socket属于内核态,不需要进行上下文切换)。ZeroCopy大大提高了应用程序的性能, 减少不必要的内核缓冲区和用户缓冲区间的拷贝。减少cpu的开销和上下文的切换。

对于零拷贝技术有mmap和sendfile

  • mmap:小文件传输快

rocketMQ选择这种方式,mmap+write方式,小块数据传输,效果比sendfile好

  • sendfile:大文件传输比mmap快

java中的transferTo()实现了ZeroCopy。kafka、netty和rocketMQ都使用了ZeroCopy技术