Post

零拷贝

零拷贝

一、概念

高速缓存PageCache

  • 在内存中有一个分区用来缓存热点数据
  • 有预读功能
  • 读写速度比磁盘快
  • 应用与内核态缓存区,如下文内核态缓存区

DMA技术

  • 在进行I/O设备(如:磁盘)和内存进行数据传输时,由DMA负责数据搬运,而不需要CPU参与

上下文切换

一次系统调用会引起两次上下文切换:用户态 -> 内核态 -> 用户态

二、文件传输过程分析

以文件传输为例,分析传统文件传输和零拷贝技术的区别

传统文件传输(read+write)

Snipaste_2022-02-18_14-51-45

  • 系统调用:read(file, tmp_buf, len)、write(socket, tmp_buf, len)
  • 2次系统调用,4次上下文切换
  • 4次数据拷贝:2次DMA拷贝 + 2次CPU拷贝

mmap + write

Snipaste_2022-02-18_15-12-30

  • 系统调用:buf = mmap(file, len)、write(socket, buf, len)
  • 2次系统调用,4次上下文切换
  • 3次数据拷贝:2次DMA拷贝 + 1次CPU拷贝
  • 使用场景:IO 多路复用(epoll

sendfile

Snipaste_2022-02-18_15-04-04

  • 零拷贝:数据传输过程中,仅由DMA参与数据拷贝,CPU不参与
  • 系统调用:sendfile(int out_fd, int in_fd, off_t *offset, size_t count)
  • 1次系统调用,2次上下文切换
  • 2次数据拷贝:2次DMA拷贝
  • 使用场景:kafka 发送消息

三、大文件传输

Snipaste_2022-02-18_15-12-30

  • 使用异步IO ,绕开PageCache,过程如图
  • 为什么不用零拷贝?
    • 零拷贝使用了PageCache
    • 很快占满PageCache,导致热点小数据不能使用PageCache
    • 大文件PageCache命中率不高

四、参考

This post is licensed under CC BY 4.0 by the author.