高性能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 协议》,转载必须注明作者和本文链接