一、零拷貝原理: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 吞吐量。