ZeroCopy(零拷贝技术)
一、传统的文件发送步骤
file通过网络发送需要经历四个copy的步骤:
调用read,将文件拷贝到kernel内核(如linux内核)
CPU控制kernel态(内核态)的数据拷贝到用户态(应用程序里)
调用write时,user态下的数据拷贝到socket的buffer中。
最后将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技术
