tsung--开源多协议分布式压力测试工具 .



tsung--开源多协议分布式压力测试工具 .

tsung:开源、多协议、分布式的压力测试工具

tsung index:http://tsung.erlang-projects.org/index.en.html

tsung user's manual:http://tsung.erlang-projects.org/user_manual.html

主要特性

1、高性能:tsung能在每台物理机器上模拟大量同步用户,在单个cup上模拟大量用户

2、分布式:在集群里实现负载分布式

3、多协议:支持HTTP,WebDAV,Jabber/XMPP,PostgreSQL,他们在tsung里作为一个插件系统使用,1.3版本支持LDAP和MySQL插件

4、SSL支持

5、多IP:通过系统底层的IP别名实现在单个机器上使用多个IP地址
6、系统监控:在远程服务器通过erlang代理或SNMP实现系统监控(CUP,内存,网络流量)
7、XML配置:使用XML配置实现用户复杂使用场景
8、动态脚本:可以获取动态数据来注入到后面的请求中
9、混合行为:使用相同的标准通过多个会话来模拟不同类型的用户,你可以在标准脚本里指定不同行为的比例

开发版下载
git clone git://git.process-one.net/tsung/mainline.git

默认加载配置:~/.tsung/tsung.xml
日志文件保存目录:~/.tsung/log/
tsung命令用法查看:tsung -h
启动tsung典型方式:tsung -f myconfigfile.xml start

tsung的录音功能
tsung 采用了巧妙的 proxy 方式来“录制”测试脚本。具体来说,就是建立一个本机的 http proxy 默认
使用 8090 端口,在配好 firefox 使用 localhost 8090 作为代理之后,所有“流经”这个 proxy 的
http 动作都会被记录下来,测试时可以“回放”这些步骤来产生请求
支持HTTP,WebDAV和PostgreSQL
录音启动:tsung-recorder -p <PLUGIN> start
PLUGIN可选值:http、webdav、pgsql,默认http
录音监听端口:8090,修改端口:使用 -L portnumber
终止录音:tsung-recorder stop 

tsung测试脚本详解

[html]  view plain copy
  1. <?xml version="1.0">  
  2. <!DOCTYPE tsung SYSTEM "/usr/local/share/tsung/tsung-1.0.dtd">  
  3. <tsung loglevel="debug" version="1.0" dumptraffic="protocol">  
  4.   
  5.         <clients>  
  6.                 <client host="localhost" cpu="2"  >  
  7.                         <ip value="192.168.51.81"></ip>  
  8.                 </client>  
  9.         </clients>  
  10.   
  11.         <servers>  
  12.                 <server host="192.168.51.81" port="9999" type="tcp"></server>  
  13.         </servers>  
  14.   
  15.         <monitoring>  
  16.                 <monitor host="xenvmhost131" type="munin"></monitor>  
  17.         </monitoring>  
  18.   
  19.         <load>  
  20.                 <arrivalphase phase="1" duration="5" unit="minute">  
  21.                          <users arrivalrate="2" unit="second"></users>  
  22.                 </arrivalphase>  
  23.         </load>  
  24.   
  25.         <options>  
  26.                 <option type="ts_http" name="user_agent">  
  27.                         <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>  
  28.                         <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>  
  29.                 </option>  
  30.                 <option name="file_server" id="apiPostContent" value="/usr/local/tsung-1.4.2/examples/apiPostContent.csv"/>  
  31.         </options>  
  32.   
  33.         <sessions>  
  34.                 <session name='order' probability='100'  type='ts_http'>  
  35.                         <setdynvars sourcetype="file" fileid="apiPostContent" delimiter="^_^"  order="random">  
  36.                <var name="data" />  
  37.                         </setdynvars>  
  38.   
  39.                         <request subst="true">  
  40.                                 <http url='/api' version='1.1' contents='%%_data%%' content_type='application/x-www-form-urlencoded; charset=UTF-8' method='POST'>  
  41.                                 <http_header name="Accept-Encoding" value="gzip,deflate"/></http>  
  42.                         </request>  
  43.                 </session>  
  44.         </sessions>  
  45. </tsung>  
