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

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

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

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 这样需要处理大文件、低内存消耗和高吞吐量的场景。
#面试#
大厂面试每日一题 文章被收录于专栏

大厂每日一道面试题!

全部评论

相关推荐

点赞 评论 收藏
分享
03-26 08:58
已编辑
门头沟学院 Java
ttl: 3.19一面晚上过3.20二面3.23oc3.25offerbase:末9有一段中小厂实习一面面经:(总体时长一个小时二十分钟左右没什么八股,主要都是问项目和场景题1.实习(问了有四十分钟,感觉面试官很看重实习这一块,一直在拷打,问到后面我都要疯了,好在准备得比较充分1️⃣用的是什么中间件,有参与技术选型吗,实习的项目里为什么选这个RabbitMQ而不是kafka,为什么不用RocketMQ,为什么放弃异步,自己的项目里面使用的是kafka,那你觉得项目和实习的中间件选型有差异的原因是什么,他们之间的区别在哪里,底层的原因知道吗(高柱到这里已经快疯了,但是硬着头皮答完了,主要是从一致性吞吐量和框架的契合度答,面试官说答得挺好的,应该是没什么问题,这一块就问了快半个小时,到这里我已经快疯了2️⃣项目怎么对接上下游3️⃣介绍项目的难点重点4️⃣微服务(高柱实习是单体项目没涉及这一块5️⃣Redis的使用2.项目:1️⃣智能客服是怎么应用在项目里的(langchain4j➕rag➕functioncalling)2️⃣RAG了解多少3️⃣文本向量化的难点是什么,了解哪些大模型的知识(我一点不懂,纯瞎扯,但貌似扯对了4️⃣对ai的态度是什么,aicoding相关5️⃣怎么保证多节点下Caffeine缓存里面数据都是一致的(答的是短ttl,面试官不是很满意,但是我确实不太懂这个怎么保证,后来查了还是不懂怎么保证6️⃣Redis的使用,和你的实习项目的使用有区别吗,还有一些引申问题3.八股(含量不高,就是走个过场1️⃣进程的内存布局2️⃣Redis三剑客3️⃣微服务相关知识(高柱已经忘得差不多了…勉强答上来4️⃣JVM5️⃣线程状态6️⃣线程安全,在你的实习项目里怎么保证线程安全的(又绕回来了4.智商题找异常球5.手撕:1️⃣五道sql,不难2️⃣力扣不重叠的滑动窗口数组,贪心➕双指针秒了强度拉满了这个一面,高柱到后面人都是傻的二面面经:(就半个小时实习拷打,简历上写了几点就问了几点,问完就结束了,无手撕
查看19道真题和解析
点赞 评论 收藏
分享
评论
3
5
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务