贝壳三面:RocketMQ和KAFKA的零拷贝有什么区别?

文章内容收录到个人网站,方便阅读 :hardyfish.top/

mmap + write

mmap 和 sendfile 是 Linux 中常见的零拷贝技术,通过减少数据复制的次数来提高文件传输性能。

mmap

mmap 是一种内存映射技术,可以通过映射文件到进程的内存空间来共享数据,减少了传统 I/O 操作中的数据复制次数。

与传统 I/O 相比,mmap 可以避免多次数据复制,提升性能。

传统 I/O 数据拷贝过程(四次拷贝):

  1. 从磁盘读取数据到内核缓冲区。
  2. 从内核缓冲区拷贝到用户缓冲区(一次 CPU 拷贝)。
  3. 从用户缓冲区拷贝到套接字缓冲区(一次 CPU 拷贝)。
  4. 将数据通过网络发送出去。

基于 mmap 实现的拷贝过程(三次拷贝):

  1. mmap 将磁盘文件直接映射到内存中(使用 DMA 拷贝)。
  2. 用户缓冲区直接与内核缓冲区共享,无需再次从内核缓冲区拷贝到用户缓冲区。
  3. 数据可以直接从内核缓冲区拷贝到套接字缓冲区。

mmap 优势:

通过内存映射减少了数据的 CPU 拷贝,避免了不必要的拷贝操作。

增强了对随机访问的支持。

在文件处理过程中减少了 I/O 的延迟和 CPU 的负载。

mmap 的缺点:

可能占用较多的内存,尤其是在处理大文件时。

更适合随机访问文件,对于顺序读取大文件不如 sendfile 高效。

I/O 操作通过内存进行,可能导致某些情况下性能下降。

sendfile

sendfile 是一种系统调用,直接将内核中的文件数据发送到网络套接字。

相比 mmap,它更加直接,适合大文件的顺序传输。

基于 sendfile 实现的拷贝过程(两次拷贝):

sendfile 将文件内容从内核缓冲区直接传输到网络套接字缓冲区。

如果网卡支持 SG-DMA 技术,可以直接从内存缓冲区将数据传输到网卡,避免了 CPU 的参与。

sendfile 优势:

适用于顺序读取大文件,特别是网络文件传输。

可以减少内存消耗,不需要将文件加载到内存中。

通过减少用户空间与内核空间的切换,提高传输性能。

sendfile 的缺点:

不适用于随机访问文件。

使用时相对复杂,涉及更多的参数和操作。

可用性受操作系统和服务器软件支持程度的限制。

性能对比:CPU 拷贝与 DMA 拷贝

假设在同样的文件拷贝场景下,使用 CPU 拷贝和 DMA 拷贝的效率差异:

  • CPU 拷贝:每次拷贝耗时 100ms。
  • DMA 拷贝:每次拷贝耗时 10ms。

在大量数据传输时,DMA 拷贝显著提高了性能。

为什么 RocketMQ 选择 mmap?

跨平台性:

mmap 提供跨平台的文件映射机制,使得不同操作系统上可以使用相同的代码实现文件映射。

确保 RocketMQ 在多种操作系统上的兼容性。

性能和可扩展性:

mmap 可以按需将文件的一部分或全部映射到内存中,提供高性能和可扩展性。

特别适用于 RocketMQ 需要高吞吐量和低延迟的消息传输场景。

精细控制 :mmap 提供了更精细的控制,可以按需进行文件的部分读写,而不必将整个文件传输到网络,提高了资源利用率。

通用性 :mmap 不仅适用于顺序文件传输,还能处理不同类型的消息传输,比 sendfile 更具通用性。

为什么 Kafka 选择 sendfile?

性能和效率:

sendfile 提供了高效的文件传输,适合大文件的顺序传输。

对于 Kafka 这种处理大量消息的分布式系统,性能非常关键。

内存消耗:

mmap 可能会消耗大量内存,尤其是同时处理多个文件时。

Kafka 通过使用 sendfile 来减少内存占用。

适合大文件:

Kafka 需要处理大文件,特别是日志文件的发送和接收。

sendfile 不需要将文件加载到内存中,更适合处理这些大文件。

直接 I/O 操作:

sendfile 通过直接在内核空间和网络套接字之间进行 I/O 操作,减少了不必要的内存拷贝和上下文切换。

可扩展性:

sendfile 适用于大规模消息传输,并可以扩展以应对高吞吐量需求。

总结

mmap 适用于随机访问文件和需要较高灵活性的场景,提供了跨平台支持、高性能和精细控制。

  • 特别适合像 RocketMQ 这样需要处理不同类型消息的场景。

sendfile 适合顺序文件传输,特别是对于大文件的顺序读取和网络传输。

  • 适合像 Kafka 这样需要处理大文件、低内存消耗和高吞吐量的场景。
相关推荐
m0_587383003 小时前
广州 24 小时自助健身房解决方案技术实现与实战指南
java·spring·小程序·架构·需求分析
·云扬·4 小时前
Prompt 工程与安全:从 System 设计到注入防御
java·人工智能·安全·ai·prompt
怕浪猫4 小时前
2028编程圈很火的10个Skills
算法·面试·github
代码不停4 小时前
自动化测试(java)
java·开发语言·selenium·自动化
行百里er5 小时前
Redis 完结篇——Redis 热点问题在 Spring Boot 项目中实战
redis·后端
高频因子挖掘机6 小时前
只取最近 60 个交易日,却每次拉全历史:量化脚本变慢的原因与改法
后端·github·api
鬼手点金6 小时前
opencode-rules 插件
java·开发语言·前端·人工智能·chrome·git·github
孟健7 小时前
从5000亿Token到83%字节匹配:AI逆向工程与重构的工程闭环实践
后端·架构·ai编程
paopaokaka_luck7 小时前
滑雪场管理系统(AI智能助手流式对话,ECharts 运营数据分析、教练、雪具与场地一体化预约,钱包支付退款、订单核销与服务评价)
java·人工智能·spring boot·网络协议·数据分析·echarts
码事漫谈7 小时前
丢得静悄悄,谈一谈 Agent 的记忆是怎么没的
后端