当前位置: 移动技术网 > IT编程>网页制作>HTML > mqtt

mqtt

2020年08月01日  | 移动技术网IT编程  | 我要评论
Tsung MQTT压力测试参考资料:http://tsung.erlang-projects.org/user_manual/https://www.cnblogs.com/lingyejun/p/7941271.htmlhttps://www.cnblogs.com/saryli/p/9807220.htmlhttp://www.51ste.com/share/det-222.htmlTsung安装安装环境Linux版本:Ubuntu 16.04 LTSTsung版本:1.7.0

Tsung MQTT压力测试

参考资料:

http://tsung.erlang-projects.org/user_manual/

https://www.cnblogs.com/lingyejun/p/7941271.html

https://www.cnblogs.com/saryli/p/9807220.html

http://www.51ste.com/share/det-222.html

Tsung安装

  1. 安装环境

Linux版本:Ubuntu 16.04 LTS

Tsung版本:1.7.0

  1. 安装前准备

sudo apt-get install gcc -y
sudo apt-get install perl -y #报表会使用到
sudo apt-get install gnuplot -y #图形时用

  1. 安装步骤

(1)下载并安装erlang

apt-get install erlang  #这步安装需要花费一段时间
或者
tar zxf otp_src_20.0.tar.gz
cd otp_src_20.0
./configure --prefix=/usr/local/erlang --without-javac
make -j 2
make install

(2)下载安装tsung

wget http://tsung.erlang-projects.org/dist/tsung-1.7.0.tar.gz
cd /usr/local
mkdir tsung
tar -zxvf tsung-1.6.0.tar.gz
cd tsung-1.6.0
./configure --prefix=/usr/local/tsung --with-erlang=/usr/lib/erlang   
#指定tsung的安装路径,erlang的安装路径(该路径可以通过“find / -name erlang”查找)
make
make install

(3)下载并安装perl Template,用于生成报告模板

cd /usr/local
wget http://www.cpan.org/modules/by-module/Template/Template-Toolkit-2.26.tar.gz
tar -zxvf Template-Toolkit-2.26.tar.gz  
cd Template-Toolkit-2.26  
perl Makefile.PL  
make  
make test  
make install  

Tsung使用

  1. 在tsung安装目录下新建conf目录,存放log和conf,修改/bin/tsung文件

修改MAIN_DIR

在这里插入图片描述

修改OPT_FILE

把tsung提供的模板配置文件复制到./conf下

cp /usr/local/tsung/share/doc/tsung/examples/mqtt.xml ./conf
  1. 运行tsung,默认执行脚本tsung.xml
tsung start

在这里插入图片描述

  1. 运行mqtt.xml

把mqtt.xml放在bin目录下

mqtt设置

在这里插入图片描述

运行tsung

在这里插入图片描述

在相对应的logs文件夹下运行

/usr/local/tsung/lib/tsung/bin/tsung_stats.pl

在这里插入图片描述

运行完成之后

在这里插入图片描述

打开report.html即可看到报告

在这里插入图片描述

mqtt.xml配置文件

<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/local/tsung/share/tsung/tsung-1.0.dtd">
<tsung loglevel="debug" version="1.0">
    <clients>
        <client host="localhost" maxusers="5" use_controller_vm="true"></client>
    </clients>
	<servers>
        <server host="127.0.0.1" port="1883" type="tcp" />
	</servers>

    <load>
        <user session="mqtt_subscriber" start_time="10" unit="second"></user>
        <arrivalphase phase="1" duration="3" unit="second">
            <users maxnumber="1" arrivalrate="1" unit="second"/>
        </arrivalphase>
    </load>

    <sessions>
        <session name="mqtt_publisher" probability="100" type="ts_mqtt">
            <request>
                <mqtt type="connect" clean_start="true" keepalive="10" will_topic="will_topic" will_qos="0" will_msg="will_msg" will_retain="false"></mqtt>
            </request>

            <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>

            <request>
                <mqtt type="disconnect"></mqtt>
            </request>
        </session>
        <session name="mqtt_subscriber" probability="0" type="ts_mqtt">
            <request>
                <mqtt type="connect" clean_start="true" keepalive="10"></mqtt>
            </request>

            <request subst="true">
                <mqtt type="subscribe" topic="test_topic" qos="1"></mqtt>
            </request>

            <request>
                <!-- wait for 60s -->
                <mqtt type="waitForMessages" timeout="60"></mqtt>
            </request>

            <request subst="true">
                <mqtt type="unsubscribe" topic="test_topic"></mqtt>
            </request>

            <request>
                <mqtt type="disconnect"></mqtt>
            </request>
        </session>
    </sessions>
</tsung>

文件结构

默认的编码方式为utf-8,可以手动设置其他编码方式,例如

<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/local/tsung/share/tsung/tsung-1.0.dtd">
<tsung loglevel="debug" version="1.0">
...
</tsung>

