【原创】MQTT开发笔记(四)- 压力测试

一、前言

Jmeter 是 apache 公司基于 java 开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简 单。因为 jmeter 是 java 开发的,所以运行的时候必须先要安装 jdk 才可以。jmeter 是免安装的,拿到安装包之后直接解压就可以使用,同时它在 linux/windows/macos 上都可以使用。

jmeter 可以做接口测试和压力测试。其中接口测试的简单操作包括做 http 脚本(发 get/post 请求、加 cookie、加 header、加权 限认证、上传文件)、做 webservice 脚本、参数化、断言、关联(正则表达式提取器和处理 json-json path extractor)和 jmeter 操作数据库等等。

二、安装

1、下载 Jmeter & 解压

官网地址:Apache JMeter - Download Apache JMeter

Jmeter压测工具使用手册(完整版)

2、配置 Jmeter 环境变量

注意是系统变量表里直接添加,而不是用户环境变量,也不是在Path中。

按下面变量名和变量值配置 Jmeter 系统环境变量:

变量名1 :JMETER_HOME
变量名1值 :D:\Program Files\jmeter\apache-jmeter-4.0(jmeter 解压路径)
变量名2 :CLASSPATH
变量名2值:% JMETER_HOME\lib\ext\ApacheJMeter_core.jar;% JMETER_HOME%\lib\jorphan.jar;% JMETER_HOME%\lib\logkit-2.0.jar;

3、安装MQTT插件

Jmeter中不包含Mqtt的测试,要单独安装一个Mqtt插件。

3.1、从 GitHub 上下载最新版本插件 mqtt-xmeter-2.0.2-jar-with-dependencies.jar,该插件支持 JMeter 3.2 及以上版本。

地址:https://github.com/emqx/mqtt-jmeter/releases

3.2、将插件 jar 包拷贝到 JMeter 的插件目录:/lib/ext

4. 启动

Jmeter 解压路径下bin中的 jmeter.bat

三、使用

关于使用,网上有很多链接,讲的很全面,这里就不赘述了,主要参考:

Jmeter 压测工具使用手册(完整版) | Server 运维论坛

JMeter之MQTT请求_jmeter mqtt-CSDN博客

四、测试思路和解决方法

1. 控制器和配置

在负载压力测试中,尽量连接和断开一次,使用"仅一次控制器",把线程数和负载长度作为主要参数进行考核。

2. Java堆栈空间不够用

复制代码
java: java.lang.OutOfMemoryError: Java heap space

是由于线程过多或者Payload负载过大导致JVM虚拟机内存不够用,解决办法就是增加虚拟机内存。右键用记事本打开 jmeter.bat,修改-Xms1g -Xmx4g中的数字值,他们分别代表最小和最大值为1GB~4GB,当然你也可以改小为m(兆)的单位,这要根据你的需求来。以下是我的设置:

set HEAP=-Xms1g -Xmx4g -XX:MaxMetaspaceSize=256m

3. 执行效率

GUI界面是用来配置工程和Debug用的,他很耗资源,因此一旦配置好后,还是采用控制台执行测试比较贴合实际,通过以下命令就可以简单启动测试:

复制代码
jmeter -n -t xxxxx.jmx

4. 状态异常

java.lang.IllegalStateException: Current state = RESET, new state = FLUSHED

测试中控制台的上述异常是mqtt-xmeter插件的线程池异常,不代表测试失败,不用管它,他会重新启动。我们只需要在控制台注意查看测试信息中的Err:是否为0%就好了。再用一个客户端去订阅测试中的Topic,看看是否能够接到数据,能接到说明测试没有中止。

贴个Mqtt客户端的python代码给你:

复制代码
pip install paho-mqtt
python 复制代码
import paho.mqtt.client as mqtt

def on_connect(client, userdata, flags, rc):
    print("Connected with result code " + str(rc))
    client.subscribe("test_topic", qos=1)

def on_message(client, userdata, msg):
    print(msg.topic + " " + str(msg.payload))

client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message

client.connect("xx.xx.xx.xx", 1883, 60)

client.loop_forever()
相关推荐
2501_926978332 小时前
给自指系统接一个外部锚 —— 一个关于「用 AI 观察自己」的方法
人工智能·经验分享·笔记·机器学习·ai写作
AOI小白新手上路6 小时前
anomalib 缺陷检测复现笔记:从跑通库到 EfficientAD 落地
人工智能·笔记·机器学习
xxwl5857 小时前
RabbitMQ 学习笔记
笔记·学习·rabbitmq
加油努力有饭吃8 小时前
DLMS/COSEM 蓝皮书解读(二十六):Auto connect(class_id = 29)—— 自动拨号与主动连接(出站管理)
笔记
CarIise8 小时前
Java实训阶段查漏补缺复习笔记1
java·开发语言·笔记
陈卫军老师8 小时前
陈卫军谈商业底线:营销是术,产品是道
经验分享·笔记·流量运营
智者知已应修善业8 小时前
【51单片机只有一个8*8点阵数据如何滚动起来一片595+一组IO+花样】2022-1-15
c++·经验分享·笔记·单片机·蓝桥杯·硬件架构
Space6553610 小时前
常见组学技术笔记:从 DNA 基因组学到 Multi-omics
笔记
lcj251111 小时前
【Linux】 Makefile 详解
linux·笔记·面试
常州晟凯电子科技12 小时前
sigmaStar SSC305DE/SSC308开发笔记之开发环境搭建和SDK编译
人工智能·笔记·嵌入式硬件·物联网·性能优化·视频编解码