zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    洛谷 P2920 [USACO08NOV]时间管理Time Management
    湖南测试 1
    洛谷 P1824 进击的奶牛
    4、map 和 tuple
    -_-#【Better JS Code】插入迭代值
    -_-#【JS】defer / async
    -_-#【JS】HTML5 API
    【jQuery】jQuery API 过 一 遍
    ♫【函数】函数声明 / 函数表达式
    -_-#【Mac】命令
  • 原文地址:https://www.cnblogs.com/chongyou/p/12391103.html
Copyright © 2011-2022 走看看