可以通过添加dumptraffic=”true”,将triffic记录到文件里。设置值为dumptraffic=”light” ,只会输出44bytes。

Clients和Server

基础配置

对于非分布式负载,可以使用基本设置

<clients>
  <client host="localhost" use_controller_vm="true"/>
</clients>

<servers>
  <server host="192.168.1.1" port="80" type="tcp"></server>
</servers>

这将在与控制器相同的主机和同一Erlang虚拟机上开始加载。

server时集群的入口,我们可以添加多个server,默认每个server的权重(height)为1,每个session会根据权重随机选择一个server。权重可以手动设置。

<servers>
  <server host="server1" port="80" type="tcp" weight="4"></server>
  <server host="server2" port="80" type="tcp" weight="1"></server>
</servers>

type可以是tcp,ssl,udp和websocket,另外还有一个特殊类型BOSH

高级配置

<clients>
  <client host="louxor" weight="1" maxusers="800">
    <ip value="10.9.195.12"></ip>
    <ip value="10.9.195.13"></ip>
  </client>
  <client host="memphis" weight="3" maxusers="600" cpu="2"/>
</clients>

<servers>
  <server host="10.9.195.1" port="8080" type="tcp"></server>
</servers>

可以通过设置多个虚拟ip来模拟多个主机。这在负载均衡器使用客户端的ip在服务器集群之间分配流量时,非常有用。

在这里,有第一个2核cpu主机使用Tsung集群,会使用两个Erlang虚拟机。

直接IP

从1.7版本开始,客户端配置可以使用ip地址。使用hostname可能会遇到很多麻烦(比如修改/etc/host)

此时,运行Tsung时,需要加上参数-I。此时控制节点的名称为tsung_controller@10.10.10.10

tsung -I Your_Server_IP -f tsung.xml start
# 比如
tsung -I 10.10.10.10 -f tsung.xml start

Client配置如下:

<clients>
 <client host="10.10.10.11" maxusers="120000" cpu="7" weight="4"/>
 <client host="10.10.10.12" maxusers="120000" cpu="7" weight="4"/>
<clients>
IP范围

如果有很多IP,可以使用iprange来随机生成给定范围内的ip地址

<iprange version="v4" value="172.28.1-20.0-254"/>
maxusers

maxusers参数用于绕过单个进程打开的最大套接字数的限制(在许多操作系统上默认为1024)以及select系统调用缺乏可伸缩性。当users数量超过限制之后,会启动一个新的erlang虚拟机。默认的maxusers是800。现如今,应该选一个较大的maxuser,比如30000。

使用job scheduler来运行Tsung

Tsung可以通过batch/job scheduler获取客户节点列表。他可以处理PBS/torque,LSF,OAR。

<client type="batch" batch="torque" maxusers="30000">

如果需要扫描batch scheduler所提供的节点的ip别名,使用scan_init

<client type="batch" batch="torque" scan_intf='eth0' maxusers="30000">

监控

Tsung可以监控远程server和与远程客户机通信。配置在部分。

可监控的指标:CPU activity,load average,memory usage

可以从job scheduler中获取监控节点

<monitor batch="true" host="torque" type="erlang"></monitor>

定义load progression

随机生成用户

通过定义几个arrivalphase来定义load progression。

<load>
  <arrivalphase phase="1" duration="10" unit="minute">
    <users interarrival="2" unit="second"></users>
  </arrivalphase>

  <arrivalphase phase="2" duration="10" unit="minute">
    <users interarrival="1" unit="second"></users>
  </arrivalphase>

  <arrivalphase phase="3" duration="10" unit="minute">
    <users interarrival="0.1" unit="second"></users>
  </arrivalphase>
</load>

在第一个10分钟,每两秒会创建一个user,在第二个10分钟,每1秒会创建一个user,最后10分钟,每秒会创建10个用户。当所有用户结束之后,测试结束。

可以使用arrivalrate来代替interarrival。比如每秒生成10个用户

<arrivalphase phase="1" duration="10" unit="minute">
  <users arrivalrate="10" unit="second"></users>
</arrivalphase>

可以使用maxnumber来限制最大用户量

<arrivalphase phase="1" duration="10" unit="minute">
  <users maxnumber="100" arrivalrate="10" unit="second"></users>
</arrivalphase>
<arrivalphase phase="2" duration="10" unit="minute">
  <users maxnumber="200" arrivalrate="10" unit="second"></users>
</arrivalphase>

使用loop属性可以多次执行load

可以使用session_setup属性重写session配置

<arrivalphase phase="3" duration="1" unit="minute">
  <session_setup name="http_test_1" probability="80"/>
  <session_setup name="fake"        probability="20"/>
  <users  interarrival="1" unit="second"/>
</arrivalphase>

默认情况下,一个phase会在达到duration时间后结束,可以通过wait_all_sessions_end属性修改为所有user执行完session再结束。

