一、零拷贝原理:Consumer 消费消息过程,使用了零拷贝,零拷贝包含以下两种方式:
1、使用 mmap + write 方式 (RocketMQ选择的方式:因为有小块数据传输的需求,效果会比 sendfile 更好)
优点:即使频繁调用,使用小块文件传输,效率也很高;
缺点:不能很好的利用 DMA 方式,会比 sendfile 多消耗CPU,内存安全性控制复杂,需要避免 JVM Crash 问题。
2、使用 sendfile 方式
优点:可以利用 DMA 方式,消耗 CPU 较少,大块文件传输效率高,无内存安全新问题;
缺点:小块文件效率低亍 mmap 方式,只能是 BIO 方式传输,不能使用 NIO。
二、RocketMQ 文件系统
1、RocketMQ 选择 Linux Ext4 文件系统 && IO调度算法调整为deadline:
Ext4 文件系统删除 1G 大小的文件通常耗时小亍 50ms,而 Ext3 文件系统耗时约 1s 左右,且删除文件时,磁盘 IO 压力极大,会导致 IO 写入超时;
文件系统 IO 调度算法需要调整为 deadline,因为 deadline 算法在随机读情况下,可以合幵读请求为顺序跳跃方式,从而提高读 IO 吞吐量。