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性能测试方法论

  • 性能测试的前期准备

    1. 分析业务场景 场景内容有哪些,范围较广,可与开发、产品,讨论确定本次测试的范围
    2. 分析测试策略 得到设计的测试场景有哪些
    3. 分析生产环境 搭建测试环境,建立一个小型相同的测试环境
    4. 选择测试工具 用什么方式来测试性能
  • 性能测试的目的

    1. 性能测试则通过提前模拟场景压力,来发现系统中可能的瓶颈,提前修复这些bug,减少服务器宕机的风险。
    2. 性能测试还可以用来评估待测软件在不同负载下的运作状况,可以针对某些数据得到一些决策
  • 性能下降曲线分析法

    1. 性能随用户数增长而出现下降趋势的曲线
    2. 性能主要指响应时间
    3. 分为:单用户区域、性能平坦区、压力区域、性能拐点

4.测试环境

4.1 架构图

image2019-12-17_16-22-54.png

实线为数据流向线 虚线为网络连接

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字节

效果展示:

只生产.png

返回数据详解

返回内容 解释
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;

``` 效果展示

消费效果图.png

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

只生产128.png

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

只生产不消费32.png

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

一边生产一边消费1.png

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

只消费2.png

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数据分析
  1. 在64线程和128的线程相应都出现过失败,内存使用率是在91%。
  2. 从数据中看出32线程 在16个队列,线程池为128 配置是最优,线程数增多,tps并没有上升。
  3. 在开大了队列数的情况下,32的线程与128的线程平均的tps差距不是很大,差距是在1000左右,且128的每秒耗时还很长 结论:32线程在目前配置最优。
  4. 服务器io使用率在67%左右,cpu在21% 服务器并没有达到一个性能最优点,应该还不是瓶颈。
  • 表5.1.2数据分析
  1. 设置线程池的数据是32,只生产的最大的tps是22235。比表5.1.1 配置的服务端线程为128。
  2. 发送的tps会更多,说明在8C 16G mq的服务端线程配置为32是最优。
  3. 存在同样一个问题,设置不同大小的线程数,服务器的压力并没有上去。
  4. 线程数增大,io的利用率有上升
  • 表 5.2中分析
  1. 生产的最大tps是18783 ,消费最大的tps 也是18738 ,在消费过程中,64的队列有出现过消费重试的情况。
  2. 128的线程与32的线程数据,也不是特别大的一些增长
  • 表5.3中分析
  1. 消费多少受网卡限制,网络流量大的消费数会更多。
  2. 只消费不生产,每秒最大的消费是48435,内存是在90.08 cpu消耗在9.81 io是在70.4 网卡是在402.72Mbps。
  • 表5.4.1中分析
  1. mq的配置进行更改,两台机器生产,总共64线程,tps也能达到22435。
  • 表5.4.2中分析
  1. 与表5.4.1中进行对比,更改DirectMemorySize,对生产没有太多影响,但是对消费单台上来看是有影响。

7.测试结论

  1. 只生产不消费场景,最大的tps是22235。
  2. 一边生产一边消费的场景,最大的tps生产是18738,消费最大的tps是18738。
  3. 只消费不生产,最大的tps是48435

  4. 配置如下:

    sendMessageThreadPoolNums=32

    pullMessageThreadPoolNums=32

    JAVA_OPT="${JAVA_OPT} -XX:MaxDirectMemorySize=1g

    JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g

    fileReservedTime=3

猜你喜欢

转载自www.cnblogs.com/chongyou/p/12391103.html