RocketMQ性能压测分析

本文通过部署RocketMQ集群并进行性能测试,发现单机TPS可达16000,消费延迟稳定在1.3秒左右。评测过程中,系统表现出良好的稳定性,未出现频繁的GC或内存压力等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原创文章,转载请注明出处:http://jameswxx.iteye.com/blog/2093785

 

一   机器部署

1.1  机器组成

1台nameserver

1台broker  异步刷盘

2台producer

2台consumer
 

1.2  硬件配置

CPU  两颗x86_64cpu,每颗cpu12核,共24核

内存 48G

网卡 千兆网卡

磁盘 除broker机器的磁盘是RAID10,共1.1T,其他都是普通磁盘约500G
 

1.3  部署结构

橙色箭头为数据流向,黑色连接线为网络连接
 
 

1.4  内核参数

broker是一个存储型的系统,针对磁盘读写有自己的刷盘策略,大量使用文件内存映射,文件句柄和内存消耗量都比较巨大。因此,系统的默认设置并不能使RocketMQ发挥很好的性能,需要对系统的pagecache,内存分配,I/O调度,文件句柄限制做一些针对性的参数设置。

 

系统I/O和虚拟内存设置

echo 'vm.overcommit_memory=1' >> /etc/sysctl.conf

echo 'vm.min_free_kbytes=5000000' >> /etc/sysctl.conf

echo 'vm.drop_caches=1' >> /etc/sysctl.conf

echo 'vm.zone_reclaim_mode=0' >> /etc/sysctl.conf

echo 'vm.max_map_count=655360' >> /etc/sysctl.conf

echo 'vm.dirty_background_ratio=50' >> /etc/sysctl.conf

echo 'vm.dirty_ratio=50' >> /etc/sysctl.conf

echo 'vm.page-cluster=3' >> /etc/sysctl.conf

echo 'vm.dirty_writeback_centisecs=360000' >> /etc/sysctl.conf

echo 'vm.swappiness=10' >> /etc/sysctl.conf

 

系统文件句柄设置

echo 'ulimit -n 1000000' >> /etc/profile

echo 'admin hard nofile 1000000' >> /etc/security/limits.conf

 

系统I/O调度算法

deadline
 

1.5 JVM参数

采用RocketMQ默认设置

 -server -Xms4g -Xmx4g -Xmn2g -XX:PermSize=128m -XX:MaxPermSize=320m -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:SoftRefLRUPolicyMSPerMB=0 -XX:+CMSClassUnloadingEnabled -XX:SurvivorRatio=8 -XX:+DisableExplicitGC -verbose:gc -Xloggc:/root/rocketmq_gc.log -XX:+PrintGCDetails -XX:-OmitStackTraceInFastThrow 

 

二   性能评测

2.1  评测目的

压测单机TPS,评估单机容量
 

2.2  评测指标

最高的TPS不代表最适合的TPS,必须在TPS和系统资源各项指标之间取得一个权衡,系统资源快达到极限,但尚能正常运转,此时的TPS是比较合适的。比如ioutil最好不要超过75%,cpu load最好不超过总的核数或者太多,没有发生频繁的swap导致较大的内存颠簸。所以不能只关注TPS,同时要关注以下指标:

消息:TPS

cpu:load,sy,us

内存:useed,free,swap,cache,buffer

I/O:iops,ioutil,吞吐量(数据物理读写大小/秒)

网络:网卡流量

 

2.3  评测方式

两台producer起等量线程,不间断的向broker发送大小为2K的消息,2K消息意味着1000个字符,这个消息算比较大了,完全可以满足业务需要。

 

2.4  评测结果

TPS比较高

    经过长时间测试和观察,单个borker TPS高达16000,也就是说服务器能每秒处理16000条消息,且消费端及时消费,从服务器存储消息到消费端消费完该消息平均时延约为1.3秒,且该时延不会随着TPS变大而变大,是个比较稳定的值。

 

Broker稳定性较高

    两台producer一共启动44个线程10个小时不停发消息,broker非常稳定,这可简单意味着实际生产环境中可以有几十个producer向单台broker高频次发送消息,但是broker还会保持稳定。在这样比较大的压力下,broker的load最高才到3(24核的cpu),有大量的内存可用。

    而且,连续10几小时测试中,broker的jvm非常平稳,没有发生一次fullgc,新生代GC回收效率非常高,内存没有任何压力,以下是摘自gclog的数据:

2014-07-17T22:43:07.407+0800: 79696.377: [GC2014-07-17T22:43:07.407+0800: 79696.377: [ParNew: 1696113K->18686K(1887488K), 0.1508800 secs] 2120430K->443004K(3984640K), 0.1513730 secs] [Times: user=1.36 sys=0.00, real=0.16 secs] 

