零拷贝
零拷贝
一、概念
高速缓存PageCache
- 在内存中有一个分区用来缓存热点数据
- 有预读功能
- 读写速度比磁盘快
- 应用与内核态缓存区,如下文内核态缓存区
DMA技术
- 在进行I/O设备(如:磁盘)和内存进行数据传输时,由DMA负责数据搬运,而不需要CPU参与
上下文切换
一次系统调用会引起两次上下文切换:用户态 -> 内核态 -> 用户态
二、文件传输过程分析
以文件传输为例,分析传统文件传输和零拷贝技术的区别
传统文件传输(read+write)
- 系统调用:read(file, tmp_buf, len)、write(socket, tmp_buf, len)
- 2次系统调用,4次上下文切换
- 4次数据拷贝:2次DMA拷贝 + 2次CPU拷贝
mmap + write
- 系统调用:buf = mmap(file, len)、write(socket, buf, len)
- 2次系统调用,4次上下文切换
- 3次数据拷贝:2次DMA拷贝 + 1次CPU拷贝
- 使用场景:IO 多路复用(epoll)
sendfile
- 零拷贝:数据传输过程中,仅由DMA参与数据拷贝,CPU不参与
- 系统调用:sendfile(int out_fd, int in_fd, off_t *offset, size_t count)
- 1次系统调用,2次上下文切换
- 2次数据拷贝:2次DMA拷贝
- 使用场景:kafka 发送消息
三、大文件传输
- 使用异步IO ,绕开PageCache,过程如图
- 为什么不用零拷贝?
- 零拷贝使用了PageCache
- 很快占满PageCache,导致热点小数据不能使用PageCache
- 大文件PageCache命中率不高
四、参考
This post is licensed under CC BY 4.0 by the author.