[html]  view plain  copy
  1. <?xml version="1.0">  
  2. <!DOCTYPE tsung SYSTEM "/usr/local/share/tsung/tsung-1.0.dtd">  
  3. <tsung loglevel="debug" version="1.0" dumptraffic="protocol">  
  4.   
  5.         <clients>  
  6.                 <client host="localhost" cpu="2"  >  
  7.                         <ip value="192.168.51.81"></ip>  
  8.                 </client>  
  9.         </clients>  
  10.   
  11.         <servers>  
  12.                 <server host="192.168.51.81" port="9999" type="tcp"></server>  
  13.         </servers>  
  14.   
  15.         <monitoring>  
  16.                 <monitor host="xenvmhost131" type="munin"></monitor>  
  17.         </monitoring>  
  18.   
  19.         <load>  
  20.                 <arrivalphase phase="1" duration="5" unit="minute">  
  21.                          <users arrivalrate="2" unit="second"></users>  
  22.                 </arrivalphase>  
  23.         </load>  
  24.   
  25.         <options>  
  26.                 <option type="ts_http" name="user_agent">  
  27.                         <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>  
  28.                         <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>  
  29.                 </option>  
  30.                 <option name="file_server" id="apiPostContent" value="/usr/local/tsung-1.4.2/examples/apiPostContent.csv"/>  
  31.         </options>  
  32.   
  33.         <sessions>  
  34.                 <session name='order' probability='100'  type='ts_http'>  
  35.                         <setdynvars sourcetype="file" fileid="apiPostContent" delimiter="^_^"  order="random">  
  36.                <var name="data" />  
  37.                         </setdynvars>  
  38.   
  39.                         <request subst="true">  
  40.                                 <http url='/api' version='1.1' contents='%%_data%%' content_type='application/x-www-form-urlencoded; charset=UTF-8' method='POST'>  
  41.                                 <http_header name="Accept-Encoding" value="gzip,deflate"/></http>  
  42.                         </request>  
  43.                 </session>  
  44.         </sessions>  
  45. </tsung>  


[html]  view plain copy
  1. <?xml version="1.0">  
[html]  view plain  copy
  1. <?xml version="1.0">  

默认编码是utf-8

[html]  view plain copy
  1. <tsung loglevel="debug" version="1.0" dumptraffic="protocol">  
[html]  view plain  copy
  1. <tsung loglevel="debug" version="1.0" dumptraffic="protocol">  

loglevel表示日志等级,可选值:emergency、critical、error、warning、notice(default)、info、debug

如果添加了dumptraffic=“true”属性,则开启流量日志,所有通信信息都会保存到文件中,tsung会很慢,所以除了debug时建议不要开启,默认关闭

1.4版本还增加了dumptraffic="protocol"来记录对应的协议通信,只支持HTTP,你可以查看对应测试通信日志如~/.tsung/log/yyyyMMdd-HHmm/tsung.dump

[html]  view plain copy
  1. <clients>  
  2.                 <client host="localhost" cpu="2"  >  
  3.                         <ip value="192.168.51.81"></ip>  
  4.                 </client>  
  5.  </clients>  
[html]  view plain  copy
  1. <clients>  
  2.                 <client host="localhost" cpu="2"  >  
  3.                         <ip value="192.168.51.81"></ip>  
  4.                 </client>  
  5.  </clients>  
集群Client设置

clients:用户产生的方式

基本设置:在相同的HOST和erlang虚拟机上启动节点

<client host="localhost" use_controller_vm="true"/>

 高级设置:

<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>
weight:决定一个节点上用户的比例

maxusers:决定一个节点能够支持的最大虚拟用户数,默认800

ip:IP别名技术产生多个虚拟IP模拟多个机器,1.1.1版本IP不必强制指定,将使用默认IP,1.4版本可以使用<ip scan="yes" value="eth0" />来扫描IP别名

cpu:每个cpu都会产生一个erlang虚拟机用来发挥多CPU的优势

use_controller_vm:当达到机器最大用户数时是否启动新的erlang虚拟机

<servers>
  <server host="10.9.195.1" port="8080" type="tcp"></server>
</servers>
集群server配置

servers:被测试的服务器

type:协议类型如tcp、udp

[html]  view plain copy
  1. <monitoring>  
  2.                 <monitor host="xenvmhost131" type="munin"></monitor>  
  3. </monitoring>  
[html]  view plain  copy
  1. <monitoring>  
  2.                 <monitor host="xenvmhost131" type="munin"></monitor>  
  3. </monitoring>  
系统监控配置

type:默认使用erlang通信来获取服务器上的统计数据,可选值:erlang、snmp、munin


[html]  view plain copy
  1. <load>  
  2.                 <arrivalphase phase="1" duration="5" unit="minute">  
  3.                          <users arrivalrate="2" unit="second"></users>  
  4.                 </arrivalphase>  
  5. </load>  
[html]  view plain  copy
  1. <load>  
  2.                 <arrivalphase phase="1" duration="5" unit="minute">  
  3.                          <users arrivalrate="2" unit="second"></users>  
  4.                 </arrivalphase>  
  5. </load>  
压力配置:

arrivalphase:到达阶段,可以有多个阶段来组合压力场景

phase:阶段号,多个到达阶段时,系统会依次按阶段号执行

duration:持续时间

unit:持续时间单位,可选值:minute、hour、day

users:虚拟用户产生频率

arrivalrate:时间单位内产生多少个用户,如arrivalrate=2,unit=second表示每秒产生2个用户

interarrival:多少单位时间内产生一个用户,如interarrival=2,unit=second表示每2秒产生1个用户,不要和arrivalrate同时存在

