高并发测试工具Tsung使用教程

tsungerlang开发的一款开源的多协议分布式负载并发测试工具

可用作HTTP、WebDAV、SOAP、PostgreSQL、MySQL、LDAP 和 Jabber/XMPP的服务器压力测试。

tsung可分布在多个客户机,并能够模拟成千上万的虚拟用户数并发。

1 下载安装

Tsung 已经在Linux、FreeBSD和Solaris上通过测试,

其他系统,只要支持Erlang语言的平台上,也是可以工作的(Linux、Solaris、*BSD、Win32 和 Mac OS X)。

Mac OS X通过 Homebrew 即可安装 tsung,命令:

brew install tsung

Ubuntu 安装也很简单,命令:

apt-get install tsung

其他系统需要先下载源码包再安装,源码包下载地址:

tsung 1.6.0为例,下载安装命令:

wget http://tsung.erlang-projects.org/dist/tsung-1.6.0.tar.gz  # 以1.6.0版本为例
tar -zxf tsung-1.6.0.tar.gz   # 解压
cd tsung-1.6.0                # 进入目录
./configure                   # 配置,生成 Makefile 文件
make                          # 编译
make install                  # 安装

configure 的时候,如果没有安装 tsung 依赖的 Erlang 语言库,会提示下面的错误:

