Tsung百万压测之三:配置文件(压测脚本)的关键配置

  • 打开http_simple.xml,下面来讲解几个关键配置。

loglevel

<tsung loglevel="notice" version="1.0">

clients

用户产生的方式:   

<clients>
   <client host="localhost" weight="1" maxusers="1000" use_controller_vm="true"/>
</clients>
  • host: 配置客户端地址(eg: 192.168.1.1:8080)
  • use_controller_vm: 是否使用虚拟控制器设置客户端最大连接数。
  • maxusers:客户端最大连接数。为false时,达到上限就不再创建连接。
  • weight: clients也可以配置成集群,根据weight值来随机选择发起请求的clients。

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

但是,前提是要打开操作系统的limits-最大进程数(limits.conf中修改),大多操作系统默认最大进程数为1024。

servers

<servers>
   <server host="myserver" port="80" type="tcp"></server>
</servers>

server段可以配置被测服务器的相关信息,也可以配置成集群,如下

<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。

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>
    <arrivalphase phase="2" duration="5" unit="minute">
        <users maxnumber="100" arrivalrate="2" unit="second" ></users>
    </arrivalphase>
</load>
  • load段可配置访问的负载,访问可以配成多个阶段,由phase值指定。
  • duration是测试持续时间,unit是单位。
  • users段的maxnumber限制了生成的最大用户数。
  • interarrival="0.02"表示0.02秒产生一个新用户,用户按照session的配置顺序执行session中的request。
  • arrivalrate="2"表示每秒产生多少个新用户

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>

options段可配置一些请求的信息,如agent信息。

TCP连接超时

<option name="connect_timeout" value="5000">
    <set_option name="connect_timeout" value="1000" />
</option>
  • 1.6.0新属性。指定尽力TCP连接超时毫秒值,缺省值无限制。
  • set_option: 为每一个会话连接设置超时时间
<option name=”tcp_reuseaddr” value=”true” />
  • 开启TCP地址重复绑定

重连次数与超时

<option name="max_retries" value="5">
    <set_option name="retry_timeout" value="1000" />
</option>
  • 1.6.0新属性。默认重连次数为3,设置为0时,代表禁止重连
  • 重连超时:默认为10毫秒

超时消息确认

<option name="idle_timeout" value="300000"></option>
<option name="global_ack_timeout" value="6000000"></option>
  • 设置idle超时,默认10min和全局ack超时,默认无穷

Hibernate

  • 在thinktimes阶段中模拟用户降低内存消耗,默认值为10s

Rate_limit

<option name="rate_limit" value="1024"></option>

现在每个客户端(令牌桶算法)的带宽需求,单位为KB/s,默认值为1024。

Ports_range

<option name="ports_range" min="1025" max="65535"/>

当要在同一客户端下产生30000个连接,必须限制TCP端口号

设置随机数种子

<option name="seed" value="42"/>

设置BOSH路径

<option name="bosh_path" value="/http-bind/"/>

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="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>
    <session name="event_list" probability="70" type="ts_http">
        <setdynvars sourcetype="random_number" start="0" end ="1">
            <var name="source" />
        </setdynvars>
        <request subst="true">
           <http url="/payment/inside/pay" method="POST" contents="{&quot;channelId&quot;:2001,&quot;type&quot;:%%_type%%,&quot;currency&quot;:1000,&quot;source&quot;:%%_source%%,&quot;refererId&quot;:%%_refid%%,&quot;clientId&quot;:15137449663879284,&quot;amount&quot;:0}" version="1.1">
                <http_header name="Content-Type" value="application/json"/>
          </http>
     </request>
 </session>
</sessions>

probability:可配置多个子session,进而可测试多个api,可以设置请求概率。session的probability之和是100。

type: 类型是ts_http,表示请求类型。

for循环

<for from="1" to="@loop" incr="1" var="counter">

for: sessions里可用for来设定请求循环次数,在里面可以设置请求的具体信息。

setdynvars

<setdynvars sourcetype="random_number" start="20" end="5000000">
    <var name="xxx" />
</setdynvars>
<setdynvars sourcetype="random_string" length="10">
    <var name="xxx" />
</setdynvars>