如果你想限制阶段内产生的用户数量,可以用maxnumber来限定用户数,如maxnumber="200"


[html]  view plain copy
  1. <options>  
  2.                 <option type="ts_http" name="user_agent">  
  3.                         <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>  
  4.                         <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>  
  5.                 </option>  
  6.                 <option name="file_server" id="apiPostContent" value="/usr/local/tsung-1.4.2/examples/apiPostContent.csv"/>  
  7. </options>  
[html]  view plain  copy
  1. <options>  
  2.                 <option type="ts_http" name="user_agent">  
  3.                         <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>  
  4.                         <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>  
  5.                 </option>  
  6.                 <option name="file_server" id="apiPostContent" value="/usr/local/tsung-1.4.2/examples/apiPostContent.csv"/>  
  7. </options>  

options:设置一些默认的全局设置,比如SSL加密算法,TCP/UDP的buffer大小(默认32KB)如下:

<option name="thinktime" value="3" random="false" override="true"/>
  <option name="ssl_ciphers"
           value="EXP1024-RC4-SHA,EDH-RSA-DES-CBC3-SHA"/>
  <option name="tcp_snd_buffer" value="16384"></option>
  <option name="tcp_rcv_buffer" value="16384"></option>
  <option name="udp_snd_buffer" value="16384"></option>
  <option name="udp_rcv_buffer" value="16384"></option>

更多设置可以参看官网手册

type:ts_http,1.1版本开始对于HTTP可以设置用户请求的浏览器信息userAgent,多个user_agent的比重相加必须等于100

name="file_server":1.4版本开始可以读取一个文件,id必须唯一,以便后面的session可以存储或动态生成数据


[html]  view plain copy
  1. <sessions>  
  2.                 <session name='order' probability='100'  type='ts_http'>  
  3.                         ...  
  4.                 </session>  
  5. </sessions>  
[html]  view plain  copy
  1. <sessions>  
  2.                 <session name='order' probability='100'  type='ts_http'>  
  3.                         ...  
  4.                 </session>  
  5. </sessions>  
sessions:用户所产生的会话组

session:单个会话,每个会话组都可以有多个会话,用户根据每个会话的比重来产生相应的会话

name:名称

probability:比重,所有会话加起来必须等于100

type:测试对象类型,可选值ts_http,ts_webdav,ts_pgsql等

[html]  view plain copy
  1. <setdynvars sourcetype="file" fileid="apiPostContent" delimiter="^_^"  order="random">  
  2. <SPAN style="WHITE-SPACE: pre"> </SPAN><var name="data" />  
  3. </setdynvars>  
[html]  view plain  copy
  1. <setdynvars sourcetype="file" fileid="apiPostContent" delimiter="^_^"  order="random">  
  2. <span style="white-space:pre;"> </span><var name="data" />  
  3. </setdynvars>  

setdynvars:变量设置

sourcetype:变量来源类型,file为从文件中读取

fileid:对应的options中的文件操作ID

delimiter:变量分隔符

order:数据产生方式

var:变量名称

该段内容表示从apiPostContent这个文件操作中随机读取数据,以^_^来分隔每行数据,第一个变量命名为data

除了从文件读取,也可以随机生成,如:

<setdynvars sourcetype="random_string" length="13">
        <var name="rndstring1" />
      </setdynvars>

      <setdynvars sourcetype="random_number" start="3" end="32">
        <var name="rndint" />
      </setdynvars>

[html]  view plain copy
  1. <request subst="true">  
  2.         <http url='/api' version='1.1' contents='%%_data%%' content_type='application/x-www-form-urlencoded; charset=UTF-8' method='POST'>  
  3.           <SPAN style="WHITE-SPACE: pre">   </SPAN><http_header name="Accept-Encoding" value="gzip,deflate"/>  
[html]  view plain  copy
  1. <request subst="true">  
  2.         <http url='/api' version='1.1' contents='%%_data%%' content_type='application/x-www-form-urlencoded; charset=UTF-8' method='POST'>  
  3.           <span style="white-space:pre;">   </span><http_header name="Accept-Encoding" value="gzip,deflate"/>  
[html]  view plain copy
  1. <SPAN style="WHITE-SPACE: pre"> </SPAN></http>  
  2. </request>  
[html]  view plain  copy
  1. <span style="white-space:pre;"> </span></http>  
  2. </request>  
request:会话产生的请求

subst:是否动态替换,如果请求中的数据是根据变量动态产生的,则subst属性必须为true,变量引用方式:%%_变量名%%

http:一个http请求

url:请求地址

version:http协议版本

contents:http请求报文内容

content_type:

method:请求方式,可选值:POST、GET

http_header:设置http请求头


启动Tsung完成测试后可以通过安装的lib下的bin目录下tsung_stats.pl来生成报表

/usr/local/lib/tsung/bin/tsung_stats.pl