新生代大小为2g,回收前内存占用约为1.7g,回收后内存占用17M左右,回收效率非常高。

 

 关于磁盘IO和内存

    平均单个物理IO耗时约为0.06毫秒,IO几乎没有额外等待,因为await和svctm基本相等。整个测试过程,没有发生磁盘物理读,因为文件映射的关系,大量的cached内存将文件内容都缓存了,内存还有非常大的可用空间。

 

系统的性能瓶颈

    TPS到达16000后,再就上不去了,此时千兆网卡的每秒流量约为100M,基本达到极限了,所以网卡是性能瓶颈。不过,系统的IOUTIL最高已经到达40%左右了,这个数字已经不低了,所以即使网络流量增加,但是系统IO指标可能已经不健康了,总体来看,单机16000的TPS是比较安全的值。

 

 

 

以下是各项指标的趋势
TPS
TPS最高可以压倒16000左右,再往上压,TPS有下降趋势
 
CPU

随着线程数增加,最后稳定在3左右,对于总共24核的两颗CPU,这点load根本不算什么

 
内存
内存非常平稳,总量48G,实际可用内存非常高
没有发生swap交换,不会因为频繁访问磁盘导致系统性能颠簸
大量内存被用来作为文件缓存,见cached指标,极大的避免了磁盘物理读
 

磁盘吞吐量

随着线程数增加,磁盘物理IO每秒数据读写大约为70M左右
 
磁盘IOPS
随着线程数增加,磁盘IOPS大约稳定在5000左右
注意非常重要的细节,即使在高达16000TPS时,磁盘仍然没有发生物理读,这和内存的cached指标是遥相呼应的,文件几乎全部在内存里,没有发生一次物理读,所以文件读的效率非常高,消息消费非常快
 
IO百分比
随着线程数增加,IO百分比最后稳定在40%左右,这个数字可以接受
 
网络
系统使用的千兆网卡,理论传输最大值为128M/秒,实际能达到100M就不错了。从图中可以看到,不断往上压请求,但是网卡流量已经上不去了
 
 

 

### 如何对 RocketMQ 进行性能试 #### 方法与工具 为了实现高效的性能试,通常会选择合适的工具和技术栈。对于 RocketMQ 性能试而言,JMeter 是一种广泛使用的开源负载试工具,能够模拟大量用户操作以评估系统的响应时间、吞吐量和其他重要指标[^2]。 另一种方式是利用 RocketMQ 自带的试工具 `mqbench` 或者基于 Spring Boot 构建的应用程序来进行。这种方式可以更贴近真实的业务场景,因为可以直接调用 RocketMQ 的原生 API 来发送和接收消息[^1]。 #### 参数配置 当采用 JMeter 结合自定义 Java 类的方式进行 RocketMQ 试时,需注意以下几点: - **Broker 地址**: 需要在 JMeter 中通过 `JavaSamplerContext` 设置 Broker IP 和端口信息以便连接到目标 RocketMQ 实例。 - **Topic 名称**: 同样地,在同一个上下文中指定用于试的消息主题名称。 - **消息 Key 及内容**: 定义好每条待发消息的关键字及其具体内容,这有助于后续的数据分析工作[^3]。 此外,还需考虑其他可能影响试效果的因素如线程数、循环次数等,并合理调整这些参数以获得准确的结果。 #### 最佳实践 为确保得到可靠的性能数据,建议遵循如下最佳做法: - 使用稳定的硬件资源执行试任务,避免因外部干扰而导致异常波动; - 尽量减少不必要的网络延迟,比如在同一局域网内部署客户端和服务端节点; - 对于大规模并发请求情况下的长时间运行试,务必提前规划好日志记录机制,便于事后排查问题所在; - 多次重复相同的实验流程并取平均值作为最终结论依据,从而提高统计学上的可信度; ```java // 示例代码片段展示如何创建一个简单的 RocketMQ 生产者实例 public class ProducerExample { public static void main(String[] args) throws MQClientException, InterruptedException { DefaultMQProducer producer = new DefaultMQProducer("please_rename_unique_group_name"); producer.setNamesrvAddr("localhost:9876"); // 设定 Name Server 地址 producer.start(); for (int i = 0; i < 100; ++i) { // 发送一百条消息 Message msg = new Message( "TopicTest", // topic "TagA", // tag ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET)); SendResult sendResult = producer.send(msg); System.out.printf("%s%n", sendResult); } producer.shutdown(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值