<arrivalphase phase="1" duration="10" unit="minute" wait_all_sessions_end="true">
  <users  interarrival="1" unit="second"/>
</arrivalphase>
<arrivalphase phase="2" duration="10" unit="minute">
  <users  interarrival="5" unit="second"/>
</arrivalphase>

静态生成用户

在指定时间执行指定的session

<load>
  <arrivalphase phase="1" duration="10" unit="minute">
    <users interarrival="2" unit="second"></users>
  </arrivalphase>
  <user session="http-example" start_time="185" unit="second"></user>
  <user session="http-example" start_time="10" unit="minute"></user>
  <user session="foo" start_time="11" unit="minute"></user>
</load>
<sessions>
  <session name="http-example" probability="0" type="ts_http">
    <request> <http url="/" method="GET"></http> </request>
  </session>
  <session name="foobar" probability="0" type="ts_http">
    <request> <http url="/bar" method="GET"></http> </request>
  </session>
  <session name="foo" probability="100" type="ts_http">
    <request> <http url="/" method="GET"></http> </request>
  </session>
</sessions>

把http-example的probability设置为0,可以使得在第一个arrivalphase期间不会执行它。

如果要一次启动多个会话,并且这些会话的名称以相同的前缀开头,则可以使用通配符。

<user session="foo*" start_time="10" unit="second"/>

负载测试的持续时间

默认情况下,tsung会在所有用户结束他们的session时结束,如果想在duration达到时结束,可以设置duration属性。

<load duration="1" unit="hour">
  <arrivalphase phase="1" duration="10" unit="minute">
    <users interarrival="2" unit="second"></users>
  </arrivalphase>
</load>

设置选项

Session配置

MQTT

Tsung支持发布消息,订阅和退订主题。可用请求类型

  • connect
  • disconnect
  • publish
  • subscribe
  • unsubscribe
  • waitForMessages
<session name="mqtt-example" probability="100" type="ts_mqtt">
    <request>
        <mqtt type="connect" clean_start="true" keepalive="10" will_topic="will_topic" will_qos="0" will_msg="will_msg" will_retain="false"></mqtt>
    </request>

    <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>

    <request subst="true">
        <mqtt type="subscribe" topic="test_topic" qos="1"></mqtt>
    </request>

    <request>
        <!-- wait for 60s -->
        <mqtt type="waitForMessages" timeout="60"></mqtt>
    </request>

    <request subst="true">
        <mqtt type="unsubscribe" topic="test_topic"></mqtt>
    </request>

    <request>
        <mqtt type="disconnect"></mqtt>
    </request>
</session>

统计与报告

文件格式

从1.4.2,可以配置Tsung格式为JSON。

<tsung backend="json" ...>

可用统计

  • request 每个请求的响应时间。
  • page 每组请求的响应时间(页面是一组请求,未用思考时间分隔)。
  • connect 建立连接的持续时间。
  • reconnect 重新连接数。
  • size_rcv 响应大小(以字节为单位)。
  • size_sent 请求的大小(以字节为单位)。
  • session 用户会话的持续时间。
  • users 并发用户数(会话已开始,但尚未结束)。
  • connected已打开TCP / UDP连接的用户数(例如:对于HTTP,在thinktime内,服务器可以关闭TCP连接,并且在thinktime到期之前不会重新打开该TCP连接)。
  • custom transactions

HTTP相关

  • 每种响应(200,400)的数量

Jabber

OS监控

  • {load,<host>} 最后一分钟的平均系统负载
  • {cpu,<host} CPU百分比。
  • {freemem,<host>} 可用内存

生成报告

可视化界面: http://node0:8091/

启动Tsung时,还有一个选项可以使控制器保持活动状态,即使测试完成也是如此,以便使用嵌入式Web服务器(请参阅-k选项)。默认情况下,测试完成后,Web服务器将停止。

进入log目录,可以手动生成报告

/usr/lib/tsung/bin/tsung_stats.pl

的持续时间。

  • users 并发用户数(会话已开始,但尚未结束)。
  • connected已打开TCP / UDP连接的用户数(例如:对于HTTP,在thinktime内,服务器可以关闭TCP连接,并且在thinktime到期之前不会重新打开该TCP连接)。
  • custom transactions

HTTP相关

  • 每种响应(200,400)的数量

Jabber

OS监控

  • {load,<host>} 最后一分钟的平均系统负载
  • {cpu,<host} CPU百分比。
  • {freemem,<host>} 可用内存

生成报告

可视化界面: http://node0:8091/

启动Tsung时,还有一个选项可以使控制器保持活动状态,即使测试完成也是如此,以便使用嵌入式Web服务器(请参阅-k选项)。默认情况下,测试完成后,Web服务器将停止。

进入log目录,可以手动生成报告

/usr/lib/tsung/bin/tsung_stats.pl

本文地址:https://blog.csdn.net/Koala_Bryson/article/details/108187917

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网