tsung--开源多协议分布式压力测试工具 .

tsung:开源、多协议、分布式的压力测试工具

tsung index:http://tsung.erlang-projects.org/index.en.html

tsung user's manual:http://tsung.erlang-projects.org/user_manual.html

主要特性

1、高性能:tsung能在每台物理机器上模拟大量同步用户,在单个cup上模拟大量用户

2、分布式:在集群里实现负载分布式

3、多协议:支持HTTP,WebDAV,Jabber/XMPP,PostgreSQL,他们在tsung里作为一个插件系统使用,1.3版本支持LDAP和MySQL插件

4、SSL支持

5、多IP:通过系统底层的IP别名实现在单个机器上使用多个IP地址
6、系统监控:在远程服务器通过erlang代理或SNMP实现系统监控(CUP,内存,网络流量)
7、XML配置:使用XML配置实现用户复杂使用场景
8、动态脚本:可以获取动态数据来注入到后面的请求中
9、混合行为:使用相同的标准通过多个会话来模拟不同类型的用户,你可以在标准脚本里指定不同行为的比例

开发版下载
git clone git://git.process-one.net/tsung/mainline.git

默认加载配置:~/.tsung/tsung.xml
日志文件保存目录:~/.tsung/log/
tsung命令用法查看:tsung -h
启动tsung典型方式:tsung -f myconfigfile.xml start

tsung的录音功能
tsung 采用了巧妙的 proxy 方式来“录制”测试脚本。具体来说,就是建立一个本机的 http proxy 默认
使用 8090 端口,在配好 firefox 使用 localhost 8090 作为代理之后,所有“流经”这个 proxy 的
http 动作都会被记录下来,测试时可以“回放”这些步骤来产生请求
支持HTTP,WebDAV和PostgreSQL
录音启动:tsung-recorder -p <PLUGIN> start
PLUGIN可选值:http、webdav、pgsql,默认http
录音监听端口:8090,修改端口:使用 -L portnumber
终止录音:tsung-recorder stop 

tsung测试脚本详解

[html]  view plain copy
  1. <?xml version="1.0">  
  2. <!DOCTYPE tsung SYSTEM "/usr/local/share/tsung/tsung-1.0.dtd">  
  3. <tsung loglevel="debug" version="1.0" dumptraffic="protocol">  
  4.   
  5.         <clients>  
  6.                 <client host="localhost" cpu="2"  >  
  7.                         <ip value="192.168.51.81"></ip>  
  8.                 </client>  
  9.         </clients>  
  10.   
  11.         <servers>  
  12.                 <server host="192.168.51.81" port="9999" type="tcp"></server>  
  13.         </servers>  
  14.   
  15.         <monitoring>  
  16.                 <monitor host="xenvmhost131" type="munin"></monitor>  
  17.         </monitoring>  
  18.   
  19.         <load>  
  20.                 <arrivalphase phase="1" duration="5" unit="minute">  
  21.                          <users arrivalrate="2" unit="second"></users>  
  22.                 </arrivalphase>  
  23.         </load>  
  24.   
  25.         <options>  
  26.                 <option type="ts_http" name="user_agent">  
  27.                         <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>  
  28.                         <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>  
  29.                 </option>  
  30.                 <option name="file_server" id="apiPostContent" value="/usr/local/tsung-1.4.2/examples/apiPostContent.csv"/>  
  31.         </options>  
  32.   
  33.         <sessions>  
  34.                 <session name='order' probability='100'  type='ts_http'>  
  35.                         <setdynvars sourcetype="file" fileid="apiPostContent" delimiter="^_^"  order="random">  
  36.                <var name="data" />  
  37.                         </setdynvars>  
  38.   
  39.                         <request subst="true">  
  40.                                 <http url='/api' version='1.1' contents='%%_data%%' content_type='application/x-www-form-urlencoded; charset=UTF-8' method='POST'>  
  41.                                 <http_header name="Accept-Encoding" value="gzip,deflate"/></http>  
  42.                         </request>  
  43.                 </session>  
  44.         </sessions>  
  45. </tsung>  
