现在做物联网,MQTT协议被广泛应用。因此如何对MQTT Broker服务器进行压力测试也是测试人员、开发人员面临的问题。笔者经过多方选择,选择了Tsung这款工具。
简介
Tsung 是一个压力测试工具,可以测试包括HTTP, WebDAV, PostgreSQL, MySQL, LDAP, and XMPP/Jabber等服务器。针对 HTTP 测试,Tsung 支持
HTTP 1.0/1.1 ,包含一个代理模式的会话记录、支持 GET、POST 和 PUT 以及 DELETE 方法,支持 Cookie 和基本的WWW 认证,同时还支持 SSL。
tsung的工作原理
(1) Tsung的每一个虚拟用户就是一个erlang的轻量进程。这点和loadrunner有很大的区别。
(2) 虚拟用户完成session后就消失。
(3) 大量的虚拟用户(erlang轻量进程)建立在erlangVM上。
(4) 一台测试机可以启多个erlangVM,目前按照1个cpu启动1个erlangVM。
网上已经有很多怎么安装Tsung的文章了,这里我就不过多去赘述了,可以参考文:http://www.cnblogs.com/yangxia-test/p/4330571.html,目前Tsung工具的最新版本为1.6.0,需要注意的是Tsung1.5.1版本及以上才支持MQTT,并且只有Tsung1.6.0开始,才支持MQTT的username和password的认证。下面我主要讲利用它对MQTT做压力测试工具。
Tsung测试工具的基本测试命令为 Tsung -f ~/.tsung/mqtt.xml -l <日志保存路径> start
mqtt.xml具体如下(在/usr/share/doc/tsung/examples路径下可查找到):
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd">
<tsung loglevel="debug" version="1.0">
<!--下面为客户端配置,可以有配有多个客户端,其中ubuntu要保证通过ssh ubuntu能远程登陆上ubuntu这台机器,这里建议通过密钥对来进行远程客户端的登陆。下面类似于loadrunner的load generator,用以模拟用户。具体的详细配置请参见官网文档http://tsung.erlang-projects.org/user_manual/conf-client-server.html-->
<clients>
<client host="ubuntu" maxusers="50"></client>
</clients>
<!--这里为配置MQTT broker的IP地址,端口,协议默认为tcp>
<servers>
<server host="127.0.0.1" port="5672" type="tcp" />
</servers>
<!--下面为加载用户信息-->
<load>
<!--session为mqtt_sbuscriber的用户,10秒后启动-->
<user session="mqtt_subscriber" start_time="10" unit="second"></user>
<!--用户组1,下面表示在前3秒内,每隔1秒新增一个用户,用户数最大为5-- >
<arrivalphase phase="1" duration="3" unit="second">
<users maxnumber="5" arrivalrate="1" unit="second"/>
</arrivalphase>
<!--用户组1,下面表示在前2分钟内,每隔10秒新增一个用户,用户数最大为10-- >
<arrivalphase phase="2" duration="2" unit="minute">
<users maxnumber="10" arrivalrate="10" unit="second"/>
</arrivalphase>
</load>
<sessions>
<!--probability为100,上面非指定session所新增的用户,都用于该session-->
<session name="mqtt_publisher" probability="100" type="ts_mqtt">
<request>
<!--重点来了,这个通常我们的MQTT都会加入密码认证,否则不能建立连接通信。这里需要仔细查看官方文档,发现1.6.0已经开始支持MQTT的user和password。所以我们只需要在下面加入MQTT认证的username和password就可以与MQTT服务器器连接,并推送和订阅消息了-->
<mqtt type="connect" clean_start="true" keepalive="10" will_topic="will_topic" will_qos="0" will_msg="will_msg" will_retain="false" username="user" password="yourpassword"></mqtt>
</request>
<!--下面外面为一层for循环,执行10次,下面为一个消息推送,主题为test_topic,qos为1(至少保证收到一次),中间为具体的消息 -->
<for from="1" to="10" incr="1" var="loops">
<request subst="true">
<mqtt type="publish" topic="test_topic" qos="1" retained="true">test_message</mqtt>
</request>
</for>
<!--断开MQTT消息-->
<request>
<mqtt type="disconnect"></mqtt>
</request>
</session>
<!--下面为MQTT消息的订阅-->
<session name="mqtt_subscriber" probability="0" type="ts_mqtt">
<request>
<mqtt type="connect" clean_start="true" keepalive="10" username="user" password="yourpassword"></mqtt>
</request>
<!--订阅topic为test_topic的MQTT消息-->
<request subst="true">
<mqtt type="subscribe" topic="test_topic" qos="1"></mqtt>
</request>
<!--等待订阅消息多少时间,这里为60秒-->
<request>
<!-- wait for 60s -->
<mqtt type="waitForMessages" timeout="60"></mqtt>
</request>
<!--取消订阅消息test_topic-->
<request subst="true">
<mqtt type="unsubscribe" topic="test_topic"></mqtt>
</request>
<!--断开连接-->
<request>
<mqtt type="disconnect"></mqtt>
</request>
</session>
</sessions>
</tsung>
根据上面的mqtt.xml配置说明配置好后,就可以对MQTT Broker服务器施加压力了。
最后找到日志存放路径,然后利用~/tsung/bin/tsung_stats.pl 就可以生成测试报表了。后面分析数据我就不讲了,如果要了解这方面的知识,请关注我站内的其它文章。