tsung 压力测试

date: 2017-06-27 09:11:14

安装

安装 erlang 环境:

	apt install erlang

安装 gnuplot:

	apt install gnuplot       # tsung_stats.pl 需要用到的 gnuplot

安装 tsung(http://tsung.erlang-projects.org/dist/):

	wget http://tsung.erlang-projects.org/dist/tsung-1.6.0.tar.gz
	tar -zxf tsung-1.6.0.tar.gz
	cd tsung-1.6.0
	./configure		# 配置,生成 Makefile 文件
	make -j4
	make install

下载并安装perl Template,用于生成报告模版:

	wget http://cpan.org/modules/by-module/Template/Template-Toolkit-2.24.tar.gz
	tar -zxvf Template-Toolkit-2.24.tar.gz  
	cd Template-Toolkit-2.24 
	perl Makefile.PL
	make  
	make test
	make install

说明

示例文件:

	/root/tsung-1.6.0/examples

拷贝示例:

	mkdir /root/http_simple
	cd /root/http_simple
	cp /root/tsung-1.6.0/examples/examples/http_simple.xml ./

测试:
tsung -f http_simple.xml start # 默认使用 ~/.tsung/tsung.xml, 可指定

查看实时记录:

	tail -f ~/.tsung/log/20170627-0908/tsung.log

生成报表:

	/usr/lib/tsung/bin/tsung_stats.pl --stats ~/.tsung/log/20170627-0908/tsung.log
	# http_simple 目录下生成3个目录和1个 log 文件,其中 images 目录下就是报表图片

配置文件

clients:

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

tsung运行时可以由很多的虚拟机组成,client配置指明这个client机器上最多生成的用户数,如果use_controller_vm为true的话,那么当用户数达到maxusers,tsung会自动生成新的VM。

servers:

	<servers>
		<server host="api.evcos.wm-motor.com" port="80" type="tcp"></server>
	</servers>

也可以配置成集群:

	<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

https:

	<servers>
		<server host=”web_server_name” port=”443″ type=”ssl“></server>
	</servers>

https://jackiechen.org/2015/12/04/use-tsung-to-test-https-site/

monitoring

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

系统监控服务,配置完后可获取被测server的cpu,内存,负载,数据库的相关信息。可以配置成erlang的监控服务和snmp的监控服务。

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。

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>

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里被定义,要求每个session的probability之和是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的具体信息。

生成报告

	/usr/lib/tsung/bin/tsung_stats.pl --stats /root/.tsung/log/20170627-1144/tsung.log

查看报告

	report.html

注意

tsung测试HTTP服务器时,GET或POST方法有时需配置参数。
参数固定的情况:

GET:
<http url='http://www.xxx/v1/xxx?var=3&amp;b=4' method='GET'/>
注意,如果多个变量连接必须用实体&amp; 而不是单独的 '&'
POST:
<http url='http://www.xxx/v1/xxx' method='POST' contents='username=admin&passwd=123456'/>
注意:post方法中不需要写实体,直接用'&'

文档:
Tsung 1.6.0 documentation
Load Testing using Tsung
Test the Performance and Scalability of Your Web Applications With Tsung
压力测试工具tsung用法简介