[html]  view plain  copy
  1. <?xml version="1.0">  
  2. <!DOCTYPE tsung SYSTEM "/usr/local/share/tsung/tsung-1.0.dtd">  
  3. <tsung loglevel="debug" version="1.0" dumptraffic="protocol">  
  4.   
  5.         <clients>  
  6.                 <client host="localhost" cpu="2"  >  
  7.                         <ip value="192.168.51.81"></ip>  
  8.                 </client>  
  9.         </clients>  
  10.   
  11.         <servers>  
  12.                 <server host="192.168.51.81" port="9999" type="tcp"></server>  
  13.         </servers>  
  14.   
  15.         <monitoring>  
  16.                 <monitor host="xenvmhost131" type="munin"></monitor>  
  17.         </monitoring>  
  18.   
  19.         <load>  
  20.                 <arrivalphase phase="1" duration="5" unit="minute">  
  21.                          <users arrivalrate="2" unit="second"></users>  
  22.                 </arrivalphase>  
  23.         </load>  
  24.   
  25.         <options>  
  26.                 <option type="ts_http" name="user_agent">  
  27.                         <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>  
  28.                         <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>  
  29.                 </option>  
  30.                 <option name="file_server" id="apiPostContent" value="/usr/local/tsung-1.4.2/examples/apiPostContent.csv"/>  
  31.         </options>  
  32.   
  33.         <sessions>  
  34.                 <session name='order' probability='100'  type='ts_http'>  
  35.                         <setdynvars sourcetype="file" fileid="apiPostContent" delimiter="^_^"  order="random">  
  36.                <var name="data" />  
  37.                         </setdynvars>  
  38.   
  39.                         <request subst="true">  
  40.                                 <http url='/api' version='1.1' contents='%%_data%%' content_type='application/x-www-form-urlencoded; charset=UTF-8' method='POST'>  
  41.                                 <http_header name="Accept-Encoding" value="gzip,deflate"/></http>  
  42.                         </request>  
  43.                 </session>  
  44.         </sessions>  
  45. </tsung>  


[html]  view plain copy
  1. <?xml version="1.0">  
[html]  view plain  copy
  1. <?xml version="1.0">  

默认编码是utf-8

[html]  view plain copy
  1. <tsung loglevel="debug" version="1.0" dumptraffic="protocol">  
[html]  view plain  copy
  1. <tsung loglevel="debug" version="1.0" dumptraffic="protocol">  

loglevel表示日志等级,可选值:emergency、critical、error、warning、notice(default)、info、debug

如果添加了dumptraffic=“true”属性,则开启流量日志,所有通信信息都会保存到文件中,tsung会很慢,所以除了debug时建议不要开启,默认关闭

1.4版本还增加了dumptraffic="protocol"来记录对应的协议通信,只支持HTTP,你可以查看对应测试通信日志如~/.tsung/log/yyyyMMdd-HHmm/tsung.dump

[html]  view plain copy
  1. <clients>  
  2.                 <client host="localhost" cpu="2"  >  
  3.                         <ip value="192.168.51.81"></ip>  
  4.                 </client>  
  5.  </clients>  
[html]  view plain  copy
  1. <clients>  
  2.                 <client host="localhost" cpu="2"  >  
  3.                         <ip value="192.168.51.81"></ip>  
  4.                 </client>  
  5.  </clients>  
集群Client设置

clients:用户产生的方式

基本设置:在相同的HOST和erlang虚拟机上启动节点

<client host="localhost" use_controller_vm="true"/>

 高级设置:

<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>
weight:决定一个节点上用户的比例

maxusers:决定一个节点能够支持的最大虚拟用户数,默认800

ip:IP别名技术产生多个虚拟IP模拟多个机器,1.1.1版本IP不必强制指定,将使用默认IP,1.4版本可以使用<ip scan="yes" value="eth0" />来扫描IP别名

cpu:每个cpu都会产生一个erlang虚拟机用来发挥多CPU的优势

use_controller_vm:当达到机器最大用户数时是否启动新的erlang虚拟机

<servers>
  <server host="10.9.195.1" port="8080" type="tcp"></server>
</servers>
集群server配置

servers:被测试的服务器

type:协议类型如tcp、udp

[html]  view plain copy
  1. <monitoring>  
  2.                 <monitor host="xenvmhost131" type="munin"></monitor>  
  3. </monitoring>  
[html]  view plain  copy
  1. <monitoring>  
  2.                 <monitor host="xenvmhost131" type="munin"></monitor>  
  3. </monitoring>  
系统监控配置

type:默认使用erlang通信来获取服务器上的统计数据,可选值:erlang、snmp、munin


[html]  view plain copy
  1. <load>  
  2.                 <arrivalphase phase="1" duration="5" unit="minute">  
  3.                          <users arrivalrate="2" unit="second"></users>  
  4.                 </arrivalphase>  
  5. </load>  
[html]  view plain  copy
  1. <load>  
  2.                 <arrivalphase phase="1" duration="5" unit="minute">  
  3.                          <users arrivalrate="2" unit="second"></users>  
  4.                 </arrivalphase>  
  5. </load>  
压力配置:

arrivalphase:到达阶段,可以有多个阶段来组合压力场景

phase:阶段号,多个到达阶段时,系统会依次按阶段号执行

duration:持续时间

unit:持续时间单位,可选值:minute、hour、day

users:虚拟用户产生频率

arrivalrate:时间单位内产生多少个用户,如arrivalrate=2,unit=second表示每秒产生2个用户

interarrival:多少单位时间内产生一个用户,如interarrival=2,unit=second表示每2秒产生1个用户,不要和arrivalrate同时存在