...
checking for Erlang/OTP root directory... configure: error: in `/root/tsung-1.6.0':
configure: error: test Erlang program execution failed
...

可以用下面的命令先安装erlang,再 configure

brew install erlang        # OS X Homebrew
port install erlang        # OS X MacPorts
apt-get install erlang     # Ubuntu 和 Debian
yum install erlang         # Fedora
pkg install erlang         # FreeBSD

其他系统需要从源码安装 Erlang,稍微复杂一些,可参考:https://github.com/erlang/otp/blob/maint/HOWTO/INSTALL.md

2 运行

tsung安装完成后,会生成两个命令文件:

  1. tsung
  2. tsung-recorder

默认生成在 /usr/local/bin 目录下,使用-h参数可以查到它们所有的参数:

tsung -h

在启动 tsung 之前,我们需要一个 XML 格式的配置文件,tsung会根据该配置文件进行测试。

/usr/share/doc/tsung/examples 目录下有一些 XML 配置文件范例,

将其中HTTP测试配置文件 http_simple.xml 拷贝到当前目录,

再执行,命令如下:

cp /usr/local/share/doc/tsung/examples/http_simple.xml ./   # 拷贝范例配置文件
tsung -f http_simple.xml start                              # 指定xml文件并开始。如果不指定,则默认使用 ~/.tsung/tsung.xml

这个命令会打印出测试的日志目录,直到测试结束。

3 结果

tsung 测试结束后,测试结果 Log 保存在目录 ~/.tsung/log/ 下。

当启动一个新的测试时,会在这个目录下面创建一个新的子目录,用以保存测试的数据。

Log 格式为当前日期和时间的组合,例如:~/.tsung/log/20160217-0940

默认情况下,控制节点会启动一个嵌入的网站服务器,侦听8091端口(可以用 -n 选项禁用)。

测试过程也可以用tail命令查看实时记录:

tail -f ~/.tsung/log/20140430-1126/tsung.log

测试结束之后,再用tsung_stats.pl生成报表。

yum install gnuplot       # tsung_stats.pl 需要用到的 gnuplot
mkdir http_simple         # 创建用以保存报表的目录
cd http_simple            # 进入目录
/usr/local/lib/tsung/bin/tsung_stats.pl --stats ~/.tsung/log/20160305-0933/tsung.log  # 生成报表

之后,会在 http_simple 目录下生成3个目录和1个 log 文件,其中 images 目录下就是报表图片,类似如下。

graphes-HTTP_CODE-rate_tn   graphes-Perfs-mean_tn

以上仅是测试,没有实际用处,因为没有配置要测试的网站,所以所得到的结果没有实际意义。

需要修改 XML 配置文件后再测试,才会得到有意义的结果。

4 配置文件

打开 http_simple.xml ,下面来讲几个关键的配置。

4.1 clients

用户产生的方式:

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

tsung运行时可以由很多的虚拟机(VM)组成,client配置指明这个client机器上最多生成的用户数,

如果use_controller_vmtrue的话,那么当用户数达到maxusers,tsung会自动生成新的虚拟机。

4.2 servers

<servers>
  <server host="garden.blue.jude.poppen.lab" port="80" type="tcp"></server>
</servers>

server段可以配置被测服务器的相关信息,也可以配置成集群,如下

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

tsung会根据weight值来选择发起请求的server

4.3 monitoring

系统监控服务,配置完后可获取被测server的CPU、内存、负载、数据库等相关信息。

可以配置成erlang的监控服务和snmp的监控服务。

<monitoring>
  <monitor host="garden" type="erlang">
    <mysqladmin port="3306" username="root" />
  </monitor>
</monitoring>

4.4 load

<load>
  <arrivalphase phase="1" duration="3" unit="minute">
    <users maxnumber="100" interarrival="0.02" unit="second" ></users>
  </arrivalphase>
</load>

load段可配置访问的负载,访问可以配成多个阶段,由phase值指定。

duration是测试持续时间,unit是单位。

users段的maxnumber限制了生成的最大用户数,

interarrival="0.02"表示0.02秒产生一个新用户,用户按照session的配置顺序执行session中的request

4.5 options

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

options段可配置一些请求的信息,如agent信息。

4.6 sessions

<sessions>
  <session name="http-example" probability="70" type="ts_http">
    <setdynvars sourcetype="random_number" start="1" end ="100">
      <var name="itemid" />
    </setdynvars>
    <transaction name='getlist'>
      <request subst="true">
        <http url="/comment/getList" method="POST" contents = "item_type=image&amp;item_id=%%_itemid%%"></http>
      </request>
    </transaction>
  </session>
  <session name="http-example" probability="30" type="ts_http">
    <setdynvars sourcetype="random_number" start="1" end="100">
      <var name="itemid" />
    </setdynvars>
    <setdynvars sourcetype="random_number" start="20" end="5000000">
      <var name="content" />
    </setdynvars>
    <transaction name='getlist'>
      <request subst="true">
         <http url="/comment/addComment" method="POST" contents = "item_type=image&amp;item_id=%%_itemid%%&amp;content=%%_content%%"></http>
      </request>
    </transaction>
  </session>
</sessions>

可配置多个子session,进而可测试多个api,

可以设置请求概率,在probability里定义,

要求每个sessionprobability之和是100,类型是http。

sessions里可用for来设定请求次数,如下

<for from="1" to="@loop" incr="1" var="counter">

在里面可以设置请求的具体信息。

在请求参数里可以带上随机数。

随机数和随机字符串的定义如下:

<setdynvars sourcetype="random_number" start="20" end="5000000">
  <var name="xxx" />
</setdynvars>
<setdynvars sourcetype="random_string" length="10">
  <var name="xxx" />
</setdynvars>

%%_xxx%%的形式来调用。

这里必须注意的是,要使用随机数,request必须加上subst="true"参数,不然随机数无法被引用成功。

随机数也可从文件读取,如csv

http内部可定义header参数:

<http_header name="Authorization" value="111"/>
<http_header name="Cookie" value="authToken=%%_auth_token%%; Path=/"/>
<!-- content-Type:POST请求参数的格式,如果是json格式可以这样写 -->
<http_header name="Content-Type" value="application/json"/>

thinktime可用于定义两个请求的间隔时间

<thinktime value="1"/>

另外可定义不同的transaction ,这样子结果里就会显示不同transaction的具体信息。

 

参考文档:

  1. Tsung 1.6.0 documentation
  2. Load Testing using Tsung
  3. Test the Performance and Scalability of Your Web Applications With Tsung
  4. 压力测试工具tsung用法简介

16 条评论

x
xiaobaihua01 says: 回复

tsung_stats.pl文件在哪儿?

t
test says:

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

_
_L says: 回复

楼主,请问tsung可以发https的请求吗?

歪麦 says: 作者

支持,请参考:Use tsung to test https site

_
_L says:

非常感谢

_
__ss says: 回复

Log directory is: /Users/hongwei/.tsung/log/20170907-1011
[os_mon] cpu supervisor port (cpu_sup): Erlang has closed

压测的时候回报错, Erlang has closed 这是啥原因?对压测结果有影响吗?最大链接数也只能到220
如何提高并发量呢?我加大了每秒产生的用户数量也不行

z
zs says:

我也出现了这样的错误,请问你解决了吗?

says: 回复

I serіously love your website.. Greаt colors & theme.
Did you develop this site yourself? Please reply back ɑs I’m hoping to create my own blog
and would love to find out where you got this from or what the
thеme is called. Many thanks!

歪麦 says: 作者

Yes, I develop it myself. It named Maizi.
You can download the source code from my github: https://github.com/yeszao/maizi.

m
mark says: 回复

centOS 可以用 yum install tsung

d
dearx says: 回复

收藏了

v
vjj says: 回复

请问每秒创建的虚拟用户是不是执行完session里面的请求然后这个用户的生命周期就结束了?
还是会一直执行session里面的request直到arrivalphace 的duration时间结束后,这个用户才停止请求session里面的request?
报表里显示的并发用户数上不去,都是20左右,尽管我设置每秒1000虚拟用户的增长。

z
zhou says: 回复

请求参数是动态的怎么解决 求帮助

滴答 says: 回复

博主还在吗

滴答 says: 回复

博主还在吗?如果是Windows系统下载安装怎么弄呢?

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

昵称 *