侧边栏壁纸
博主头像
月伴飞鱼 博主等级

行动起来,活在当下

  • 累计撰写 39 篇文章
  • 累计创建 25 个标签
  • 累计收到 1 条评论

目 录CONTENT

文章目录

RocketMQ和Kafka的零拷贝有什么区别?

月伴飞鱼
2025-03-07 / 0 评论 / 1 点赞 / 4 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Linux中的零拷贝技术

mmap + write

mmapsendfile 是 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 实现的拷贝过程(两次拷贝):

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

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

sendfile 优势:

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

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

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

sendfile 的缺点:

  • 不适用于随机访问文件。

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

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

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

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

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

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

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

为什么 RocketMQ 选择 mmap

  1. 跨平台性mmap 提供跨平台的文件映射机制,使得不同操作系统上可以使用相同的代码实现文件映射,确保 RocketMQ 在多种操作系统上的兼容性。

  2. 性能和可扩展性mmap 可以按需将文件的一部分或全部映射到内存中,提供高性能和可扩展性。特别适用于 RocketMQ 需要高吞吐量和低延迟的消息传输场景。

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

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

为什么 Kafka 选择 sendfile

  1. 性能和效率sendfile 提供了高效的文件传输,适合大文件的顺序传输。对于 Kafka 这种处理大量消息的分布式系统,性能非常关键。

  2. 内存消耗mmap 可能会消耗大量内存,尤其是同时处理多个文件时。Kafka 通过使用 sendfile 来减少内存占用。

  3. 适合大文件:Kafka 需要处理大文件,特别是日志文件的发送和接收。sendfile 不需要将文件加载到内存中,更适合处理这些大文件。

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

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

总结

  • mmap 适用于随机访问文件和需要较高灵活性的场景,提供了跨平台支持、高性能和精细控制,特别适合像 RocketMQ 这样需要处理不同类型消息的场景。

  • sendfile 适合顺序文件传输,特别是对于大文件的顺序读取和网络传输,适合像 Kafka 这样需要处理大文件、低内存消耗和高吞吐量的场景。

公众号.png

1
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
    1. 支付宝打赏

      qrcode alipay
    2. 微信打赏

      qrcode weixin
博主关闭了所有页面的评论