如果你想限制阶段内产生的用户数量,可以用maxnumber来限定用户数,如maxnumber="200"


[html]  view plain copy
  1. <options>  
  2.                 <option type="ts_http" name="user_agent">  
  3.                         <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>  
  4.                         <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>  
  5.                 </option>  
  6.                 <option name="file_server" id="apiPostContent" value="/usr/local/tsung-1.4.2/examples/apiPostContent.csv"/>  
  7. </options>  
[html]  view plain  copy
  1. <options>  
  2.                 <option type="ts_http" name="user_agent">  
  3.                         <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>  
  4.                         <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>  
  5.                 </option>  
  6.                 <option name="file_server" id="apiPostContent" value="/usr/local/tsung-1.4.2/examples/apiPostContent.csv"/>  
  7. </options>  

options:设置一些默认的全局设置,比如SSL加密算法,TCP/UDP的buffer大小(默认32KB)如下:

<option name="thinktime" value="3" random="false" override="true"/>
  <option name="ssl_ciphers"
           value="EXP1024-RC4-SHA,EDH-RSA-DES-CBC3-SHA"/>
  <option name="tcp_snd_buffer" value="16384"></option>
  <option name="tcp_rcv_buffer" value="16384"></option>
  <option name="udp_snd_buffer" value="16384"></option>
  <option name="udp_rcv_buffer" value="16384"></option>

更多设置可以参看官网手册

type:ts_http,1.1版本开始对于HTTP可以设置用户请求的浏览器信息userAgent,多个user_agent的比重相加必须等于100

name="file_server":1.4版本开始可以读取一个文件,id必须唯一,以便后面的session可以存储或动态生成数据


[html]  view plain copy
  1. <sessions>  
  2.                 <session name='order' probability='100'  type='ts_http'>  
  3.                         ...  
  4.                 </session>  
  5. </sessions>  
[html]  view plain  copy
  1. <sessions>  
  2.                 <session name='order' probability='100'  type='ts_http'>  
  3.                         ...  
  4.                 </session>  
  5. </sessions>  
sessions:用户所产生的会话组

session:单个会话,每个会话组都可以有多个会话,用户根据每个会话的比重来产生相应的会话

name:名称

probability:比重,所有会话加起来必须等于100

type:测试对象类型,可选值ts_http,ts_webdav,ts_pgsql等

[html]  view plain copy
  1. <setdynvars sourcetype="file" fileid="apiPostContent" delimiter="^_^"  order="random">  
  2. <SPAN style="WHITE-SPACE: pre"> </SPAN><var name="data" />  
  3. </setdynvars>  
[html]  view plain  copy
  1. <setdynvars sourcetype="file" fileid="apiPostContent" delimiter="^_^"  order="random">  
  2. <span style="white-space:pre;"> </span><var name="data" />  
  3. </setdynvars>  

setdynvars:变量设置

sourcetype:变量来源类型,file为从文件中读取

fileid:对应的options中的文件操作ID

delimiter:变量分隔符

order:数据产生方式

var:变量名称

该段内容表示从apiPostContent这个文件操作中随机读取数据,以^_^来分隔每行数据,第一个变量命名为data

除了从文件读取,也可以随机生成,如:

<setdynvars sourcetype="random_string" length="13">
        <var name="rndstring1" />
      </setdynvars>

      <setdynvars sourcetype="random_number" start="3" end="32">
        <var name="rndint" />
      </setdynvars>

[html]  view plain copy
  1. <request subst="true">  
  2.         <http url='/api' version='1.1' contents='%%_data%%' content_type='application/x-www-form-urlencoded; charset=UTF-8' method='POST'>  
  3.           <SPAN style="WHITE-SPACE: pre">   </SPAN><http_header name="Accept-Encoding" value="gzip,deflate"/>  
[html]  view plain  copy
  1. <request subst="true">  
  2.         <http url='/api' version='1.1' contents='%%_data%%' content_type='application/x-www-form-urlencoded; charset=UTF-8' method='POST'>  
  3.           <span style="white-space:pre;">   </span><http_header name="Accept-Encoding" value="gzip,deflate"/>  
[html]  view plain copy
  1. <SPAN style="WHITE-SPACE: pre"> </SPAN></http>  
  2. </request>  
[html]  view plain  copy
  1. <span style="white-space:pre;"> </span></http>  
  2. </request>  
request:会话产生的请求

subst:是否动态替换,如果请求中的数据是根据变量动态产生的,则subst属性必须为true,变量引用方式:%%_变量名%%

http:一个http请求

url:请求地址

version:http协议版本

contents:http请求报文内容

content_type:

method:请求方式,可选值:POST、GET

http_header:设置http请求头


启动Tsung完成测试后可以通过安装的lib下的bin目录下tsung_stats.pl来生成报表

/usr/local/lib/tsung/bin/tsung_stats.pl

