当前位置: 首页 > news >正文

RocketMQ 4.x、5.x 性能对比

1.背景

目前我们生产环境使用的是 RocketMQ 4.7.1 版本,刚好最近遇到了一个消费阻塞的问题,如下图所示,假如 MQ 只有 2 个队列 A、B,当提交消息 1~6 时,按照 MQ 的默认分配策略,消息会被平均分配到两个队列中,而处理结果可能会出现下图这样,消息 4 的处理耗时非常长,队列 A 中三个消息都被处理完了,队列 B 中的批次 5、6 还在等待处理;针对这个问题, Rocket MQ 5 的 pop 消费模式看上去是很好地解决了这个问题;再且没有找到官方的性能对比报告,于是这里针对 RockMQ 4 和 5 做个性能测试对比;  

2.POP 消费模式验证

具体步骤这里不详细描述,结果从下图日志可以看到 queue-0 一直都被 blockConsumer 消费,但是到了下方箭头部分 queue-0 的数据也能够被 normal 消费到了,说明 pop 模式起作用了,初步观察是 queue-0 有消息积压时才会被其他消费者消费到该队列的数据。

3.性能测试前磁盘 IO 测试

以下三份表格分别对四台机器做了不同场景的磁盘 IO 压测得到的吞吐量,根据 RocketMQ 的读写特性,写数据时属于顺序写,读属于随机读,如果只是简单根据下面的报告来看,那么 RocketMQ 的消息消费性能远远小于生产性能,而由于 RocketMQ 使用了 mmap 机制把磁盘文件和内存做映射,以及利用了磁盘的 page cache,大部分时候消息在内存中就已经被转发给了消费者,少量的会从磁盘 page cache 查出来转发给消费者,只有在生产速度大于消费速度时,数据被持久化到磁盘并且 page cache 已经被清除的情况下,RocketMQ 的消费性能才会出现明显下降。

机器CPU内存顺序读顺序写随机读随机写混合随机读写,70%读 30%写
A16核2000MHz64G 2500 MHz673MB/s174MB/s12.1MB/s13.8MB/s读:7.9MB/s写:3.4MB/s
B16核2600MHz16G 2600 MHz955MB/s238MB/s38.6MB/s19.9MB/s读:20.1MB/s写:8.6MB/s
C8核2500MHz16G 2000 MHz1201MB/s456MB/s50.8MB/s14.0MB/s读:22.3MB/s写:9.6MB/s
D32核2600MHz32G 2600 MHz1099.4MB/s254.3MB/s33.5MB/s16.0MB/s读:18.0MB/s写:7.7MB/s
测试工具 fio,文件大小30G,线程16,数据块16k,测试时长100秒,同步 IO,不经过文件系统
机器CPU内存顺序读顺序写随机读随机写混合随机读写,70%读 30%写
A16核2000MHz64G 2500 MHz71.9MB/s12.1MB/s1.2MB/s1MB/s读:0.65MB/s写:0.28MB/s
B16核2600MHz16G 2600 MHz88.9MB/s15.2MB/s2.6MB/s1.2MB/s读:1.18MB/s写:0.51MB/s
C8核2500MHz16G 2000 MHz54.2MB/s5.8MB/s3.3MB/s1.2MB/s读:0.41MB/s写:0.18MB/s
D32核2600MHz32G 2600 MHz84.7MB/s17.7MB/s2.1MB/s1.1MB/s读:1.16MB/s写:0.50MB/s
测试工具 fio,文件大小30G,线程16,数据块1k,测试时长100秒,同步 IO,不经过文件系统
机器CPU内存顺序读顺序写随机读随机写混合随机读写,70%读 30%写
A16核2000MHz64G 2500 MHz79.7MB/s12.1MB/s1.5MB/s0.9MB/s读:0.79MB/s写:0.34MB/s
B16核2600MHz16G 2600 MHz120MB/s15.9MB/s4.6MB/s1.1MB/s读:1.41MB/s写:0.60MB/s
C8核2500MHz16G 2000 MHz60.9MB/s5.8MB/s18.3MB/s1.2MB/s读:0.41MB/s写:0.18MB/s
D32核2600MHz32G 2600 MHz83.8MB/s18MB/s3.9MB/s0.9MB/s读:1.40MB/s写:0.56MB/s
测试工具 fio,文件大小30G,线程64,数据块1k,测试时长100秒,同步 IO,不经过文件系统

4.测试场景及结果

注意事项:该压测在于对 RocketMQ 4 和 5 在同样场景同样配置下的性能差异,而非性能摸高;

关键配置:这里保持和生产环境的 MQ 配置一致;

# 限制的消息大小  改为128M
maxMessageSize=134217728
# 发送消息的最大线程数
sendMessageThreadPoolNums=32
# 发送消息是否使用可重入锁
useReentrantLockWhenPutMessage=true
# 一次拉取允许的最大条数,默认是32
maxTransferCountOnMessageInMemory=2048
# 一次HA主从同步传输的最大字节长度,默认为32K
haTransferBatchSize=134217728
useEpollNativeSelector=true
flushCommitLogLeastPages=4
flushConsumeQueueLeastPages=2
flushCommitLogThoroughInterval=10000
flushConsumeQueueThoroughInterval=60000
maxTransferCountOnMessageInMemory=1000
transientStorePoolEnable=false
warmMapedFileEnable=false
pullMessageThreadPoolNums=128
transferMsgByHeap=true
mapedFileSizeConsumeQueue=50000000

