Jmeter压测MQTT协议

1、Jmeter介绍
Jmeter是apache下的一个纯Java编写的开源压力测试软件,起初设计目的是为了测试Web应用程序,现在已经扩展到其他测试场景。由于其Java编写具有跨平台特性,可运行于Windows、Linux、MacOS等平台,官方网站:https://jmeter.apache.org/

2、下载安装
1)安装Jmeter前需要安装配置好Java环境,最新版Jmeter(Apache JMeter 5.4)需要JDK8及以上环境
2)官网下载解压Jmeter,下载地址:https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-5.4.tgz
3)下载解压后,进入jmeter的bin目录下,windows下运行jmeter.bat即可打开Jmeter图形化界面,可在选项-选择语音中,选择简体中文,也可以在bin目录下的jmeter.properties配置文件中设置language=zh_CN
4)由于本次压力测试目标服务协议为MQTT,但是Jmeter本身并不支持MQTT协议,需要安装第三方插件支持,该插件名为mqtt-jmeter,发布于github,地址:https://github.com/xmeter-net/mqtt-jmeter,进入releases,下载最新版https://github.com/xmeter-net/mqtt-jmeter/releases/download/v2.0.2/mqtt-xmeter-2.0.2-jar-with-dependencies.jar,下载该插件后,直接放入Jmeter的lib/ext目录下即可,重启jmeter,重启后即可创建mqtt协议对应的4种取样器

3、使用步骤
注意:进入jmeter压力测试图形化界面后,控制台打印一段描述如下:
Jmeter压测MQTT协议_第1张图片
该描述大概说明,jmeter图形化界面仅作为压力测试的创建和调试,正式压测应该使用命令行模式,使用命令加载指定压测脚本执行压测,并且根据需要设置运行时Java进程堆内存大小
1)添加线程组,在测试计划上点击右键添加-线程-线程组,指定线程数、Ramp-Up时间、循环次数
线程数:代表压力测试参与的线程或者说用户数量,模拟50个设备需要创建50个线程,这里的线程数我们设置50
Ramp-Up时间:代表我们上面设置的50个线程是经过多久运行起来的,1秒代表在一秒内50个线程依次启动,设置为0代表同时启动
循环次数:代表当前压测是否循环执行,以及循环执行次数
2)添加取样器,在刚创建的线程组上右键点击添加-取样器-MQTT connect、MQTT pub Sampler、MQTT Dis connect,根据需要添加不同的MQTT协议取样器,这里我们添加3个,分别执行连接、发布、断开
MQTT connect:连接取样器,线程使用该取样器创建一个MQTT连接,在该取样器中设置MQTT服务器的IP、端口,下面的鉴权相关设备由于不同设备username不同,等到创建了响应配置原件后再来设置
MQTT pub Sampler:发布取样器,这里定义每个线程发布消息时用的topic以及要发送的有效载荷内容,可以根据配置原件动态从csv文件中取得,也可以写死
MQTT Sub connect:订阅取样器,这里定义每个线程要订阅的topic
MQTT Dis connect:断开连接取样器,线程遇到断开取样器则断开当前MQTT连接
3)添加逻辑控制器,由于压测流程中我们比较关注发布遥测数据的吞吐量和处理能力,所有MQTT的发布取样器不能只执行一次,我们需要发布取样器执行很多次,这里我们添加一个循环控制器,线程组上点击右键添加-逻辑控制器-循环控制器,指定循环次数或者勾上永远则会不断循环,然后将刚才添加的MQTT pub Sampler取样器拖拽进循环控制器之中,即可实现发布取样器的循环执行,而不影响连接断开取样器
4)添加配置原件,由于我们压测模拟的设备每台都需要有不同的参数如:用户名、客户端ID等,所以这里我们还需要添加一个配置原件,可以是CSV文件配置也可以是计数器等等,这里介绍以下两种配置原件及其用法:
CSV data set config:原件名就可以看出来这是一个基于csv文件的配置,我们创建一个csv文件:client.csv,格式如图:
Jmeter压测MQTT协议_第2张图片
最好将csv文件就放置到jmeter的bin目录下,线程组上右键点击添加-配置原件-CSV data set config,文件名可浏览选择刚才创建的csv,如果csv文件在bin目录下,建议直接填写文件名,他会从jmeter的bin目录下寻找,然后在连接取样器中就可以配置
计数器:由于我使用脚本创建的设备token是有一定规律的,全是user开头后面跟设备序号,所以我并没有采用CSV配置文件,而是使用的计数器,线程组上右键点击添加-配置原件-计数器,在计数器中设置最小值、最大值、递增步长以及引用名称,再回到连接控制器中,设置用户名为user${引用名称},每个线程即可动态从计数器中依次取得user1、user2、user3等,实现模拟的每个设备都有不同的username
5)添加监听器,监听器用于监听压测过程中的返回信息以及统计结果,这里我们添加以下两种监听器:
聚合报告:汇总压测过程中的各种指标,如:最小响应时间、最大响应时间、平均响应时间、吞吐量等等
查看结果树:依次显示压测过程中每个请求的响应情况
6)添加定时器(可选),定时器是为了控制压测线程执行每个取样器的时间间隔,可以实现每个线程发布一次遥测数据后休眠1秒再发送下一次,模拟实际情况,这里可以在发布发布取样器上点击右键添加-定时器-固定定时器,设置线程延迟单位毫秒,注意定时器的作用范围,如果在线程组下添加的定时器那么定时器会作用域所有的取样器,使执行连接断开时也延迟指定时间。这里可以不添加定时器压测,更能体现服务器的真实吞吐量。
最终我们就创建了一个如图的压测脚本:
Jmeter压测MQTT协议_第3张图片

我们可以直接线程组上右键启动,即可执行该压力测试脚本,测试是否可以正常执行,没有问题后保存为一个mqtt.jmx文件,该文件即为刚才使用图形化界面创建了测试脚本。
7)在服务器上执行测试,将创建的jmx文件以及csv文件上传至服务器,jmeter也可以上传至服务器,或者在服务器上从官网重新下载,同时mqtt插件也需要下载放入lib/ext文件夹下,在jmeter的bin目录下创建setenv.sh,写入export HEAP="-Xms4g -Xmx4g -XX:MaxMetaspaceSize=256m",则在运行jmeter时,会自动运行设置堆内存大小,运行./jmeter.sh -n -t /root/apache-jmeter-5.4/bin/mqtt.jmx -l /root/apache-jmeter-5.4/bin/test.jtl -e -o test命令执行压测
完成后,生成test.jtl结果文件,可以将文件下载知本地,在jmeter图形化界面的聚合报告中加载显示压测结果,以及在test文件夹中生成压测报告:
Jmeter压测MQTT协议_第4张图片

你可能感兴趣的:(java,github,jmeter,压力测试)