欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

mqtt

程序员文章站 2022-03-27 21:36:54
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

mqtt

修改OPT_FILE

mqtt

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

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

mqtt

  1. 运行mqtt.xml

把mqtt.xml放在bin目录下

mqtt设置

mqtt

运行tsung

mqtt

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

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

mqtt

运行完成之后

mqtt

打开report.html即可看到报告

mqtt

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