# 基于Jmeter工具进行MQTT性能测试
#### 场景说明
随着物联网技术的发展，全球物联网设备连接规模与日俱增。大量设备接入和设备管理对网络带宽、通信协议以及平台服务架构都带来了很大挑战。IoT架构选型时，对平台进行性能测试显得尤为重要。本文介绍如何使用JMeter工具对平台的MQTT协议接入能力进行性能压测。
本文描述的测试方案如下：
测试场景：
- 模拟1万个设备同时在线，验证平台长连接的稳定性。
- 模拟设备每秒发起100次消息上报，验证平台消息处理能力。
测试环境：
- 压测目标平台：华为云设备接入服务低频单元S1（1万设备在线、200TPS消息上下行）。
- 压测执行机：Jmeter执行机1台，规格如下：
表1压测执行机 
| 实例类型   | 规格名称        | vCPUs | 内存   |
|:---|:---|:---|:---|
| 通用计算型s6 | s6.xlarge.2 | 4vCPUs  | 8GiB |
   
![](https://support.huaweicloud.com/bestpractice-iothub/public_sys-resources/note_3.0-zh-cn.png)
单台Jmeter执行机最多能模拟5万设备在线，如果需要模拟更高规格的在线设备数可以使用[华为云的CPTS服务](https://support.huaweicloud.com/productdesc-cpts/cpts_productdesc_0001.html)，部署多台Jmeter执行机，以满足规格测试的要求。
#### 前提条件
- 已注册华为账号并开通华为云。未注册可单击[注册页面](https://reg.huaweicloud.com/registerui/public/custom/register.html#/register)完成注册。
- 已完成实名制认证。未完成可在华为云上单击[实名认证](https://account.huaweicloud.com/usercenter/#/accountindex/realNameAuth)完成认证，否则无法使用设备接入功能。
- 已开通设备接入服务。未开通则访问[设备接入服务](https://www.huaweicloud.com/product/iothub.html)，选择"购买实例"，购买"低频单元S1（1万设备在线、200TPS消息上下行）"。
 
#### 前期准备
- Jmeter执行机安装Java运行环境。访问[Java官网](https://www.oracle.com/java/technologies/javase-downloads.html)，下载并参照说明安装Java运行环境。
- [下载](https://jmeter.apache.org/)并安装JMeter (JMeter 应使用5.1.1及以上版本)。
- [下载](https://github.com/emqx/mqtt-jmeter/releases)mqtt-jmeter 插件包，并将插件放置于JMeter安装目录的"lib/ext"目录下。
 
#### 业务流程
使用Jmeter工具对平台进行MQTT协议进行性能压测的具体流程如下：
1. [创建产品]。创建一个MQTT协议的产品。
2. [批量注册设备]。采用批量导入的方式注册1万个用于性能测试的设备。
3. [导入测试计划]。导入已经创建的用于IoT性能测试的测试计划。
4. [发起压测]。根据业务规格发起对平台的性能压测。
5. [查看压测结果]。在IoT平台上根据监控指标检查压测结果是否符合预期。
 #### 创建产品
1. 登录[管理控制台](https://console.huaweicloud.com/iotdm/#/dm-portal/home)，单击左侧导航栏"产品"，单击页面左侧的"创建产品"。
2. 根据页面提示填写参数，然后单击"确定"。 
   表2参数说明 
   |                                                                                                       **基本信息**                                                                                                        ||
   |---|---|
   | 所属资源空间 | 平台自动将新创建的产品归属在默认资源空间下。如需归属在其他资源空间下，下拉选择所属的资源空间。如无对应的资源空间，请先创建[资源空间](https://support.huaweicloud.com/usermanual-iothub/iot_01_0006.html)。 |
   | 产品名称   | 自定义。支持字母、数字、下划线（_）、连字符（-）的字符组合。                                                                                                          |
   | 协议类型   | 选择MQTT。                                                                                                                                   |
   | 数据格式   | 选择JSON。                                                                                                                                  |
   | 所属行业     | 请根据实际情况选择。                                                                                                                                |
   | 设备类型    | 请根据实际情况选择。                                                                                                                              |
   | **高级配置**                                                                                                                                                                                                                                      ||
   | 产品ID                            | 定制ProductID，用于唯一标识一个产品。如果携带此参数，平台将产品ID设置为该参数值；如果不携带此参数，产品ID在物联网平台创建产品后由平台分配获得。                                                                                 |
      
   
   
 
 #### 批量注册设备
1. 访问[设备接入服务](https://www.huaweicloud.com/product/iothub.html)，单击"管理控制台"进入设备接入控制台。
2. 在左侧导航栏选择"设备 \> 所有设备"，进入"批量注册"页签，单击"批量注册"。
3. 下载并填写"批量注册设备文件模板"，可以参照如下表进行参数填写。[样例参考](https://obs-pipeline.obs.myhuaweicloud.com/jmeter/BatchCreateDevices_Template.xlsx)。
   
   表3参数说明 
   | 参数名         | 参数说明                                                                                     |
   |:---|:---|
   | node_id    | 设备标识，性能测试时可以按递增的方式进行填写，如10001，10002，10003                                              |
   | product_id | 产品ID，[创建产品]时生成的产品ID。              |
   | app_id      | 资源空间，获取方式参考获取[资源空间](https://support.huaweicloud.com/usermanual-iothub/iot_01_0006.html) |
   | device_name   | 设备名称，可以同node_id一致。                                                                       |
   | secret       | 设备密钥，性能测试时可以固定填写一个密钥。                                                                    |
      
   
   
4. 在"批量注册设备窗口"单击"添加文件"上传写好的批量注册文件模板，单击"确定"创建任务。 
   图1设备-批量注册设备   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001981497777.png "点击放大")
   
   
5. 批量注册执行成功后，保存好设备ID和密钥。
 
 #### 导入测试计划
1. [下载](https://obs-pipeline.obs.myhuaweicloud.com/jmeter/MQTT_Jmeter.jmx)用于JMeter测试的测试计划。
2. 打开JMeter，选择"Open"导入下载的测试计划。
3. 在 JMeter左侧文件目录中单击 "User Defined Variables"，在"User Defined Variables"对话框中配置以下信息。 
   表4参数说明 
   | 参数名     | 参数说明                                                                                                                                                                                                    |
   |:---|:---|
   | server | MQTT协议服务端地址。获取方式参考[获取接入地址](https://support.huaweicloud.com/devg-iothub/iot_02_1004.html#section0)。                                                                                                       |
   | port       | MQTT协议端口，填写为8883。                                                                                                                                                                                        |
   | productId  | 产品ID，[创建产品]时生成的产品ID。                                                                                                                                 |
   | password | MQTT连接密码。为使用"HMACSHA256"算法以时间戳为密钥对secret进行加密后的值。secret为[批量注册设备]时填写的密钥。可以通过[工具](https://iot-tool.obs-website.cn-north-4.myhuaweicloud.com/)获取加密后的值。 |
   | timeStamp | 为对password进行加密的时间戳。时间格式为YYYYMMDDHH。                                                                                                                                                                         |
      
   图2参考样例   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001956209166.png "点击放大")
   
   
 
 #### 发起压测
1. 在 JMeter 左侧文件目录中单击 "Thread Group"，配置"Number of Threads"为10000（一个线程对应一个设备在线，配置为10000表示设备与平台间保持1万个设备在线）。 
   图3配置设备   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001510584842.png "点击放大")
   
   
2. 在 JMeter 左侧文件目录"Thread Group"目录下单击"Delay between sampler" ，配置"Thread Delay(in milliseconds)"为100000（每设备每100秒发布一次消息）。 
   图4配置设备   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001560696169.png "点击放大")
   
   
3. 在Jmeter工具栏图表中单击![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001997055593.png "点击放大")（开始）按钮，启动性能测试。
   
   图5性能测试   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001548697369.png "点击放大")
   
   
4. 在 JMeter 左侧文件目录中单击 "Summary Report"，可以看到"Connect"、"Publish Message"的吞吐量。可以通过调整"Number of Threads"和"Thread Delay(in milliseconds) " 来调整Jmeter发起的吞吐量。 
   图6性能测试   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001548372257.png "点击放大")
   
   
5. JMeter测试计划调试正常后，可以将测试计划导入到[华为云的CodeArts PerfTest服务](https://support.huaweicloud.com/productdesc-cpts/cpts_productdesc_0001.html)，进行分布式部署以满足更高规格的性能测试 。
 
 #### 查看压测结果
1. 登录[管理控制台](https://console.huaweicloud.com/iotdm/#/dm-portal/home)，在左侧导航栏"监控运维"-\>"统计报表"，查看平台的统计指标。
   图7统计报表-查看统计报表   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000002140383592.png "点击放大") 
2. 更多报表，可登录[应用运维管理](https://console.huaweicloud.com/aom/#/aom/ams/cloudMonitoring)控制台，选择监控 \>云服务监控 \>物联网\>IoTDA 查看。
   图8查看指标   
   ![](https://support.huaweicloud.com/bestpractice-iothub/figure/zh-cn_image_0000001993224005.png "点击放大") 
 