/******************************************************************************** * * * G-TcpClient:基于完成端口的Tcp客户端通讯模块(IOCP TcpClient) * * * * Copyright © 2009-2010 GuestCode 代码客(卢益贵) * * 版权所有 侵权必究 * * * * QQ:48092788 E-Mail:48092788@qq.com 源码博客:http://blog.csdn.net/guestcode * * * * GSN:34674B4D-1F63-11D3-B64C-11C04F79498E * * * ********************************************************************************/ #pragma once extern "C" { //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 类型定义 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #ifndef _GTYPE #define _GTYPE typedef unsigned char* PGBUF; typedef void(__stdcall *PGFN_ON_CONNECTED)(unsigned int unPerHandle, unsigned char* pBuf, unsigned int unLen); typedef void(__stdcall *PGFN_ON_RECEIVED)(unsigned int unPerHandle, unsigned char* pBuf, unsigned int unLen); typedef void(__stdcall *PGFN_ON_SENDED)(unsigned int unPerHandle, unsigned int unSendID, unsigned int unLen); typedef void(__stdcall *PGFN_ON_DISCONNECTED)(unsigned int unPerHandle, unsigned int unFlag); typedef void(__stdcall *PGFN_ON_THREAD)(unsigned int unThreadContext, unsigned int unThreadHandle, unsigned int unThreadID, BOOL bIsBegin, unsigned int unFlag); /* typedef struct _CONNECTION { unsigned int unPerHandle; }CONNECTION, *PCONNECTION; typedef void(__stdcall *PGFN_ON_CONNECTED)(unsigned int unPerHandle, unsigned char* pBuf, unsigned int unLen); typedef void(__stdcall *PGFN_ON_RECEIVED)(PCONNECTION pConnection, unsigned char* pBuf, unsigned int unLen); typedef void(__stdcall *PGFN_ON_SENDED)(PCONNECTION pConnection, unsigned int unSendID, unsigned int unLen); typedef void(__stdcall *PGFN_ON_DISCONNECTED)(PCONNECTION pConnection, unsigned int unFlag); void __stdcall GTcpClt_OnThread(unsigned int unThreadContext, unsigned int unThreadHandle, unsigned int unThreadID, BOOL bIsBegin, unsigned int unFlag) { } void __stdcall GTcpClt_OnConnected(unsigned int unPerHandle, void* _NULL, unsigned int unNULL) { } void __stdcall GTcpClt_OnReceived(PCONNECTION pConnection, unsigned char* pBuf, unsigned int unLen) { } void __stdcall GTcpClt_OnSended(PCONNECTION pConnection, unsigned int unSendID, unsigned int unLen) { } void __stdcall GTcpClt_OnDisconnected(PCONNECTION pConnection, unsigned int unFlag) { } */ #define _USE_UNICODE 1 #ifndef _DLL //#define _DLL #endif #ifdef _DLL #define DllExport _declspec(dllexport) #else #define DllExport #endif #define VER_FLAG_WIDE_CHAR 0x01 #define VER_FLAG_BETA 0x02 #define VER_FLAG_ZERO_READ 0x04 #define VER_FLAG_TRIAL 0x08 #define VER_FLAG_DEBUG 0x10 #define HNDS_CONNECT 1 #define HNDS_CONNECTED 2 #define HNDS_DISCONNECT 3 #endif //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 类型定义 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 版本信息 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> #if(_USE_UNICODE) DllExport wchar_t* __stdcall GTcpClt_GetVersionName(void); #else DllExport char* __stdcall GTcpClt_GetVersionName(void); #endif DllExport float __stdcall GTcpClt_GetVersionNumber(void); DllExport unsigned int __stdcall GTcpClt_GetVersionFlag(void); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 版本信息 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 功能函数 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> DllExport DWORDLONG __stdcall GTcpClt_GetPhyMemInfo(DWORDLONG* pdwTotal); #if(_USE_UNICODE) DllExport void __stdcall GTcpClt_WriteLog(wchar_t* pstrLog, unsigned int unCode = 0); DllExport void __stdcall GTcpClt_GetHostIP(wchar_t* pstrIP, unsigned int unLen, BOOL bIsInternetIP = FALSE); #else DllExport void __stdcall GTcpClt_WriteLog(char* pstrLog, unsigned int unCode = 0); DllExport void __stdcall GTcpClt_GetHostIP(char* pstrIP, unsigned int unLen, BOOL bIsInternetIP = FALSE); #endif //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 功能函数 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>> PerIoData函数 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> DllExport unsigned int __stdcall GTcpClt_GetGBufSize(void); DllExport unsigned int __stdcall GTcpClt_GetIoDataSize(void); DllExport unsigned int __stdcall GTcpClt_GetIoDataUse(void); DllExport unsigned int __stdcall GTcpClt_GetIoDataTotal(void); DllExport float __stdcall GTcpClt_GetIoDataUseRate(void); DllExport unsigned int __stdcall GTcpClt_GetIoDataUseMem(void); //<<<<<<<<<<<<<<<<<<<<<<<<<<<< PerIoData函数 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>> PerHndData函数 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> DllExport unsigned int __stdcall GTcpClt_GetHndDataUse(void); DllExport unsigned int __stdcall GTcpClt_GetHndDataTotal(void); DllExport unsigned int __stdcall GTcpClt_GetHndDataSize(void); DllExport float __stdcall GTcpClt_GetHndDataUseRate(void); DllExport unsigned int __stdcall GTcpClt_GetHndDataUseMem(void); //<<<<<<<<<<<<<<<<<<<<<<<<<<<< PerHndData函数 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 信息函数 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> DllExport unsigned int __stdcall GTcpClt_GetThreadNumber(void); DllExport unsigned int __stdcall GTcpClt_GetPageSize(void); DllExport unsigned int __stdcall GTcpClt_GetBlockSize(void); DllExport unsigned int __stdcall GTcpClt_GetConnectCount(void); DllExport unsigned int __stdcall GTcpClt_GetThreadRunCount(unsigned int unThreadContext); DllExport unsigned int GTcpClt_GetState(unsigned int unPerHandle); #if(_USE_UNICODE) DllExport wchar_t* __stdcall GTcpClt_GetThreadName(unsigned int unThreadContext); DllExport BOOL __stdcall GTcpSock_GetPerHandleInfo(unsigned int unPerHandle, wchar_t* pstrIP, unsigned int unIPLen, wchar_t* pstrPort, unsigned int unPortLen); DllExport BOOL __stdcall GTcpSock_GetPerHandleName(unsigned int unPerHandle, wchar_t* pstrName, unsigned int unLen); #else DllExport char* __stdcall GTcpClt_GetThreadName(unsigned int unThreadContext); DllExport BOOL __stdcall GTcpSock_GetPerHandleInfo(unsigned int unPerHandle, char* pstrIP, unsigned int unIPLen, char* pstrPort, unsigned int unPortLen); DllExport BOOL __stdcall GTcpSock_GetPerHandleName(unsigned int unPerHandle, char* pstrName, unsigned int unLen); #endif DllExport unsigned int __stdcall GTcpClt_GetProcesserNumber(void); DllExport BOOL __stdcall GTcpClt_IsActive(); DllExport unsigned int __stdcall GTcpClt_GetUseMem(void); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 信息函数 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 操作函数 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> DllExport void* __stdcall GTcpClt_GetPerHandleOwner(unsigned int unPerHandle); DllExport BOOL __stdcall GTcpClt_SetPerHandleOwner(unsigned int unPerHandle, void* pOwner); DllExport PGBUF __stdcall GTcpClt_AllocGBuf(void); DllExport BOOL __stdcall GTcpClt_FreeGBuf(PGBUF pGBuf); DllExport unsigned int __stdcall GTcpClt_PostSendGBuf(unsigned int unPerHandle, PGBUF pGBuf, unsigned int unLen); DllExport unsigned int __stdcall GTcpClt_PostSendBuf(unsigned int unPerHandle, unsigned char* pBuf, unsigned int unLen); DllExport void __stdcall GTcpClt_PostBroadcast(unsigned char* pBuf, unsigned int unLen); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 操作函数 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 主要函数 DllExport BOOL __stdcall GTcpClt_CloseConnect(unsigned int unPerHandle); #if(_USE_UNICODE) DllExport unsigned int __stdcall GTcpClt_OpenConnect( wchar_t* pstrRemoteIP, wchar_t* pstrRemotePort, wchar_t* pstrLocalIP, PGFN_ON_CONNECTED pfnOnConnected, PGFN_ON_RECEIVED pfnOnReceived, PGFN_ON_SENDED pfnOnSended, PGFN_ON_DISCONNECTED pfnOnDisconnected, void* pOwner = NULL); #else DllExport unsigned int __stdcall GTcpClt_OpenConnect( char* pstrRemoteIP, char* pstrRemotePort, char* pstrLocalIP, PGFN_ON_CONNECTED pfnOnConnected, PGFN_ON_RECEIVED pfnOnReceived, PGFN_ON_SENDED pfnOnSended, PGFN_ON_DISCONNECTED pfnOnDisconnected, void* pOwner = NULL); #endif DllExport BOOL __stdcall GTcpClt_Start(unsigned int unHeartbeatTime = 60, unsigned int unMaxNetDelayTime = 5, unsigned int unGuardThreadSleepTime = 2, PGFN_ON_THREAD pfnOnThread = NULL, unsigned int unHndDataInitNumber = 1000, unsigned int unIoDataInitNumber = 1500, unsigned int unProcesserThreadNumber = 0, unsigned int unWorkerThreadNumber = 0); DllExport void __stdcall GTcpClt_Stop(void); //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 主要函数 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< } /* ... extern "C" */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值