高并发压力测试工具Tsung

Tsung是Erlang开发的一个开源的多协议分布式负载测试工具,它能用来压力测试HTTP, WebDAV, SOAP, PostgreSQL, MySQL, LDAP 和 Jabber/XMPP的服务器。它可以分布在多个客户机,并能够模拟成千上万的虚拟用户数并发。

最近在做业务的横向扩展测试和业务接口的性能优化,期望QPS能达到C100K的目标。平时简单的压力测试,使用的是 ab 轻量级测试工具。但是,正式测试时,涉及到多接口、高并发等要求测试,就需要使用专业的、重量级的测试工具。如:Loadrunner、Jmeter、Tsung等。

由于Loadrunner主要在Windows下使用,部署集群不太方便,这里选择了Tsung。

1、服务器部署说明

Host IP 说明
nginx01 192.168.0.1 反向代理,上游是 Tomcat 服务
tsung01 192.168.0.2 压测机,Tsung master
tsung02 192.168.0.3 压测机,Tsung slave
tsung03 192.168.0.4 压测机,Tsung slave
tsung04 192.168.0.5 压测机,Tsung slave

在所有的压测机上 /etc/hosts 增加域名配置。

1
2
3
4
5
192.168.0.1	nginx01
192.168.0.2 tsung01
192.168.0.3 tsung02
192.168.0.4 tsung03
192.168.0.5 tsung04

2、安装

这里的操作以 CentOS 为例。

安装之前,需要先在所有压测机上安装以下软件包。

1
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixODBC-devel libtool libtool-ltdl-devel 

2.1、安装Erlang

由于 TsungErlang 开发的,所以,需要在所有的压力机上安装 Erlang,在官网找到适用版本的下载地址进行下载。

1
2
3
4
5
6
7
8
9
10
wget http://erlang.org/download/otp_src_20.3.tar.gz

tar -zxvf otp_src_20.3.tar.gz

cd otp_src_20.3

./otp_build autoconf
./configure
make
make install

修改环境变量 /etc/profile

1
2
export ERLANG_HOME=/usr/local/lib/erlang  
export PATH=$PATH:$ERLANG_HOME/bin

让修改的环境变量生效。

1
source /etc/profile  

2.2、安装Tsung

Tsung官网 找到最新的版本进行下载,安装在所有的压测机上。

1
2
3
4
5
6
7
8
9
wget http://tsung.erlang-projects.org/dist/tsung-1.7.0.tar.gz

tar -zxvf tsung-1.7.0.tar.gz

cd tsung-1.7.0

./configure

make && make install

Tsung 加到环境变量中。

1
2
export TSUNG_HOME=/usr/local/lib/tsung
export PATH=$PATH:$TSUNG_HOME/bin

/usr/local/share/doc/tsung/examples 目录下,有官方的 tsung.xml 配置模板。可以根据情况进行修改。

一般,先在 /root 路径下创建 .tsung 目录。然后,将 tsung.xml 模板拷贝到该目录下。

tsung01 上进行以下操作。测试 Tsung 是否可用。

1
cp /usr/local/share/doc/tsung/examples/http_simple.xml /root/.tsung/

修改 http_simple.xml 内容。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/local/share/tsung/tsung-1.0.dtd">
<tsung loglevel="notice" version="1.0">
<clients>
<client host="localhost" use_controller_vm="true" maxusers="400"/>
</clients>
<servers>
<server host="nginx01" port="80" type="tcp"></server>
</servers>
<monitoring>
<monitor host="myserver" type="snmp"></monitor>
</monitoring>
<load duration="5" unit="minute">
<arrivalphase phase="1" duration="5" unit="minute">
<!--
<users maxnumber="200" interarrival="1" unit="second"></users>
-->
<users maxnumber="200" arrivalrate="50" unit="second"></users>
</arrivalphase>
</load>
<options>
<option type="ts_http" name="user_agent">
<user_agent probability="80">Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050513 Galeon/1.3.21</user_agent>
<user_agent probability="20">Mozilla/5.0 (Windows; U; Windows NT 5.2; fr-FR; rv:1.7.8) Gecko/20050511 Firefox/1.0.4 </user_agent>
</option>
</options>
<sessions>
<session name="http-example" probability="100" type="ts_http">
<for from="1" to="10000" var="i">
<request>
<http url="/api/user/test?uid=12345" method="GET" version="1.1"></http>
</request>
</for>
</session>
</sessions>
</tsung>

启动 Tsung

