; ;

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 测试资源

类型OSCPUMemeryDisk备注
客户端 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内存cpuio网卡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内存cpuio网卡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内存cpuio网卡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内存cpuio网卡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内存cpuio网卡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内存cpuio网卡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内存cpuio网卡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内存cpuio网卡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

posted @ 2020-03-01 18:07  做梦的人-  阅读(11876)  评论(1编辑  收藏  举报