TSUNG测试HTTP协议详解和实例【原创】

时间:2021-02-08 11:34:20

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&amp;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%%&amp;psd=%%_user_password%%&amp;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>

 

 
用TSUNG来测试XMPP协议是个不错的选择,写个自动应答的机器人,就可以测试openfire这里即时通讯平台了。这方面的测试方法明月正在整理。