测试工具:RocketMQ 官方自带 benchmark;

测试版本:RocketMQ 4.7.1、RocketMQ 5.3.0

机器用途:B 为主节点,A 为从节点以及 NameServer 节点,C 为生产者,D 为消费者;

指标解释

  • B2C:born2Consumer,表示从这个消息出生到消费间隔的时间;
  • S2C:store2Consumer,表示从这个消息保存在broker到消费的时间间隔;

压测命令

  • producer:sh producer.sh -t topic_benchmark_test -w <线程数> -s <消息大小> -n NameServer:9876
  • consumer:sh consumer.sh -t topic_benchmark_test -n NameServer:9876 -g group_benchmark_test

部署模式:1 主 1 从、8G 内存、存算一体、同步刷盘、异步写从

测试场景版本失败数发送最大 TPS

最大 RT(发送)

平均 RT(发送)

平均 RT(B2C)

平均 RT(S2C)

最大 RT(B2C)最大 RT(S2C)

60 线程

1K 消息

16 队列

40233793362.5654.5553.5277271
50203896832.941 4.3723.6005654

60 线程

2K 消息

16 队列

40177224703.3844.8623.4363231
50175083613.4256.2705.0945150

80 线程

1K 消息

16 队列

40229636373.4823.8992.206128127
50223758013.5754.8553.5904341

80 线程

2K 消息

16 队列

40190143964.2065.0252.9769689
50190277194.2035.4653.7973129

120 线程

1K 消息

16 队列

40268789414.4624.6912.4253229
50255454924.6956.5164.6553937

120 线程

2K 消息

16 队列

40206636925.80622.51619.358199197
502179710205.50425.93123.634134131

120 线程

100K 消息

16 队列

40507671023.64066.48044.567433411
507039144317.05027683.21227665.1132984929833

部署模式:1 主 1 从、8G 内存、存算一体、异步刷盘、同步写从

测试场景版本失败数发送最大 TPS

最大 RT(发送)

平均 RT(发送)

平均 RT(B2C)

平均 RT(S2C)

最大 RT(B2C)最大 RT(S2C)

60 线程

1K 消息

16 队列

40230137082.6064.2322.3493432
50224965332.6663.9213.1363331

60 线程

2K 消息

16 队列

40197127543.042147.402145.381329327
50183093613.2755.1104.2284436

80 线程

1K 消息

16 队列

40247673953.2295.1072.751128126
50251664923.182 4.3173.2433534

80 线程

2K 消息

16 队列

40226283733.5341077.7601075.04012791277
50216568763.69311.42010.1267978

120 线程

1K 消息

16 队列

40286136874.1928.3925.6225957
50346028473.4676.7385.5074241

120 线程

2K 消息

16 队列

402356311315.09121670.38721666.4432222022217
50214679045.588217.787215.584637635

120 线程

100K 消息

16 队列

40594277620.18741077.35641055.9764180441786
50654684719.13118479.36518461.6941881118793

5.总结

  1. 总体上看性能差不多,但是对于消息体不大的我们常用的场景 RocketMQ 4 比 5 要好一丢丢; 
  2. RocketMQ 5 在需要主从同步的场景稳定性会比 4 更好;
  3. 对于其他性能相关的参数配置暂未调整,可能会有不一样的表现但应该差距不会大;
  4. 存算分离模式因为从架构上看多了一层网络交互,所以从理论上性能会比主从模式更低,但是在大规模集群情况下会有明显的性能优势,我们系统暂时用不到所以这里没有测试;
  5. Dledger 模式和 Controller 模式属于高可用部署模式,也不在这探索;

相关文章:

  • 绩效考核如何从形式化任务升级为公司战略工具?
  • 2025.3.25
  • 基于CondLaneNet论文和全卷积分割头的车道线head设计
  • QML输入控件: Dial基本用法与样式定制(1)
  • 【机器学习】imagenet2012 数据预处理数据预处理
  • K8S学习之基础五十二:k8s配置jenkins
  • Vite 与 Nuxt 深度对比分析
  • 软件设计模式-第一章
  • 数据源为postgres的多表关联flink开发需求,开发思路
  • jmeter通过json提取器获取接口返回token(超详细)
  • 3.1.2 内存池
  • Java.util包之Java.util.List接口
  • 【msyql】LInux安装Mysql
  • kubernetes高级应用之初始化容器
  • 第 6 章 | 区块链预言机操控与闪电贷攻击全解析
  • 数据结构之队列的链式结构-初始化-判断队列是否为空-入队-出队-获取队头元素
  • 八目导航 version:1.2
  • Linux 中进程的 nice 值对程序的占用的影响测试
  • 边缘计算 vs. 云计算,谁才是工业物联网的未来?
  • Matlab Hessian矩阵计算(LoG算子)
  • 游戏论|暴君无道,吊民伐罪——《苏丹的游戏》中的政治
  • 读图|展现城市品格,上海城市影像走进南美
  • 水利部:山西、陕西等地旱情将持续
  • 圆桌丨中俄权威专家详解:两国携手维护战后国际秩序,捍卫国际公平正义
  • 上市不足一年,吉利汽车拟私有化极氪并合并:整合资源,杜绝重复投入
  • 俄乌互相空袭、莫斯科机场关闭,外交部:当务之急是避免局势紧张升级