场景:从磁盘读取文件并通过网络发送出去。这个过程数据从经历了哪些历程?
传统IO
- 过程:从磁盘 通过DMA 拷贝到Page Cache(内核空间), 然后CPU从PageCache 拷贝到Memory(用户空间),然后从Memory 拷贝到Socket Cache,然后再从Socket Cache 拷贝到 网卡
- 特点:4次上下文切换,4次数据拷贝
零拷贝
- 过程: 数据从磁盘通过DMA拷贝到PageCache,然后利用SG-DMA直接拷贝到网卡
- 特点:2次上下文切换,2次数据拷贝
直接IO
- 过程:数据通过DMA从磁盘拷贝到Memory,再从Memory 拷贝到Socket Cache,再从Socket Cache拷贝到 网卡
- 特点:4次上下文切换,3次数据拷贝,绕过PageCache。
总结
- 直接IO也有它的用途,就是传输大的文件,因为传输大文件没有数据局部性特点,PageCache完全没用,反而因为占用大量PageCache使得其它小文件IO变慢。一般直接IO和异步IO是一起用的。异步IO就是IO的时候不阻塞,直接返回,数据准备好再通知程序。
- 直接IO绕过PageCahe,带来的代价就是不能享受PageCache的大保健服务,比如合并IO、预读等,这些服务能有效提升磁盘IO的性能,以为减少了磁头寻道次数。