setdynvars: 元素及相关属性指定动态内容产生的方式。

设置请求参数的随机数,以%%_xxx%%的形式来调用。随机数也可从文件读取,如csv。

var: 指定变量的名称,变量用于存储产生的动态内容,供后续使用替换。

在request中使用这个变量完成动态替换。

变量的使用方式:下划线加变量名,以%%_xxx%%的形式来调用。

request必须指定为需要进行动态替换(即subst="true"),否则不会进行动态替换。

1. 随机数

<setdynvars sourcetype="random_number" start="20" end="5000000">
    <var name="itemid" />
</setdynvars>

<request subst="true">
    <http url="/comment/addComment" method="POST" contents="item_id=%%_itemid%%"></http>
</request>

sourcetype为 random_number,start表示开始最小数,end表示最大数

setdynvars与for循环:若是在for循环之前,每次循环数字都相同;建议放置在for循环内。

2. 随机字符

<setdynvars sourcetype="random_string" length="10">
    <var name="content" />
</setdynvars>

<request subst="true">
    <http url="/comment/addComment" method="POST" contents="content=%%_content%%"></http>
</request>

sourcetype为 random_string,length代表字符的长度,生成的字符包含中英文数字特殊字符。

3. 从函数中获取随机内容

<setdynvars sourcetype="erlang" callback="ts_user_server:get_unique_id">
    <var name="uid" />
</setdynvars>

<request subst="true">
    <http url="/comment/addComment" method="POST" contents="content=%%_uid%%"></http>
</request>

 唯一id,根据session来的,一次session产生一个uid,所有不管for在什么位置,for多少次,uid就会重复多少次;

4. 从文件中获取随机内容

<options>
    <option name="file_server" id="userdb" value="./user.csv" />
</options>
<setdynvars sourcetype="file" fileid="userd" delimiter=";">
    <var name="user" />
    <var name="passwd" />
</setdynvars>
<request subst="true">
    <http url="login?user=%%_user%%&amp;passwd=%%_passwd%%" version="1.1" method="POST">
</request>

 sourcetype为 file,

5. 从响应信息中获取随机内容: 

<request>
    <dyn_variable name="date" header="date" />
    <http url="/test" method="GET" version="1.1" />
</request>
<request subst="true">
    <http url="/home/?date=%%_date%%" method="GET" version="1.1" />
</request>
<request>
    <dyn_variable name="mytitlevar" re=&lt;title&gt;(.*)&lt;/title&gt;"/>
    <http url="/testtsung.html" method="GET" version="1.0" />
</request>
 
<request>
    <dyn_variable name="title" xpath="/html/head/title/text()" />
    <http url="/testtsung.html" method="GET" version="1.0" />
</request>
<request>
    <dyn_variable name="title" jsonpath="field.array[3].value" />
    <http url="/testtsung.html" method="GET" version="1.0" />
</request>

request

<request subst="true">
    <http url="/comment/addComment" method="POST" contents = "item_type=image&amp;item_id=%%_itemid%%&amp;content=%%_content%%">
        <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"/>
    </http>
</request>

subst="true": 调用随机数;若是不设置,随机数引用失败。

http_header:内部可以定义header参数。

1. HTTP GET

<request subst="true">
    <http url="/comment/get?commentId=111&amp;username=test" method="GET" version="1.1"></http>
</request>

url:  HTTP请求的域名后面的路径+?+parameters. &符号必须转义成 &amp; .

2. HTTP POST

<request>
    <http url="/contest/placeOrder?device_id=djiunhwersxerijn&amp;property=" method="POST" version="1.1" contents='{&quot;contestId&quot;:156002,&quot;orderVOList&quot;:[%%_selection%%]}'>
       <http_header name="Content-Type" value="application/json"/>
    </http>
</request>

url:  HTTP请求的域名后面的路径+?+parameters. &符号必须转义成 &amp; .

contents: HTTP POST请求提交的内容。“”符号必须转义成 &quot; ,括号和逗号不用转义

若是json,必须添加http_header。

thinktime:

  • 用于定义两个请求的间隔时间。

transaction:

  • 事务,事务中可以包含多个请求。
发布了52 篇原创文章 · 获赞 23 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/anndy_/article/details/88417384