mqtt
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安装
- 安装环境
Linux版本:Ubuntu 16.04 LTS
Tsung版本:1.7.0
- 安装前准备
sudo apt-get install gcc -y
sudo apt-get install perl -y #报表会使用到
sudo apt-get install gnuplot -y #图形时用
- 安装步骤
(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使用
- 在tsung安装目录下新建conf目录,存放log和conf,修改/bin/tsung文件
修改MAIN_DIR
修改OPT_FILE
把tsung提供的模板配置文件复制到./conf下
cp /usr/local/tsung/share/doc/tsung/examples/mqtt.xml ./conf
- 运行tsung,默认执行脚本tsung.xml
tsung start
- 运行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