看到一篇文章:什么是零拷贝?mmap与sendFile的区别是什么?
再稍微讲讲 mmap 和 sendFile 的区别。
mmap 适合小数据量读写,sendFile 适合大文件传输。 mmap 需要 4 次上下文切换,3 次数据拷贝;sendFile 需要 3 次上下文切换,最少 2 次数据拷贝。 sendFile 可以利用 DMA 方式,减少 CPU 拷贝,mmap 则不能(必须从内核拷贝到 Socket 缓冲区)。
在这个选择上:rocketMQ 在消费消息时,使用了 mmap。kafka 使用了 sendFile。
感觉 sendFile 完胜 mmap 呀?
sendFile相当于是原汁原味地读写,直接将硬盘上的文件送给网卡,但这种方式并不一定对所有场景都适用,比如如果你需要从硬盘上读取文件,然后经过一定修改之后再送给网卡的情况下,就不适合用sendFile。
对于RocketMQ来说,因为RocketMQ将所有队列的数据都写入了CommitLog,消费者批量消费时需要读出来进行应用层过滤,所以就不能利用到sendfile+DMA的零拷贝方式,而只能用mmap。