在智能家居、物联网领域,对MQTT broker的性能进行摸底时,需要压测MQTT服务器,这时候就可以选择使用Jmeter+MQTT插件的组合进行操作。
这里使用的Jmeter版本为【5.6.2】,使用的Jmeter MQTT插件为EMQX开源的emqx/mqtt-jmeter,版本号为【2.0.2】。
安装
在EMQX的【mqtt-jmeter插件release下载页面】下载最新版本的插件

然后将下载好的jar文件拷贝到 Jmeter 目录的 lib/ext 下。

重新启动Jmeter GUI客户端,在【取样器】下看到有【MQTT Connect】等四个取样器就是安装好了。

📝 基本使用
MQTT Connect 取样器

MQTT connection 设置项
- 服务器名称或IP地址:这是需要测试的 MQTT 目标,可以是 IP 地址或域名。默认值是
127.0.0.1。但是,不要在服务器名称或 IP 地址前添加协议前缀(如tcp://或ssl://)。
- 端口号:MQTT 服务器打开的端口。通常情况下,TCP 协议使用
1883端口,SSL 协议使用8883端口。
- MQTT 版本:MQTT 的版本,支持
3.1和3.1.1。
- 超时时间(秒):连接 MQTT 服务器时的连接超时时间。默认值是
10秒。
MQTT Protocol 设置项
支持四种协议:TCP、SSL、WS、WSS。对于 SSL 和 WSS 协议,它包括普通 SSL 和双向 SSL 认证。
如果勾选了双向认证,需要正确配置证书

User authentication 设置项
用户可以配置 MQTT 服务器以使用用户名和密码进行认证。
Connection options 设置项
- ClientId:客户端标识,即虚拟用户或 JMeter 线程。默认值为 'conn_'。如果勾选了“添加随机客户端 ID 后缀”,JMeter 插件会在 'ClientId' 后追加生成的 uuid 以表示客户端,否则,'ClientId' 的文本将作为当前连接的 'clientId' 传递。
- 保持连接时间(秒):以秒为单位的 Ping 包发送间隔。默认值为 300,意味着每个连接每 5 分钟向 MQTT 服务器发送一次 Ping 包。
- 连接尝试次数上限:客户端首次尝试连接服务器之前,重新连接尝试的最大次数。设置为 -1 表示使用无限次尝试。默认值为 0。
- 重新连接尝试次数上限:在之前已建立过服务器连接后,重新连接尝试的最大次数。设置为 -1 表示使用无限次尝试。默认值也为 0。
- 清理会话:如果你想在会话之间保持状态信息,请设置为 false;否则,请设置为 true。
默认设置连接到MQTT broker后如图

在【查看结果树】里查看可以查看到正确连接的结果

MQTT Pub Sampler

发布(Pub)采样器重用之前由连接(Connect)采样器建立的连接来发布消息。如果此时连接未准备好,发布采样器将立即失败。
Pub options 设置项
- 服务质量(QoS)等级:可用的 QoS 值,0 表示最多一次(AT_MOST_ONCE),1 表示至少一次(AT_LEAST_ONCE),2 表示恰好一次(EXACTLY_ONCE)。
- 保留消息:如果发布采样器希望代理保留给定主题上的最后一条消息,以便订阅该主题的客户端在订阅后立即收到保留消息,则将其设置为 true。
- 主题名称:消息将被发送到的主题的名称。
- 在有效载荷中添加时间戳:是否在有效载荷中添加时间戳。如果启用了此复选框,则将在实际有效载荷之前添加运行发布采样器的时间戳。它通常与订阅(Sub)采样器一起使用,以计算消息延迟时间。发送的消息如图

Payloads 设置
- 消息类型:可以使用三种类型的消息。
- 字符串:发送到 MQTT 服务器的普通字符串。它也可以是一个 JMeter 变量。
- 十六进制字符串:发送到 MQTT 服务器的十六进制字符串。输入的字符必须是 [0-9]、[A-F] 或 [a-f]。十六进制字符串将被转换为二进制并发送到服务器。它也可以是一个 JMeter 变量。
- 固定长度的随机字符串:如下屏幕截图所示。如果选择了此选项,则要求用户输入“长度”。长度意味着自动生成的字符串长度。默认值为 1024,表示生成 1kb 大小的随机字符串。

MQTT Sub Sampler

订阅(Sub)采样器重用之前由连接(Connect)采样器建立的连接来订阅消息。如果此时连接未准备好,订阅采样器将立即失败。
Sub options 设置项
- 服务质量(QoS)等级:可用的 QoS 值,0 表示最多一次(AT_MOST_ONCE),1 表示至少一次(AT_LEAST_ONCE),2 表示恰好一次(EXACTLY_ONCE)。
- 主题名称:将订阅的主题名称列表(以逗号分隔),可以订阅多个主题。
- 有效载荷包括时间戳:如果启用了此复选框,表示有效载荷包括时间戳。可用于计算消息延迟时间。
消息延迟时间计算公式:接收消息时订阅端的时间戳 - 发送消息时发布端的有效载荷内的时间戳请注意,如果发布消息的机器与订阅者不是同一台,则计算出的消息延迟时间可能不准确。因为不同机器中的时间几乎不可能完全一致。因此,订阅采样器计算的延迟时间只能作为参考。
- 采样方式:控制如何采样。默认值为 '按指定时间(毫秒)计时',意味着每经过指定的毫秒数(默认为1000ms)会发生一次订阅采样。在这1000毫秒内,可能会接收到多条消息,报告中的结果是这1000毫秒内的汇总数据。如果值设置为2000,表示2000毫秒内的汇总报告。另一个选项是 '接收到指定数量的消息',意味着在接收到指定数量的消息后将进行一次订阅采样(默认为1)。
- 调试响应:如果勾选,接收到的消息将打印在响应中。在调试脚本时建议启用此选项。如图,如果不勾选,则不会显示红框中的数据。

MQTT DisConnect 取样器
清除之前创建的连接。

🤗 实用示例
在官方的【示例脚本】和官方博客介绍上,有介绍几个实用的示例。
- background_connection.jmx:模拟与服务器的大量后台 MQTT 连接。 连接时您可以选择订阅主题。


- pubsub_unidirection.jmx:演示子采样器如何从相应的 pub 采样器获取消息,具有两个 JMeter 用户组和操作之间的延迟。


- pubsub_bidirection.jmx:演示一组设备和移动设备如何双向交换消息。


- MQTT_Pub_Sub.jmx:【JMeter MQTT 在订阅与发布测试场景中的使用】文章中的示例,测试吞吐量。

- MQTT_Connect.jmx:【JMeter MQTT 在连接测试场景中的使用】文章中的示例,测试连接数量。

📎 参考链接
- 作者:Yibin
- 链接:https://yibin.dev/article/33b749ea-567d-4b06-80d7-7f53a2397529
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章







