高性能IO-零拷贝(zero copy)
⽤户空间和内核空间#
传统的 IO 流#
零拷⻉(zero-copy)#
零拷⻉主要的任务是避免 CPU 将数据从⼀块存储拷⻉到另外⼀块存储,主要就是利⽤各种拷⻉的技术,避免让 CPU 做⼤量的数据拷⻉任务,减少不必要的拷⻉,或者说让别的组件来做这⼀类简单的数据传输,让 CPU 专注于别的任务。这样就可以让系统资源利⽤的更加有效。
如何减少数据拷⻉的次数呢?减少⽤户空间到内核空间的拷⻉ mmap 优化。
直接传递⽂件描述(sendfile)#
深入理解#
1)零拷⻉是从操作系统⻆度来说的,因为内核缓冲区之前,没有数据的重复(只有 kernel buffer 有⼀
份数据)。
2)零拷⻉不仅仅带来了更少的数据复制,还能带来其他的性能优势,例如:更少的上下⽂切换,更少
的 CPU 缓存伪共享以及⽆ CPU 校验和计算。
mmap 和 sendFile 的区别#
- mmap 适合⼩数据量读写,sendFile 适合⼤⽂件传输
- mmap 需要 4 次上下⽂切换、3 次数据拷⻉;sendFile 需要 3 次上下⽂切换、最少 2 次数据拷⻉。
- sendFile 可以利⽤ DMA ⽅式,减少 CPU 拷⻉,mmap 则不能(必须从内核拷⻉到 socket 缓冲区)。
在这个选择上:RocketMQ 在消费消息时,使⽤了 mmap。kafka 使⽤了 sendFIle。
使用#
场景:#
⽂件较⼤,读写较慢,追求速度
内存宽带不够,即存在其他程序或线程存在⼤量的 IO 操作
技术:#
Java 的 NIO
nginx 零拷贝(nginx 开启零拷贝之后,可以跳过(内核缓冲区 -> 用户态 ->socket 缓冲区)这一个过程,减少用户态到内核态的切换)
kafka
总结#
演化过程
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: