分布式压力测试框架TSUNG测试HTTP协议详解
分布式压力测试框架TSUNG测试HTTP协议详解
分布式压力测试框架TSUNG测试HTTP协议详解
2016-04-08 LIANG01.MA 平台与架构测试之道
TSUNG用于多种协议压测
特点:
1. 高性能,支持虚拟100万的轻量级进程。
2. 可用于测试多种协议:目前可以用来测试HTTP, WebDAV, SOAP, PostgreSQL, MySQL, LDAP, and Jabber/XMPP等。
3. 模拟真实用户,利用os IP别名技术在单个机器上使用多个IP。
4. 模式真实流量,支持虚拟用户发呆时间以及随机的概率分布。
5. 提供服务器监控能力
6. 多节点集群能力,能够利用多台机器制造更高的并发,并提供分布式系统的容错能力、保证数据一致性。
安装和配置:(略,百度一堆)
这里简要介绍TSUNG一些关键设置。
<?xml version="1.0" encoding="ISO-8859-1"?>
这里可以设置编码,默认是utf-8.
<tsung loglevel="debug" dumptraffic="true" version="1.0">
这里设置日志级别,会影响到tsung的性能。级别有下面几个:
emergency
critical
error
warning
notice (default)
info
debug
官方推荐高负载时候使用warning级别。
Dumptraffic选项是设置为”true”,所有通信都详细记录到日志文件,这会严重影响tsung性能,一般是调试的时候使用。也可以使用 dumptraffic="light" ,这样会只记录前面44个字节的内容。
<clients>
<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>
这里是配置虚拟IP,可以用来测试负载均衡的集群构架。这里是一个tsung集群。第一部测试服务器虚拟两个IP,权重是1。产生的最大用户数为800。
第二部服务器权重是3,产生的最大用户数是600。使用两个CPU,这里最好设置每个CPU对应一个erlang的虚拟机。
这里的权重意思是说:第一步服务器执行一次用户操作,第二部服务器执行三次。而这里第二部用两个CPU,也就是说每个CPU的权重是1.5.
LINUX下单进程开启超过1024个套接字限制,我们设置Maxusers这个参数后,如果测试时候单进程模拟的用户使用的socket超过这个限制,那么TSUNG就启动启动一部erlang虚拟机来继续处理这批用户。当然,socket在linux看来也是一个文件,而每个CPU能打开的文件数目是有限制的,如果Maxusers设置太大,报错too many open files,那么这个时候就需要设置一下 ulimit –n
<servers>
<server host="sso.gleasy.cn" port="8082" type="tcp"></server>
</servers>
这里设置服务器入口,如果配置多个server,那么请求会轮询分配到这几个服务器上。
<options>
<option name="file_server" id='userdb' value="user_list.csv"/>
<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>
第一个option这里设置读取user_list.csv这个文件里面的用户名和密码,id设置为userdb.
第二个option这里设置浏览器的agent,可以按照自己的需要,配置对于的agent和出现的比率。
<monitoring>
<monitor host="geronimo" type="erlang"></monitor>
<monitor host="bigfoot-1" type="erlang"></monitor>
<monitor host="bigfoot-2" type="erlang"></monitor>
<monitor host="f14-1" type="erlang"></monitor>
<monitor host="f14-2" type="erlang"></monitor>
<monitor host="db" type="erlang"></monitor>
</monitoring>
Monitor是用来获取远程服务器后台资源使用信息的。包括CPU,LOAD负载和内存使用等。需要远程服务器安装了相同版本的erlang。并且远程端口必须可访问。最好是没有防火墙。当然也可以使用其它手段获取远程服务器后台性能信息,比如配置SNMP或Munin。
<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>
这里可以设置压力产生的各个阶段,上面这段例子表示:第一阶段,持续10分钟,每两秒创建一个新用户;第二阶段,持续10分钟,每一秒产生一个新用户;第三阶段,持续1分钟,每0.1秒产生一个新用户。当然,也可以通过这样定义<user session="http-example" start_time="185" unit="second"></user>来指定每个阶段使用的session。
当所有用户执行完各自分配到的session 后【session就是后面定义的用户行为】,程序退出,本次压测结束。如果想在指定的时间点结束不去等待所有session完成,可以这样设置<load duration="1" unit="hour">。这样的话,1个钟头后,不管是否所有session执行完,都会结束本次测试。
下面是官网一个session的例子:
<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>
<session name="http-example" probability="70" type="ts_http">
这里是定义下面的session名为http-example,并且用户随机分配到该session的概率是70%,类似是HTTP。
<request> <http url="/" method="GET" version="1.1"></http> </request>
这里定义http请求,支持GET,POST这些用户行为。
<thinktime value="20"></thinktime>
<thinktime value="20" random="true"></thinktime>
<thinktime min="2" max="10" random="true"></thinktime>
这里是session的思考时间,第一个思考时间是20秒。第二个思考时间是按指数分布,平均值是20秒。第三个思考时间是随机在2到10范围内的值。
<setdynvars sourcetype="file" fileid="userdb" delimiter=";" order="iter">
<var name="user" />
<var name="user_password" />
</setdynvars>
之前在配置option的时候定义过打开user_list.csv这个数据文件,并且命名为uesrdb,上面这一段是在SESSION里面使用这个数据文件。定义变量user和user_password。
CSV文件的内容格式如下:
user_1;123456;
user_2;123456;
user_3;123456;
…
下面是明月用的一个简单的登录压测样本,协议是HTTP:
<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/local/share/tsung/tsung-1.0.dtd">
<tsung loglevel="debug" dumptraffic="true" version="1.0">
<clients>
<client host="localhost" weight="1" maxusers="10000" use_controller_vm="true"/>
</clients>
<servers>
<server host="sso.gleasy.cn" port="8082" type="tcp"></server>
</servers>
<monitoring>
<monitor host="localhost" type="erlang"/>
</monitoring>
<load>
<arrivalphase phase="1" duration="1" unit="minute">
<users maxnumber="100" interarrival="0.1" unit="second"/>
</arrivalphase>
</load>
<options>
<option name="file_server" id='userdb' value="user_list.csv"/>
<option type="ts_http" name="user_agent">
<user_agent probability="100">
Some browser version 42
</user_agent>
</option>
</options>
<sessions>
<session name="http_test_1" probability="100" type="ts_http">
<setdynvars sourcetype="file" fileid="userdb" delimiter=";" order="iter">
<var name="user" />
<var name="user_password" />
</setdynvars>
<thinktime min="2" max="4"></thinktime>
<request subst="true">
<http url="http://sso.gleasy.cn:8082/auth/gclientLogin?account=%%_user%%&psd=%%_user_password%%&type=os" method="GET" version="1.1"/>
</request>
<thinktime value="5" random="true"/>
<for from="1" to="10" incr="1" var="counter">
<request subst="true">
<http url="http://sso.gleasy.cn:8082/auth/beatheart/check" method="GET" version="1.1"/>
</request>
<thinktime value="3" />
</for>
</session>
</sessions>
</tsung>
???企企csvcsvcsvcsvcsvcsv
Copyright © 启程