1
tsung -f ~/.tsung/http_simple.xml start或者tsung start #默认使用的是/root/.tsung/tsung.xml

执行完成后,会在 /root/.tsung/log/ 目录下生成压测结果文件。例如:20180327-1216。

tsung.xml 的配置和使用,可以参考官网文档Tsung文档说明

2.3、安装Template Toolkit

Tsung 生成的压测数据不便于阅读,需要将其转换成丰富的报表。这时,需要用到 Template Toolkit。在 tsung01 一台服务器上安装即可。

首先,安装 Template Toolkit 依赖的软件包。

1
yum -y install gnuplot perl5 perl-ExtUtils-CBuilder perl-ExtUtils-MakeMaker  

然后,在Template Toolkit官网找到下载地址,进行下载安装。

1
wget http://cpan.org/modules/by-module/Template/Template-Toolkit-2.26.tar.gztar -zxf Template-Toolkit-2.26.tar.gzcd Template-Toolkit-2.26perl Makefile.PL make  make test  make install  

在执行 make test 时,可能会提示错误信息。可以先不忽略,直接 make install。如果安装成功,就没有问题。

生成测试报告

1
#在 ~/.tusng 下创建 html 目录cd /root/.tsungmkdir htmlmkdir 20180327-1216cd 20180327-1216tsung_stats.pl --stats ~/.tsung/log/20180327-1216/tsung.log

20180327-1216 目录下载到本地,就可以查询详细的测试报告。点击查看测试报告

3、集群测试

Tsung 的集群测试使用十分简单,只需要在主节点上执行操作,所有从节点会自动执行,不用去干预。这涉及到打通主从节点的通讯问题(基于Erlang的通讯)。

尝试过基于 SSH 的免密钥方式,很容易出现问题,不是很方便。最后找到一种很方便的方式,使用 tsung_rsh 工具。

首先,要确保所有压测机的服务器名称与域名保持一致。可以采用临时修改服务器名称的方式。也可以采用修改 /etc/hosts,把服务器名称当作域名(前提是每台服务器名称不一样)。

临时修改服务器名称。

1
#修改 tsung01 的服务器名称hostname tsung01#其他几台类似

然后,在所有的压测机上下载该工具。

1
cd /opt/apps/git clone https://github.com/weibomobile/tsung_rsh.git

在所有的从节点压测机上启动守护进程 rsh_daemon.sh

1
sh rsh_daemon.sh -a tsung01 start

注意:

  • 不要修改监听端口的默认值19999,除非你想更改,那么不要忘记修改rsh_client.sh的PORT值
  • 如果内网之间有端口屏蔽的话,注意要开放 19999 端口。

在主节点上修改 tsung.xml 配置。主要是修改 <client>

1
<clients>    <client host="tsung02" weight="1" maxusers="200" cpu="3" >	<ip value="192.168.0.3"/>    </client>    <client host="tsung03" weight="1" maxusers="200" cpu="3" >    	<ip value="192.168.0.4"/>    </client>    <client host="tsung04" weight="1" maxusers="200" cpu="3" >	<ip value="192.168.0.5"/>    </client>  </clients>  <monitoring>    <monitor host="tsung02" type="erlang"></monitor>    <monitor host="tsung03" type="erlang"></monitor>    <monitor host="tsung04" type="erlang"></monitor>  </monitoring>

最后启动。

1
tsung -r /opt/apps/tsung_rsh/rsh_client.sh -f /root/.tsung/tsung.xml start

完成压力测试后,生成测试报告,就可以进行分析了。查看集群测试报告

4、问题

采用集群测试时,可能会遇到生成的报表没有数据。这个问题很有可能是主从节点之间的通讯不畅导致的,也有可能是 tsung.xml 的参数设置的不合理。

具体的错误信息,可以查看日志文件 /root/.tusng/logs/20180327-1216/tsung_controller\@tsung01.log

可以采用以下方式验证主从节点之间的通讯。

1
erl -rsh /otp/apps/tsung_rsh/rsh_client.sh -sname foo -setcookie mycookieEshell V5.4.3 (abort with ^G)(foo@myhostname)1>slave:start(remotehost,bar,"-setcookie mycookie").

remotehost 分别修改成从节点的域名tsung02、tsung03、tsung04进行测试。

如果返回 {ok,bar@remotehost}。说明通讯没有问题。否则,就说明通讯有问题,请检查该节点的 hostshostname

参考:

文章作者: OneRain
文章链接: https://kiswo.com/2017/11/26/tools/test/tsung-note/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 OneRain's Blog