高性能IO-零拷贝(zero copy)

⽤户空间和内核空间

高性能IO-零拷贝(zero copy)

传统的IO流

高性能IO-零拷贝(zero copy)

零拷⻉(zero-copy)

零拷⻉主要的任务是避免CPU将数据从⼀块存储拷⻉到另外⼀块存储,主要就是利⽤各种拷⻉的技术,避免让CPU做⼤量的数据拷⻉任务,减少不必要的拷⻉,或者说让别的组件来做这⼀类简单的数据传输,让CPU专注于别的任务。这样就可以让系统资源利⽤的更加有效。
如何减少数据拷⻉的次数呢?减少⽤户空间到内核空间的拷⻉ mmap 优化。

高性能IO-零拷贝(zero copy)

直接传递⽂件描述(sendfile)

高性能IO-零拷贝(zero copy)

高性能IO-零拷贝(zero copy)

深入理解

1)零拷⻉是从操作系统⻆度来说的,因为内核缓冲区之前,没有数据的重复(只有kernel buffer 有⼀
份数据)。
2)零拷⻉不仅仅带来了更少的数据复制,还能带来其他的性能优势,例如:更少的上下⽂切换,更少
的CPU缓存伪共享以及⽆CPU校验和计算。

mmap 和sendFile 的区别

  1. mmap 适合⼩数据量读写,sendFile适合⼤⽂件传输
  2. mmap 需要4次上下⽂切换、3次数据拷⻉;sendFile 需要3次上下⽂切换、最少2次数据拷⻉。
  3. sendFile 可以利⽤DMA⽅式,减少CPU拷⻉,mmap 则不能(必须从内核拷⻉到socket 缓冲区)。

在这个选择上:RocketMQ 在消费消息时,使⽤了mmap。kafka使⽤了sendFIle。

使用

场景:

⽂件较⼤,读写较慢,追求速度
内存宽带不够,即存在其他程序或线程存在⼤量的IO操作

技术:

Java的NIO
nginx零拷贝(nginx开启零拷贝之后,可以跳过(内核缓冲区->用户态->socket缓冲区)这一个过程,减少用户态到内核态的切换)
kafka

总结

演化过程
高性能IO-零拷贝(zero copy)

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!