rocketmq性能测试
1.需求背景
在1台生产者、1台broker、1台namesrv 、1台消费者的架构中,测试字节为1024B,客户端线程数:256、128、64、32,MQ队列大小为16、32、64、128,进行roketmq的生产与消费的性能测试,找出最大tps。
RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等。官方文档地址:http://rocketmq.apache.org/
2.需求分析
针对需求,现需测试下列几个场景:
- rocketMQ测试场景为只生产,查看发送的最大的tps为多少
- rokcetmq测试场景为只消费,查看消费的最大tps为多少
- rocketmq测试场景为一边生产一边的消费,最大的tps为多少
- rocketmq更改配置后查看生产、消费、以及一边生产一边消费与没有更改配置前的数据差异
3.基础介绍
3.1 术语介绍
名词 | 描述 | |
---|---|---|
nameserver | 服务发现Server,用于生产者和消费者获取Broker的服务 | |
producer | 消息生产者,负责生产消息,一般由业务系统负责生成消息 | |
consumer | 消息消费者,负责消费消息,一般是后台系统负责异步消息 | |
broker | 消息中转角色,负责存储消息,转发消息。 | |
master | broker中的主节点 | |
slave | broker中的副节点。 | |
ASYNC_FLUSH | 异步刷盘,Broker的一种持久化策略,消息写入pagecache后,直接返回。由异步线程负责将pagecache写入硬盘。单节点一定是异步刷盘 | |
SYNC_FLUSH | 同步刷盘,Broker的一种持久化策略,消息写入pagecache后,由同步线程将pagecache写入硬盘后,再返回 | |
TPS | Broker吞吐量,每秒钟Broker接收或者投递的消息条数。 | |
同步双写 | 消息同时写入master节点和slave节点 | |
异步复制 | 消息写入master节点,再由master节点异步复制到slave节点 | |
性能计数器(资源利用率) | 描述服务器或操作系统性能的一些数据指标 |
3.2性能测试方法论
-
性能测试的前期准备
- 分析业务场景 场景内容有哪些,范围较广,可与开发、产品,讨论确定本次测试的范围
- 分析测试策略 得到设计的测试场景有哪些
- 分析生产环境 搭建测试环境,建立一个小型相同的测试环境
- 选择测试工具 用什么方式来测试性能
-
性能测试的目的
- 性能测试则通过提前模拟场景压力,来发现系统中可能的瓶颈,提前修复这些bug,减少服务器宕机的风险。
- 性能测试还可以用来评估待测软件在不同负载下的运作状况,可以针对某些数据得到一些决策
-
性能下降曲线分析法
- 性能随用户数增长而出现下降趋势的曲线
- 性能主要指响应时间
- 分为:单用户区域、性能平坦区、压力区域、性能拐点
4.测试环境
4.1 架构图
实线为数据流向线 虚线为网络连接
4.2 被测系统
RocketMQ作为一款纯java、分布式、队列模型的开源消息中间件,支持事务消息、顺序消息、批量消息、定时消息、消息回溯等
4.3 测试资源
类型 | OS | CPU | Memery | Disk | 备注 |
---|---|---|---|---|---|
客户端 | Linux version 3.10.0-862.el7.x86_64 | 8核 | 16G | 200G | 生产机 |
客户端 | Linux version 3.10.0-862.el7.x86_64 | 8核 | 16G | 200G | 生产机 |
客户端 | Linux version 3.10.0-862.el7.x86_64 | 8核 | 16G | 200G | 消费机 |
客户端 | Linux version 3.10.0-862.el7.x86_64 | 8核 | 16G | 200G | 消费机 |
broker | Linux version 3.10.0-862.el7.x86_64 | 8核 | 16G | 500G | Gdis flushDiskType=ASYNC_FLUSH brokerRole=ASYNC_MASTER |
nameserver | Linux version 3.10.0-862.el7.x86_64 | 8核 | 16G | 500G | nameserver |
4.4 测试工具
4.4.1 工具说明
压测工具使用rocketmq源码中提供的benchmark工具,因为对mq做了二次封装,重新编译benchmark工具源码,打包生成一个jar文件,主要使用是的类为
producer文件:
用于生产消息,测试时需要提前创建topic,如我们使用的生产的topic 为zj_test_topic,w 参数可更改线程数 s参数可更改信息大小 k是启用口令,默认启动时是64个线程,1024字节大小
```java
final String topic = commandLine.hasOption('t') ? commandLine.getOptionValue('t').trim() : "zj_test_topic"; //
final int threadCount = commandLine.hasOption('w') ? Integer.parseInt(commandLine.getOptionValue('w')) : 64;//64
final int messageSize = commandLine.hasOption('s') ? Integer.parseInt(commandLine.getOptionValue('s')) : 1024;
final boolean keyEnable = commandLine.hasOption('k') && Boolean.parseBoolean(commandLine.getOptionValue('k'));
final int propertySize = commandLine.hasOption('p') ? Integer.parseInt(commandLine.getOptionValue('p')) : 0;
```
使用方式:
java -jar XX.jar 的方式运行打包好的jar文件 可输入不同参数,有不同的效果,不输入参数默认是使用64线程1028B字节
效果展示:
返回数据详解
返回内容 | 解释 |
---|---|
Time | 当前的时间戳 |
Max RT | 采样时间断内 发送消息最大耗时单位(ms) |
sendTps | 这段时间内 每秒发送成功了多少条 |
averageRT | 每条平均耗时多少毫秒 |
Send Failed | 发送请求失败条数 |
Responese Failed | 接收响应失败条数 |
Consumer文件:
用于消费消息,Topic 还是使用的:zj_test_topic,group组为benchmark_consumer,参数有这几项,需要提前创建消费组
```java
final String topic = commandLine.hasOption('t') ? commandLine.getOptionValue('t').trim() : "zj_test_topic";
final String groupPrefix = commandLine.hasOption('g') ? commandLine.getOptionValue('g').trim() : "benchmark_consumer";
final String isPrefixEnable = commandLine.hasOption('p') ? commandLine.getOptionValue('p').trim() : "true";
final String filterType = commandLine.hasOption('f') ? commandLine.getOptionValue('f').trim() : null;
final String expression = commandLine.hasOption('e') ? commandLine.getOptionValue('e').trim() : null;
``` 效果展示
4.5 测试用例
用例编号 | 用例优先级 | 前置条件 | 功能点 | 测试步骤 |
---|---|---|---|---|
1 | 1 | mq写入与读取客户端队列为16、32、64、128 | 只生产,不消费,配置使用默认 | 启动生产脚本,分别记录以下4个不同线程的数据 1.生产的线程为16 2.生产线程为32 3.生产线程为64 4.生产线程为128 每次执行三分钟,执行三次,取每个线程的平均值记录 |
2 | 1 | mq写入与读取客户端队列为1616、32、64、128 | 只消费,不生产,只消费,不生产,配置使用默认 | 1.1台消费机启动消费脚本, |
3 | 1 | mq写入与读取客户端队列为16、32、64、128 | 一边生产一边消费,配置使用默认 | 1.启动生产脚本,生产脚本线程数为16 2.启动消费脚本 3.记录数据 重复三次取平均值 4.启动生产脚本线程数32、64、128 在启动消费脚本,查看每个不同线程之间tps的区别 |
4 | 1 | mq写入与读取客户端队列为128 | 只生产不消费,更改配置 sendMessageThreadPoolNums=16 pullMessageThreadPoolNums=24 JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=8g JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g fileReservedTime=24 | 1.记录一台机器生产的数据,32线程 2 两台机器生产的数据,64线程 3.三台机器生产的数据,96线程 |
5 | 1 | mq写入与读取客户端队列为128 | 只消费不生产,更改配置 sendMessageThreadPoolNums=16 pullMessageThreadPoolNums=24 JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=4g JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g fileReservedTime=24 | 1.单台消费 2.两台机器消费 3.三台机器消费 |
5.数据采集
5.1 只生产不消费数据
5.1.1 mq的服务端线程为128
以下数据在8核16G Gdisk 500G 本地磁盘的测试数据, 客户端cpu消耗是在11%左右,meery是在3.8%。
线程 | 队列 | 发送总数 | 成功总数 | 失败总数 | 总耗时S | 平均每秒耗时MS | 平均每秒TPS | 最小TPS | 内存 | cpu | io | 网卡Mbps |
---|---|---|---|---|---|---|---|---|---|---|---|---|
128 | 16 | 3012045 | 3011917 | 128 | 180 | 6.86 | 16732 | 13963 | 41.6% | 17.03% | 70.40% | 120.00 |
64 | 16 | 3325959 | 3325895 | 64 | 180 | 3.41 | 18476 | 15734 | 91.30% | 22.40% | 68.15% | 121.60 |
32 | 16 | 3348795 | 3348795 | 0 | 180 | 1.69 | 18604 | 18042 | 87.84% | 21.20% | 67.33% | 141.30 |
16 | 16 | 3083783 | 3083783 | 0 | 180 | 0.92 | 17131 | 15580 | 88.30% | 19.26% | 65.37% | 111.07 |
128 | 32 | 3186872 | 3186872 | 0 | 180 | 7.23 | 17705 | 15645 | 28.33% | 21.76% | 73.60% | 205.67 |
32 | 32 | 2997059 | 2997059 | 0 | 180 | 1.92 | 16650 | 14822 | 82.67% | 23.80% | 66.46% | 176.40 |
128 | 64 | 3131980 | 3131980 | 0 | 180 | 7.37 | 17399 | 15790 | 81.20% | 24.80% | 68.81% | 279.21 |
32 | 64 | 2988630 | 2988630 | 0 | 180 | 1.91 | 16603 | 14379 | 79.90% | 24.04% | 67.68% | 164.91 |
128 | 128 | 3159227 | 3159227 | 0 | 180 | 7.30 | 17550 | 16137 | 78.20% | 18.04% | 69.06% | 155.22 |
32 | 128 | 3071727 | 3071727 | 0 | 180 | 1.87 | 17064 | 14657 | 76.60% | 22.00% | 67.34% | 192.11 |
mq的服务端线程数为32
客户端线程 | MQ队列 | 发送总数 | 成功总数 | 失败总数 | 总耗时S | 平均每秒耗时MS | 平均每秒TPS | 最小TPS | 内存 | cpu | io | 网卡Mbps |
---|---|---|---|---|---|---|---|---|---|---|---|---|
128 | 16 | 3863211 | 3863211 | 0 | 180 | 5.90 | 21462 | 17514 | 87.47% | 25.03% | 72.67% | 235.90 |
32 | 16 | 2944788 | 2944788 | 0 | 180 | 1.99 | 16360 | 13177 | 86.43% | 21.61% | 67.32% | 167.00 |
128 | 32 | 4002386 | 4002386 | 0 | 180 | 5.64 | 22235 | 19365 | 84.36% | 24.76% | 74.13% | 227.26 |
32 | 32 | 2806068 | 2806068 | 0 | 180 | 2.06 | 15589 | 12946 | 82.77% | 25.19% | 65.80% | 133.28 |
128 | 64 | 3990606 | 3990606 | 0 | 180 | 5.78 | 22169 | 19267 | 81.00% | 26.16% | 73.68% | 244.87 |
32 | 64 | 2881353 | 2881353 | 0 | 180 | 2.02 | 16007 | 12866 | 79.90% | 24.63% | 67.04% | 134.73 |
128 | 128 | 3927619 | 3927570 | 146 | 180 | 5.69 | 21819 | 18303 | 86.93% | 23.18% | 72.71% | 198.02 |
64 | 128 | 3463569 | 3463569 | 0 | 180 | 3.41 | 19241 | 16460 | 90.53% | 25.88% | 73.20% | 190.81 |
32 | 128 | 2893022 | 2893022 | 0 | 180 | 2.03 | 16071 | 13737 | 90.86% | 23.34% | 64.94% | 164.95 |
16 | 128 | 2768207 | 2768207 | 0 | 180 | 1.02 | 15378 | 12925 | 90.63% | 23.25% | 62.43% | 172.03 |
5.2 一边生产一边消费
mq的服务端线程数为32
客户端线程 | MQ队列 | 发送总数 | 成功总数 | 失败总数 | 总耗时S | 每秒最小TPS | 平均每秒耗时(ms) | 平均每秒tps | 消费总数 | 消费总耗时S | 每秒消费耗时 | 平均每秒消费的TPS | 内存 | cpu | io | 网卡Mbps |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
128 | 16 | 3372841 | 3391563 | 128 | 180 | 18509 | 6.70 | 18738 | 3372826 | 180 | 7.76 | 18738 | 83.93% | 28.39% | 64.73% | 395.86 |
64 | 16 | 2816585 | 2816585 | 0 | 180 | 14406 | 4.07 | 15647 | 2837925 | 180 | 5.60 | 15766 | 92.87% | 26.53% | 63.62% | 334.38 |
32 | 16 | 2431239 | 2431239 | 0 | 180 | 12232 | 2.35 | 13507 | 2431251 | 180 | 3.59 | 13507 | 92.43% | 36.06% | 62.50% | 303.21 |
16 | 16 | 2037588 | 2037588 | 0 | 180 | 108797 | 1.37 | 11320 | 2053917 | 180 | 2.98 | 11410 | 92.43% | 29.69% | 57.16% | 290.05 |
128 | 32 | 3161350 | 3161350 | 0 | 180 | 16738 | 7.93 | 17563 | 3161375 | 180 | 8.50 | 17563 | 92.00% | 35.69% | 63.55% | 326.53 |
32 | 32 | 2268766 | 2268766 | 0 | 180 | 11339 | 2.52 | 12604 | 2268780 | 180 | 3.81 | 12604 | 91.63% | 31.48% | 65.77% | 274.33 |
128 | 64 | 3222172 | 3222172 | 0 | 180 | 17190 | 7.02 | 17936 | 3222200 | 180 | 8.94 | 17900 | 91.60% | 38.18% | 63.91% | 335.87 |
32 | 64 | 2285664 | 2285677 | 0 | 180 | 11764 | 2.56 | 12698 | 2285712 | 180 | 3.66 | 12698 | 91.46% | 32.36% | 65.67% | 334.28 |
128 | 128 | 3139562 | 3139562 | 0 | 180 | 17010 | 7.316 | 17442 | 3139685 | 180 | 4.67 | 17442 | 91.23% | 37.28% | 63.13% | 334.66 |
32 | 128 | 2188890 | 2188890 | 0 | 180 | 11377 | 2.456 | 12161 | 2188940 | 180 | 3.73 | 12160 | 91.26% | 31.03% | 65.58% | 296.08 |
5.3 只消费不生产
mq的服务端线程数为32
队列数 | 消费总数 | 总耗时S | 平均每秒消费多少条 | 消费的最小TPS | 内存 | cpu | io | 网卡Mbps |
---|---|---|---|---|---|---|---|---|
16 | 7714076 | 180 | 42856 | 33316 | 82.30% | 5.97% | 72.67% | 298.85 |
32 | 9815200 | 180 | 54528 | 48435 | 90.80% | 9.81% | 70.40% | 402.72 |
64 | 5241008 | 180 | 29116 | 28016 | 79.45% | 10.00% | 77.81% | 202.49 |
128 | 4905447 | 180 | 27252 | 22258 | 89.00% | 6.85% | 82.80% | 169.06 |
5.4 更改配置进行只生产与只消费
线上配置 | 测试配置 |
---|---|
sendMessageThreadPoolNums=32 pullMessageThreadPoolNums=48 JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=15g JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g fileReservedTime=48 | sendMessageThreadPoolNums=32 pullMessageThreadPoolNums=32 JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=1g JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g fileReservedTime=3 |
5.4.1 更改测试环境配置1:
-
配置如下:
sendMessageThreadPoolNums=16
pullMessageThreadPoolNums=24
JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=8g
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g
fileReservedTime=24
只生产不消费,mq队列数为128
生产资源 | 发送总数 | 成功总数 | 失败总数 | 总耗时S | 平均每秒耗时MS | 平均每秒TPS | 最小TPS | 内存 | cpu | io | 网卡Mbps |
---|---|---|---|---|---|---|---|---|---|---|---|
平均客户端32线程 | 3378373 | 3378373 | 0 | 180 | 1.70 | 18768 | 17079 | 66.25% | 21.28% | 71.28% | 227.06 |
两台机器 总共64个线程 | 4038307 | 4038307 | 0 | 180 | 5.80 | 22435 | 7304 | 62.60% | 25.64% | 74.79% | 169.75 |
三台机器 总共96个线程 | 4151958 | 4151958 | 0 | 180 | 12.70 | 23066 | 6239 | 62.50% | 31.96% | 71.86% | 217.80 |
只消费不生产,mq队列数为128
消费资源 | 消费总数 | 总耗时 | 平均每秒消费多少条 | 消费的最小tps | 内存 | cpu | io | 网卡Mbps |
---|---|---|---|---|---|---|---|---|
单台消费 | 4055083 | 180 | 22528 | 12487 | 65.01% | 4.76% | 87.03% | 138.81 |
两台机器消费 | 4724078 | 180 | 26244 | 3128 | 87.80% | 4.80% | 89.29% | 168.94 |
5.4.2 更改测试环境配置2:
-
配置如下
sendMessageThreadPoolNums=16
pullMessageThreadPoolNums=24
JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=4g
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g
fileReservedTime=24
只生产不消费,mq队列数为128
生产资源 | 发送总数 | 成功总数 | 失败总数 | 总耗时S | 平均每秒耗时MS | 平均每秒TPS | 最小TPS | 内存 | cpu | io | 网卡Mbps |
---|---|---|---|---|---|---|---|---|---|---|---|
一条机器生产32线程 | 3159430 | 3159430 | 0 | 180 | 1.78 | 17552 | 10797 | 63.50% | 29.55% | 69.64% | 152.28 |
两台机器 总共64个线程 | 3914251 | 3914251 | 0 | 180 | 7.05 | 21745 | 8976 | 62.10% | 22.07% | 71.70% | 274.09 |
三台机器 总共96个线程 | 4214910 | 4214910 | 0 | 180 | 12.28 | 23416 | 5750 | 61.90% | 30.47% | 70.89% | 206.63 |
只消费不生产,mq队列数为128
消费资源 | 消费总数 | 总耗时S | 平均每秒消费多少条 | 消费的最小TPS | 内存 | cpu | io | 网卡Mbps |
---|---|---|---|---|---|---|---|---|
单台消费 | 2929955 | 180 | 16277 | 13132 | 59.70% | 3.07% | 85.32% | 151.40 |
两台机器消费 | 5011936 | 180 | 27844 | 3264 | 71.90% | 3.42% | 93.86% | 174.91 |
三台机器消费 | 2269248 | 180 | 12606 | 1799 | 74.90% | 2.11% | 86.89% | 89.56 |
6.数据分析
- 表5.1.1数据分析
- 在64线程和128的线程相应都出现过失败,内存使用率是在91%。
- 从数据中看出32线程 在16个队列,线程池为128 配置是最优,线程数增多,tps并没有上升。
- 在开大了队列数的情况下,32的线程与128的线程平均的tps差距不是很大,差距是在1000左右,且128的每秒耗时还很长 结论:32线程在目前配置最优。
- 服务器io使用率在67%左右,cpu在21% 服务器并没有达到一个性能最优点,应该还不是瓶颈。
- 表5.1.2数据分析
- 设置线程池的数据是32,只生产的最大的tps是22235。比表5.1.1 配置的服务端线程为128。
- 发送的tps会更多,说明在8C 16G mq的服务端线程配置为32是最优。
- 存在同样一个问题,设置不同大小的线程数,服务器的压力并没有上去。
- 线程数增大,io的利用率有上升
- 表 5.2中分析
- 生产的最大tps是18783 ,消费最大的tps 也是18738 ,在消费过程中,64的队列有出现过消费重试的情况。
- 128的线程与32的线程数据,也不是特别大的一些增长
- 表5.3中分析
- 消费多少受网卡限制,网络流量大的消费数会更多。
- 只消费不生产,每秒最大的消费是48435,内存是在90.08 cpu消耗在9.81 io是在70.4 网卡是在402.72Mbps。
- 表5.4.1中分析
- mq的配置进行更改,两台机器生产,总共64线程,tps也能达到22435。
- 表5.4.2中分析
- 与表5.4.1中进行对比,更改DirectMemorySize,对生产没有太多影响,但是对消费单台上来看是有影响。
7.测试结论
- 只生产不消费场景,最大的tps是22235。
- 一边生产一边消费的场景,最大的tps生产是18738,消费最大的tps是18738。
-
只消费不生产,最大的tps是48435。
-
配置如下:
sendMessageThreadPoolNums=32
pullMessageThreadPoolNums=32
JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=1g
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g
fileReservedTime=3
作者:做梦的人(小姐姐) 出处:https://www.cnblogs.com/chongyou/ 本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。 如果文中有什么错误,欢迎指出。以免更多的人被误导。 微信号:18582559217 |