更新:2017年5月27日,MQTT JMeter版本升级到了0.93,详细可以参见该文档。
写在前面
本文介绍的Java Sampler的实现方式不再维护,请读者参考我们最新的插件版本 。
原文请参见这里。
XMeter提供了测试MQTT的JMeter插件,包括下面的几个功能,
测试MQTT连接 - 该插件用于建立与服务器端的连接,但是不发送任何数据。这个主要用于模拟系统有大量背景连接的情况,这些连接不用来发送、接受数据。
MQTT Pub - 该插件用于往服务器端发送payload,模拟发送数据。
MQTT Sub - 该插件用于从服务器端接收payload,模拟接收数据。
插件下载地址, 解开的jar文件放到JMeter的lib/ext目录即可。
使用文档
MQTT连接插件
新建一个JMeter测试计划和Thread Group,选上Thread Group的“Delay Thread creation until needed”属性,该属性会在有需求的时候创建虚拟用户,这样能减少压力发起端的资源消耗;视测试需求更改线程数和“Ramp_up Period”的值,如下图所示。
然后右击Thread Group节点》添加》Sampler》Java请求
在名称输入框中输入名称,如下图所示是“MQTT_CONN”,类名称中选择“....ConnectionSampler”。
在下面出现的输入框中可以输入连接的一些设置(注意:现在未对用户输入的字符进行验证,请确保输入的内容不包含错误的内容,比如没有额外的空格等)
SERVER:服务器所在地址
如果是普通的tcp连接,则输入tcp://$target_server,比如MQTT部署在本地,则输入tcp://localhost;
SSL单向认证,则输入ssl://$target_server
SSL双向认证,现在暂时不支持自定义证书,将来会将此功能开放
PORT:端口,一般为1883,如果是别的请在此指定别的端口号
KEEP _ALIVE:客户端往MQTT服务器发送ping包的频率,单位是秒,该值视被测场景而定
CLIENT_ID_PREFIX:标识客户端ID的前缀,通过这个可以区分不同的连接
CONN_TIMEOUT:连接超时控制,单位是秒,缺省为10秒,意味着10秒钟如果连不上服务器端,就认为连接失败
CONN_ELAPSED_TIME:连接持续时间,单位是秒,缺省为60秒,意味着该连接一直会保持60秒。如果想把连接持续更长时间,只需增加该值就可以了
CONN_CLIENT_AUTH:双向认证的时候需要把此改成true,现在暂不支持自定义证书
如何在XMeter上运行
将脚本上传至xmeter之后,直接可以开启测试,需要注意的是去掉“设置测试为持续循环模式”的选择,否则如果某次连接在指定的CONN_ELAPSED_TIME到达之后,又会开启一次新的连接,不能实现精确的连接个数的控制。
另外,在“Ramp Up时间:”里酌情填入合适的值,该值的意思是在多少秒内把用户数压到指定的数目。比如用户在“虚拟用户数”框中输入100000,然后在“Ramp Up时间:”中输入100,则表示100秒内将连接数增加至100000,用户新增的频率为:100000/100=1000用户/秒。建议用户一定要控制一下用户压力增长的方式,如果短时间压入极大量的连接不符合实际的使用场景,做的测试也就没有了意义。
MQTT PUB插件
MQTT PUB插件的使用与MQTT连接插件非常类似,也是加入一个Java Sampler,在下拉列表框中选择“....PublishSampler”,与连接插件相同的地方这里不再赘述,
QOS_LEVEL: 消息的QoS,只能为0,1,2(注:现在未对输入值做验证,确保输入的值为上述0,1,2中之一)
TOPIC_NAME: topic名字
PAYLOAD_SIZE: 往服务器端发送数据的大小,现在插件的实现方式是从[0,9]和[a,z]中随机生成指定大小的字符串,往服务器端发送。如果输入为256,则表示发送长度为256字节的字符串。
另外,跟连接测试一样,需要把Thread Group的“Delay Thread creation until needed”属性选上。在XMeter中运行的时候,视测试需求将“设置测试为持续循环模式”选上或者不选上(不选的话会根据实际上传的JMeter脚本中的运行次数来运行测试脚本)。
MQTT SUB插件
MQTT SUB插件的使用与MQTT PUB插件非常类似,也是加入一个Java Sampler,在下拉列表框中选择“....SubSampler”,与连接插件相同的地方这里不再赘述,
DEBUG_RESPONSE:设置成true后,会将从服务器端收到的消息打印出来。用户可以通过添加一个“查看结果树”来查看从服务器端得到的数据(请参见下下图)。
跟连接测试一样,需要把Thread Group的“Delay Thread creation until needed”属性选上。在XMeter中运行的时候,视测试需求将“设置测试为持续循环模式”选上或者不选上(不选的话会根据实际上传的JMeter脚本中的运行次数来运行测试脚本)。
组合测试
在实际的业务场景中,可能会有这样的场景:
有大量的背景连接,这些背景连接只是会定时发送一些ping包,大部分时间并不会传数据
有部分连接会进行pub/sub消息的发送/接收
现在有实际案例如下:
- 10万背景连接
- 3个pub,QOS为1,该sub每秒发送1条消息
-10000个sub,QOS为1
该测试场景总计有11003个连接,测试的时候需要设计三个JMeter的场景。
-按照本文介绍的“MQTT连接插件”,创建一个MQTT连接JMeter脚本
-按照本文介绍的“MQTT PUB插件”,创建一个MQTT PUB JMeter脚本
-按照本文介绍的“MQTT SUB插件”,创建一个MQTT PUB JMeter脚本
-分别把前三步创建出来的脚本上传至xmeter.net。
- 在xmeter中运行MQTT连接JMeter脚本,后台将自动创建相关的资源(机器和网络等),并与MQTT服务器建立连接。这里需要注意两点:1)需要将此测试的运行时间稍微长一点,保证后续的测试在运行的时候背景连接都处于活跃状态;2)最好等所有连接都准备好之后才开始运行下面的pub和sub脚本
-在xmeter中运行Sub脚本,订阅端处于就绪状态
-在xmeter中运行Pub脚本,等pub开始运行之后就开始有消息发送的数据
如下图所示,在xmeter提供的MQTT测试服务器端的报告中,从大约16:18分开始准备背景连接,持续了约100秒钟;从将近16:21开始运行Sub测试,建立了10000连接;由于pub数目太小,无法在图中显示出来。
如下图所示,大约在4:22开始pub往外发送数据,平均每秒发送数据约2条,与实际期望发送的每秒3条有点差距。
如下图所示,大约在4:22开始MQTT服务器往外转发数据,平均每秒约15000条数据。
如下面两个图所示,xmeter也提供了对被测机器CPU的使用,内存,以及网络等方面的监控,使用户轻松掌控测试过程中被测系统的情况。
xmeter还提供了另外一些监控图表,限于篇幅不一一展示,赶紧登录xmeter.net,开始MQTT的测试之旅吧。如果有任何问题,请联系我们。
关于XMeter提供的MQTT插件
现在XMeter提供的MQTT插件已经可以使用,但是还在完善中,将来会将此插件开源,有任何使用问题欢迎垂询。