TSUNG压测软件安装和使用
版权说明:本文系博主通过各种渠道学习整理发表或者全文转载自其他平台,作为学习笔记,不能保证所有知识点是完全正确以及表达无误,用于生产环境配置时请斟酌。如有错误或建议请联系。转载请注明出处,侵删联系:linuxops@foxmail.com。感谢各位!
前言
这几天,一个新的项目即将上线运营,在大力推广运营之前领导想要研发中心出一份压测的报告。市面上有很多使用的压测平台,比如腾讯和阿里,都有提供.但是费用极其昂贵,本着互联网的开放精神,找了一下开源的,果然让我遇见了tsung这款强大的开源的压测软件。
什么是tsung?
tsung是一款开源的分布式的负载均衡测试软件,基于erlang语言开发的,它可以用来压力测试HTTP, WebDAV, SOAP, PostgreSQL, MySQL, LDAP 和 Jabber/XMPP的服务器。它可以分布在多个客户机,并能够模拟成千上万的虚拟用户数并发。tsung是一款高效的软件,在低配置下也能很好的模拟上千客户端并发,非常棒,关键是它是一款分布式的压测软件,能分布式说明它产生压力可以横向扩展,只要你有足够多的机器。
tsung安装
1、安装依赖
yum install -y gcc gnuplot gd libpngzlib perl unixODBC unixODBC-devel ncurses-devel perl-devel
2、安装erlang-otp
[root@tsung ~]# tar -zxvf erlang_otp_src_20.0.tar.gz
[root@tsung ~]# cd otp_src_20.0/
[root@tsung otp_src_20.0]# ./configure --prefix=/usr/local/erlang
[root@tsung otp_src_20.0]# make
[root@tsung otp_src_20.0]# make install
3、安装Tsung
[root@tsung ~]# tar -zxvf tsung-v1.7.0.tar.gz
[root@tsung ~]# cd tsung-1.7.0/
[root@tsung tsung-1.7.0]# ./configure --prefix=/usr/local/tsung --with-erlang=/usr/local/erlang
[root@tsung tsung-1.7.0]# make
[root@tsung tsung-1.7.0]# make install
4、安装perl Template,用于生成报告模板
[root@tsung ~]# tar -zxvf Template-Toolkit-2.26.tar.gz
[root@tsung ~]# cd Template-Toolkit-2.26
[root@tsung Template-Toolkit-2.26]# perl Makefile.PL
[root@tsung Template-Toolkit-2.26]# make
[root@tsung Template-Toolkit-2.26]# make install
5、为方便使用,将tsung和erlang加入环境变量。
[root@tsung ~]# tsung -v
Tsung version 1.7.0
[root@tsung ~]#
tsung的使用
tsung 安装完成了以后,在安装目录下有官方自带的示例配置文件。
配置文件是xml格式,对应每一种压测都会给出一个示例文件。
http和http的接口使用的是http_simple.xml。
示例文件:[root@tsung ~]# cd /usr/local/tsung/share/doc/tsung/examples/
但是本文不使用此示例配置文件,之前有做过微信接口的压测,就以这个压测配置文件为例子吧。
进入压测项目文件夹,查看一下项目需要的文件
[root@tsung wechat]# ll
total 12
-rw-r--r-- 1 root root 303 Oct 19 15:46 post.txt #post到服务器的数据,里面包含了变量
-rw-r--r-- 1 root root 1978 Oct 14 11:45 user.csv #微信用户数据
-rw-r--r-- 1 root root 2517 Oct 19 19:28 wechat.xml #tsung压测配置文件
[root@tsung wechat]#
看一下wechat.xml配置文件:
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/local/tsung/share/tsung/tsung-1.0.dtd">
<tsung loglevel="notice" version="1.0">
<clients>
<!--- client 配置tusng的服务器,可以配置多个client达到分布式并发的效果,但是需要配置SSH免登录 -->
<!--- client 配置中的maxusers 指的是tsung产生最大的用户数,更具压测的需要调整 -->
<client host="localhost" use_controller_vm="true" maxusers="100000000" />
</clients>
<servers>
<!--- server 配置被压测的服务器信息 -->
<!--- 如果压测http类型的,host设置为http的域名,不用添加“http://”,如果有URL,也不可再此填写,URL应该在 request 中填写-->
<!--- port 配置的是端口,type配置数据类型 -->
<server host="wechat.qq.com" port="80" type="tcp"></server>
</servers>
<monitoring>
<!--- 监控配置,监控tsung服务器的信息 -->
<monitor host="myserver" type="snmp"></monitor>
</monitoring>
<load>
<!--- load 的配置就是阶段配置,tsung会根据此处的配置产生压力并且持续相应的时间 -->
<!--- 其中 phase 配置是设置阶段编号 duration 配置持续时间数值,unit 配置持续时间单位,一般默认为分钟 -->
<!--- users项配置的是产生的用,这里的arrivalrate表示产生用户数,unit表示时间单位-->
<!--- 以下配置说明:第一阶段每秒钟产生30个用户,并且持续2分钟(可以认为是每秒并发30个) -->
<arrivalphase phase="1" duration="2" unit="minute">
<users arrivalrate="30" unit="second"/>
</arrivalphase>
<arrivalphase phase="2" duration="2" unit="minute">
<users arrivalrate="40" unit="second"/>
</arrivalphase>
<arrivalphase phase="3" duration="2" unit="minute">
<users arrivalrate="50" unit="second"/>
</arrivalphase>
<arrivalphase phase="4" duration="2" unit="minute">
<users arrivalrate="60" unit="second"/>
</arrivalphase>
<arrivalphase phase="5" duration="2" unit="minute">
<users arrivalrate="70" unit="second"/>
</arrivalphase>
</load>
<options>
<!--- options 配置选项资源,具体类型请查看说明文档
以下的一个option配置是设置以文件为数据源,可以供变量调用,在下面的sessions会用到
以下的一个option中,id是设置这个option的ID,在sessions中通过这个id来访问此option,value配置数据文件的路径 -->
<option name="file_server" id='fromusernamedb' value="/root/wechat/user.csv" />
<!--- 下面这个option配置了模拟何种那个浏览器访问,如果没有其他要求,一般默认就可以了
值得注意的是probability配置,这个配置是指定百分比,产生压力的百分之多少使用这个模拟浏览器配置 -->
<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>
<!--- sessions 配置是用来实际的访问的,但是如果需要变量来替换,那么需要提前定义好,变量是用 %%_name%%方式来引用 -->
<session name="http-example" probability="100" type="ts_http">
<!--- setdynvars 用来定义一个变量,下面配置意思是:设置变量名name为valuestring,设置变量产生的类型为random_string随机字符串,设置产生的长度length为20个字符 -->
<setdynvars sourcetype="random_string" length="20">
<var name="valuestring"/>
</setdynvars>
<!--- 下面的配置意思是:设置变量名name为ids,设置变量产生类型为random_number随机数,设置产生随机数起始值start为1000000000,置产生随机数结束值end为9999999999
值得注意的是,随机数产生的范围是1000000000-9999999999 并且起始值不能大于结束值-->
<setdynvars sourcetype="random_number" start="1000000000" end="9999999999">
<var name="ids"/>
</setdynvars>
<!--- 以下配置引用了option中的一个配置id为fromusernamedb的配置
sourcetype 配置类型 fileid引用option中的配置 delimiter 配置分隔符 order配置引用顺序
以下配置意思是:应用option中的file_sever配置,以";"为分隔符分割每一行,
第一个分隔符设置变量名为fromusername1,第二个为fromusername,第三个为fromusername3,并且按照顺序赋值-->
<setdynvars sourcetype="file" fileid="fromusernamedb" delimiter=";" order="iter">
<var name="fromusername1" />
<var name="fromusername" />
<var name="fromusername3" />
</setdynvars>
<!--- 以上配置中,经过我们的实际使用,第一个变量和第二个变量都不能被正确的访问,只有第二个变量才可以,请将需要的比那里放在中间以便于正确访问。 -->
<!--- tsung是基于erlang开发的,变量也可以通过erlang代码来产生。
在下面的一个代码中,设置变量为times ,值为压测机当前时间戳 -->
<setdynvars sourcetype="eval" code='fun({Pid,DynVars})->
{M, S, _} = os:timestamp(),
M * 1000000 + S end.'>
<var name="times"/>
</setdynvars>
<!--- 在下面的一个代码中,设置变量为localtimes,值为压测机当前时间,时间已经格式化 -->
<setdynvars sourcetype="eval" code='fun({Pid,DynVars})->
{{Year, Month, Day}, {Hour, Minite, Second}} = calendar:local_time(),
integer_to_list(Hour)++":"++integer_to_list(Minite)++":"++integer_to_list(Second) end.'>
<var name="localtimes"/>
</setdynvars>
<!--- transaction 是tsung的一个事物,name配置为事务名称,会在tsung的报告中体现,
在一个事物中可以有多个请求 -->
<transaction name="influxdb_post">
<!--- request 是tsung中的一个请求,也是实际发起的访问
subst配置是否引用变量,如果此项配置不是ture,那么上面设置好的变量将不能被引用
http 项中的 url是配置url的地址,请求的时候会和之前servers配置中的host配置进行组装然后访问。
method配置访问的方法,比如post、get
contents_from_file 配置了post的数据来源于此路径,如果post数据需要引用变量,那么可以直接使用%%_name%%来引用
http_header 配置头部信息
具体详细配置请查看官方说明 -->
<request subst="true">
<http url="/wechat/wx5a60ac5b81934701/server" method="POST" contents_from_file="/root/wechat/post.txt">
<http_header name="Content-Type" value="text/xml"/>
</http>
</request>
</transaction>
</session>
</sessions>
</tsung>
以下是user.csv文件内容和结构:
abc;oJ6m2wMf6G3moRqZ_jqwE5-YWDeU;12313;
abc;oJ6m2wFe3QdhOKDp0VJAGRPp7jcs;12314;
abc;oJ6m2wIY-3YVkQ1-PfYfIVH-cgLE;12315;
abc;oJ6m2wC2puvh3LRmjVhCHiQRVXlQ;12316;
abc;oJ6m2wGYRxaU-PgeGPuosUvh8UF4;12317;
abc;oJ6m2wBUe0s828upQwuq9ubHP8OI;12318;
abc;oJ6m2wNhc0l6fX6m2Tgs7tGgV_30;12319;
abc;oJ6m2wGKGPAWVrvyjtSh39Stp6rY;12320;
abc;oJ6m2wGG6lLNcUUyMkoj9CQX2WhE;12321;
abc;oJ6m2wHcMD7CYtB3OyynmFqjJYwE;12322;
以下是post.txt文件的内容和结构
<xml><ToUserName><![CDATA[gh_741756215shgh]]></ToUserName><FromUserName><![CDATA[%%_fromusername%%]]></FromUserName><CreateTime>%%_times%%</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[201ghbjhjhY-%%_ids%%-%%_localtimes%%]]></Content><MsgId>%%_times%%%%_ids%%</MsgId></xml>
tsung测试HTTP服务器时,GET或POST方法有时需配置参数。
这里只颜色固定参数情况
GET:
<http url=’http://www.csdn.com/develop/c-develop/pbk1340.html?var=3&b=4′ method=’GET’ />
注意,如果多个变量连接必须用实体& 而不是单独的 ‘&‘
POST:
<http url=’http://www.paobuke.com/develop/c-develop/pbk1340.html method=’POST’ contents=’username=pao&pass=buke’/>
注意:post方法中不需要写实体,直接用‘&‘
我的博客即将同步至 OSCHINA 社区,这是我的 OSCHINA ID:LINUXOPS,邀请大家一同入驻:https://www.oschina.net/sharing-plan/apply