Tsung HTTP脚本开发
个人笔记,仅供参考
1. Tsung简介
Tsung是基于elang语言开发的分布式压力测试工具,它支持多种协议,能对HTTP、WebDAV、SOAP、PostgreSQL、MySQL、LDAP和Jabber/XMPP 服务器进行负载测试。Tsung的强大之处在于其可以在单台机器上模拟生成大量用户。相比Apache Jmeter,Tsung可以轻松模拟40,000请求/秒,而且没有让人困惑的GUI页面,只需要在xml文件里面配置即可。若单个客户机无法满足压力测试需求,还可以使用多客户机集群对服务器进行压测。
2. 安装
部署环境:linux操作系统
安装Tsung之前需要准备一些必需模块,安装elang,Tsung以及报告生成模块等。
参考:http://www.cnblogs.com/tsbc/p/4272974.html
3. Tsung.xml
安装完成后,所有的模拟生成用户,请求的配置都在Tsung.xml文件中进行定义:Tsung通过执行Tsung.xml对目标服务器进行负载测试。脚本的所有内容封装在<Tsung></Tsung>标签对中,如图所示:
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/share/tsung/tsung-1.0.dtd" [] >
<tsung loglevel="info">
...
</tsung>
1.1 Client&Server
脚本编写从定义客户端和服务器开始。客户端,即对服务器施加负载压力。对于普通的负载测试而言,客户端与服务器的定义一般如下:
<clients>
<client host="localhost" use_controller_vm="true"/>
</clients>
<servers>
<server host="192.168.1.1" port="80" type="tcp"></server>
</servers>
在整个负载测试过程中,脚本都是使用一个客户端对唯一的服务器进行测试。
l use_controller_vm: 属性为true 意指使用Erlang虚拟机作为控制器;
l port:表示应用服务的端口为80;
l type:tcp表示客户机与服务器进行tcp连接;
port,type项可在PC端使用WireShark获取应用服务的通讯报文得出。
要对服务器进行大负载测试时,仅使用一个客户端明显无法对服务器模拟大量请求,此时可使用多个虚拟的IP来模拟更多的机器。
默认设置下,负载是平均分配到所有cpu上(默认是一个client拥有一个cpu)。weight参数是考虑到每个客户机处理的能力不同设置,假如只有两个client,weight值为
1,和2,那么weight为1的client会承担1/3的负载,同理weight值为2的client会承担2/3的负载。
maxusers参数默认值为800,不同操作系统单个进程建立socket链接数量有限制,一般不超过1024。因此如果用户数超过限制的,需要开启一个新的erlang虚拟机增加用户数。
<clients>
<client host="loadnode2" weight="1" maxusers="40000" cpu="1">
<ip value="192.168.122.3"/>
</client>
<client host="loadnode3" weight="1" maxusers="40000" cpu="1">
<ip value="192.168.122.21"/>
</client>
<client host="loadnode4" weight="1" maxusers="40000" cpu="1">
<ip value="192.168.122.11"/>
</client>
</clients>
<servers>
<server host="10.9.195.1" port="8080" type="tcp"></server>
</servers>
1.1 定义负载load
通过使用多个arrival phases标签实现客户端对服务器施加负载:
<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>
上述xml代码表示:在测试开始的10分钟,每一秒生成2个用户;在第二个10分钟,每秒生成1个用户;第三个十分钟,每秒生成10个用户。
另外可以使用arrivalrate取代interarrival标签,但是含义不同:
<arrivalphase phase="1" duration="10" unit="minute">
<users arrivalrate="10" unit="second"></users>
</arrivalphase>
表示在测试开始的第一个十分钟内,每秒生成10个新用户。标签内还可以maxuser限制生成用户数量,或者使用loop循环标签生成更多用户。
负载测试的时长通常比arrivalphase定义的时间要长,原因是Tsung会等待所有的session完成后才结束负载测试。
3.3 <option>
在Tsung.xml中使用option标签可设置全局变量。例如http request之间的thinktime、SSL密码、TCP/UDP缓存大小。只要标签option内的值正确,option标签内的属性值会重写session标签内同一属性的值。对HTTP而言,通常使用option标签设置UserAgent值。
<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>
probability表示在整个负载测试过程中使用该user-agent进行模拟请求的百分比,若对user_agent使用百分比进行设置,所有user_agent分配百分比加总要等于100%。
3.4 <Session>
Session标签内描述的是需要执行的请求。每一对session标签都有一个给定的百分比。这些百分比决定新生成的用户将执行哪一个session,所有session的百分比之和必须等于百分之百。统计一组请求的响应时间,应将这一组请求使用transaction标签对括起来。例如要知道一个网站登录页面的响应时间,要将访问该页面的所有请求包含进transaction标签内(包括请求html+请求首页picture等)。下面介绍HTTP脚本的例子的结果统计报告中index_request事务将统计出请求index.en.html + header.gif的响应时间。需要注意的是如果transaction中包含thinktime ,结果报告中Responsetime也包含有thinktime时间在内。
thinktime的设置有多种方式:
<thinktime value="20" random="true"></thinktime>
表示thinktime是随机的,但整体的平均值为20s。
设置thinktime的范围:
<thinktime min="2" max="10" random="true"></thinktime>
3.5 HTTP
以下脚本表示Tsung一般支持的HTTP特性,包括GET、POST请求,基础的认证...
http标签中的url使用绝对路径,会重写server里面中定义的url。
<sessions>
<session name="http-example" probability="70" type="ts_http">
<request> <http url="/" method="GET" version="1.1">
</http> </request>
<request> <http url="/images/logo.gif"
method="GET" version="1.1"
if_modified_since="Fri, 14 Nov 2003 02:43:31 GMT">
</http></request>
<thinktime value="20" random="true"></thinktime>
<transaction name="index_request">
<request><http url="/index.en.html"
method="GET" version="1.1" >
</http> </request>
<request><http url="/images/header.gif"
method="GET" version="1.1">
</http> </request>
</transaction>
<thinktime value="60" random="true"></thinktime>
<request>
<http url="/" method="POST" version="1.1"
contents="bla=blu">
</http> </request>
<request>
<http url="/bla" method="POST" version="1.1"
contents="bla=blu&name=glop">
<www_authenticate userid="Aladdin"
passwd="open sesame"/></http>
</request>
</session>
<session name="backoffice" probability="30" ...>
... </session>
</sessions>
Tsung 1.2.2版本之后,提供HTTP请求头添加方式:
<request>
<http url="/bla" method="POST" contents="bla=blu&name=glop">
<www_authenticate userid="Aladdin" passwd="open sesame"/>
<http_header name="Cache-Control" value="no-cache"/>
<http_header name="Referer" value="http://www.w3.org/"/>
</http>
Tsung 1.3.1开始,提供手动添加cookie功能:
<request>
<http url="/bla" method="POST" contents="bla=blu&name=glop">
<www_authenticate userid="Aladdin" passwd="open sesame"/>
<http_header name="Cache-Control" value="no-cache"/>
<http_header name="Referer" value="http://www.w3.org/"/>
</http>
</request>
但所添加的cookie只能作用于当前request,需要在每个request标签中添加cookie信息。
使用POST或者PUT方式时,请求的内容写在contents内,注意的是,要把内容转换成XML编码格式,如<、&、%这些字符是需要使用xml转义字符。
4. Tsung.xml使用
4.1 新建目录,拷贝配置脚本
在root文件夹下新建.Tsung目录,用于存放log和xml配置,测试配置文件可参考/usr/local/Tsung/share/doc/Tsung/examples/目录下配置。
[[email protected] local]#mkdir ~/.Tsung
[[email protected] local]#cp /usr/local/Tsung/share/doc/Tsung/examples/http_simple.xml ~/.Tsung/Tsung.xml
cp命令将http_simple.xml拷贝到.Tsung文件夹,并且命名为Tsung.xml,这里的http_simple.xml只是参考例子还需要自己编辑定义的。
实际上可以直接将自己定义好的Tsung.xml上传至创建的.Tsung目录下,执行:
4.2 执行Tsung.xml
[[email protected] local]# Tsung start
Starting Tsung
"Log directory is: /root/.Tsung/log/20150812-1636"
生成报告的在目录/root/.Tsung/log/20150812-1636
4.3 生成图表文件
进入报告所在目录使用命令/usr/lib64/Tsung/bin/Tsung_stats.pl生成报表。
根据安装目录不同,命令路径有所区别,可以在根目录下使用find -name Tsung_stats.pl查找Tsung_stats.pl所在目录再执行。
[[email protected] 20150812-1636]# /usr/local/Tsung/lib/Tsung/bin/Tsung_stats.pl
creating subdirectory data
creating subdirectory gnuplot_scripts
creating subdirectory images
No data for Session
No data for Perfs
No data for Transactions
No data for Match
No data for Event
No data for Async
No data for Size
size_rcv is equal to 0 !
size_sent is equal to 0 !
执行之后,将整个20150812-1636拷贝至本地,点击report.html查看负载测试结果。.tsung是隐藏目录,建议将报告拷贝到 /root/tmp临时目录后,使用winscp弄到本地打开。