tsung:开源、多协议、分布式的压力测试工具
tsung index:http://tsung.erlang-projects.org/index.en.html
tsung user's manual:http://tsung.erlang-projects.org/user_manual.html
主要特性
1、高性能:tsung能在每台物理机器上模拟大量同步用户,在单个cup上模拟大量用户
2、分布式:在集群里实现负载分布式
3、多协议:支持HTTP,WebDAV,Jabber/XMPP,PostgreSQL,他们在tsung里作为一个插件系统使用,1.3版本支持LDAP和MySQL插件
4、SSL支持
5、多IP:通过系统底层的IP别名实现在单个机器上使用多个IP地址 6、系统监控:在远程服务器通过erlang代理或SNMP实现系统监控(CUP,内存,网络流量) 7、XML配置:使用XML配置实现用户复杂使用场景 8、动态脚本:可以获取动态数据来注入到后面的请求中 9、混合行为:使用相同的标准通过多个会话来模拟不同类型的用户,你可以在标准脚本里指定不同行为的比例开发版下载 git clone git://git.process-one.net/tsung/mainline.git
默认加载配置:~/.tsung/tsung.xml 日志文件保存目录:~/.tsung/log/ tsung命令用法查看:tsung -h 启动tsung典型方式:tsung -f myconfigfile.xml start
tsung的录音功能
tsung 采用了巧妙的 proxy 方式来“录制”测试脚本。具体来说,就是建立一个本机的 http proxy 默认支持HTTP,WebDAV和PostgreSQL
使用 8090 端口,在配好 firefox 使用 localhost 8090 作为代理之后,所有“流经”这个 proxy 的
http 动作都会被记录下来,测试时可以“回放”这些步骤来产生请求
录音启动:tsung-recorder -p <PLUGIN> start PLUGIN可选值:http、webdav、pgsql,默认http 录音监听端口:8090,修改端口:使用 -L portnumber 终止录音:tsung-recorder stop
tsung测试脚本详解
- <?xml version="1.0">
- <!DOCTYPE tsung SYSTEM "/usr/local/share/tsung/tsung-1.0.dtd">
- <tsung loglevel="debug" version="1.0" dumptraffic="protocol">
- <clients>
- <client host="localhost" cpu="2" >
- <ip value="192.168.51.81"></ip>
- </client>
- </clients>
- <servers>
- <server host="192.168.51.81" port="9999" type="tcp"></server>
- </servers>
- <monitoring>
- <monitor host="xenvmhost131" type="munin"></monitor>
- </monitoring>
- <load>
- <arrivalphase phase="1" duration="5" unit="minute">
- <users arrivalrate="2" 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>
- <option name="file_server" id="apiPostContent" value="/usr/local/tsung-1.4.2/examples/apiPostContent.csv"/>
- </options>
- <sessions>
- <session name='order' probability='100' type='ts_http'>
- <setdynvars sourcetype="file" fileid="apiPostContent" delimiter="^_^" order="random">
- <var name="data" />
- </setdynvars>
- <request subst="true">
- <http url='/api' version='1.1' contents='%%_data%%' content_type='application/x-www-form-urlencoded; charset=UTF-8' method='POST'>
- <http_header name="Accept-Encoding" value="gzip,deflate"/></http>
- </request>
- </session>
- </sessions>
- </tsung>
<?xml version="1.0">
<!DOCTYPE tsung SYSTEM "/usr/local/share/tsung/tsung-1.0.dtd">
<tsung loglevel="debug" version="1.0" dumptraffic="protocol">
<clients>
<client host="localhost" cpu="2" >
<ip value="192.168.51.81"></ip>
</client>
</clients>
<servers>
<server host="192.168.51.81" port="9999" type="tcp"></server>
</servers>
<monitoring>
<monitor host="xenvmhost131" type="munin"></monitor>
</monitoring>
<load>
<arrivalphase phase="1" duration="5" unit="minute">
<users arrivalrate="2" 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>
<option name="file_server" id="apiPostContent" value="/usr/local/tsung-1.4.2/examples/apiPostContent.csv"/>
</options>
<sessions>
<session name='order' probability='100' type='ts_http'>
<setdynvars sourcetype="file" fileid="apiPostContent" delimiter="^_^" order="random">
<var name="data" />
</setdynvars>
<request subst="true">
<http url='/api' version='1.1' contents='%%_data%%' content_type='application/x-www-form-urlencoded; charset=UTF-8' method='POST'>
<http_header name="Accept-Encoding" value="gzip,deflate"/></http>
</request>
</session>
</sessions>
</tsung>
- <?xml version="1.0">
<?xml version="1.0">默认编码是utf-8
- <tsung loglevel="debug" version="1.0" dumptraffic="protocol">
<tsung loglevel="debug" version="1.0" dumptraffic="protocol">
loglevel表示日志等级,可选值:emergency、critical、error、warning、notice(default)、info、debug
如果添加了dumptraffic=“true”属性,则开启流量日志,所有通信信息都会保存到文件中,tsung会很慢,所以除了debug时建议不要开启,默认关闭1.4版本还增加了dumptraffic="protocol"来记录对应的协议通信,只支持HTTP,你可以查看对应测试通信日志如~/.tsung/log/yyyyMMdd-HHmm/tsung.dump
- <clients>
- <client host="localhost" cpu="2" >
- <ip value="192.168.51.81"></ip>
- </client>
- </clients>
<clients>集群Client设置
<client host="localhost" cpu="2" >
<ip value="192.168.51.81"></ip>
</client>
</clients>
clients:用户产生的方式
基本设置:在相同的HOST和erlang虚拟机上启动节点
<client host="localhost" use_controller_vm="true"/>
高级设置:
<clients>weight:决定一个节点上用户的比例
<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>
maxusers:决定一个节点能够支持的最大虚拟用户数,默认800
ip:IP别名技术产生多个虚拟IP模拟多个机器,1.1.1版本IP不必强制指定,将使用默认IP,1.4版本可以使用<ip scan="yes" value="eth0" />来扫描IP别名
cpu:每个cpu都会产生一个erlang虚拟机用来发挥多CPU的优势
use_controller_vm:当达到机器最大用户数时是否启动新的erlang虚拟机
<servers>集群server配置
<server host="10.9.195.1" port="8080" type="tcp"></server>
</servers>
servers:被测试的服务器
type:协议类型如tcp、udp
- <monitoring>
- <monitor host="xenvmhost131" type="munin"></monitor>
- </monitoring>
<monitoring>系统监控配置
<monitor host="xenvmhost131" type="munin"></monitor>
</monitoring>
type:默认使用erlang通信来获取服务器上的统计数据,可选值:erlang、snmp、munin
- <load>
- <arrivalphase phase="1" duration="5" unit="minute">
- <users arrivalrate="2" unit="second"></users>
- </arrivalphase>
- </load>
<load>压力配置:
<arrivalphase phase="1" duration="5" unit="minute">
<users arrivalrate="2" unit="second"></users>
</arrivalphase>
</load>
arrivalphase:到达阶段,可以有多个阶段来组合压力场景
phase:阶段号,多个到达阶段时,系统会依次按阶段号执行
duration:持续时间
unit:持续时间单位,可选值:minute、hour、day
users:虚拟用户产生频率
arrivalrate:时间单位内产生多少个用户,如arrivalrate=2,unit=second表示每秒产生2个用户
interarrival:多少单位时间内产生一个用户,如interarrival=2,unit=second表示每2秒产生1个用户,不要和arrivalrate同时存在
如果你想限制阶段内产生的用户数量,可以用maxnumber来限定用户数,如maxnumber="200"
- <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>
- <option name="file_server" id="apiPostContent" value="/usr/local/tsung-1.4.2/examples/apiPostContent.csv"/>
- </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>
<option name="file_server" id="apiPostContent" value="/usr/local/tsung-1.4.2/examples/apiPostContent.csv"/>
</options>
options:设置一些默认的全局设置,比如SSL加密算法,TCP/UDP的buffer大小(默认32KB)如下:
<option name="thinktime" value="3" random="false" override="true"/>
<option name="ssl_ciphers"
value="EXP1024-RC4-SHA,EDH-RSA-DES-CBC3-SHA"/>
<option name="tcp_snd_buffer" value="16384"></option>
<option name="tcp_rcv_buffer" value="16384"></option>
<option name="udp_snd_buffer" value="16384"></option>
<option name="udp_rcv_buffer" value="16384"></option>
更多设置可以参看官网手册
type:ts_http,1.1版本开始对于HTTP可以设置用户请求的浏览器信息userAgent,多个user_agent的比重相加必须等于100
name="file_server":1.4版本开始可以读取一个文件,id必须唯一,以便后面的session可以存储或动态生成数据
- <sessions>
- <session name='order' probability='100' type='ts_http'>
- ...
- </session>
- </sessions>
<sessions>sessions:用户所产生的会话组
<session name='order' probability='100' type='ts_http'>
...
</session>
</sessions>
session:单个会话,每个会话组都可以有多个会话,用户根据每个会话的比重来产生相应的会话
name:名称
probability:比重,所有会话加起来必须等于100
type:测试对象类型,可选值ts_http,ts_webdav,ts_pgsql等
- <setdynvars sourcetype="file" fileid="apiPostContent" delimiter="^_^" order="random">
- <SPAN style="WHITE-SPACE: pre"> </SPAN><var name="data" />
- </setdynvars>
<setdynvars sourcetype="file" fileid="apiPostContent" delimiter="^_^" order="random">
<var name="data" />
</setdynvars>
setdynvars:变量设置
sourcetype:变量来源类型,file为从文件中读取
fileid:对应的options中的文件操作ID
delimiter:变量分隔符
order:数据产生方式
var:变量名称
该段内容表示从apiPostContent这个文件操作中随机读取数据,以^_^来分隔每行数据,第一个变量命名为data除了从文件读取,也可以随机生成,如:
<setdynvars sourcetype="random_string" length="13">
<var name="rndstring1" />
</setdynvars>
<setdynvars sourcetype="random_number" start="3" end="32">
<var name="rndint" />
</setdynvars>
- <request subst="true">
- <http url='/api' version='1.1' contents='%%_data%%' content_type='application/x-www-form-urlencoded; charset=UTF-8' method='POST'>
- <SPAN style="WHITE-SPACE: pre"> </SPAN><http_header name="Accept-Encoding" value="gzip,deflate"/>
<request subst="true">
<http url='/api' version='1.1' contents='%%_data%%' content_type='application/x-www-form-urlencoded; charset=UTF-8' method='POST'>
<http_header name="Accept-Encoding" value="gzip,deflate"/>
- <SPAN style="WHITE-SPACE: pre"> </SPAN></http>
- </request>
</http>request:会话产生的请求
</request>
subst:是否动态替换,如果请求中的数据是根据变量动态产生的,则subst属性必须为true,变量引用方式:%%_变量名%%
http:一个http请求
url:请求地址
version:http协议版本
contents:http请求报文内容
content_type:
method:请求方式,可选值:POST、GET
http_header:设置http请求头
启动Tsung完成测试后可以通过安装的lib下的bin目录下tsung_stats.pl来生成报表
如/usr/local/lib/tsung/bin/tsung_stats.pl