TSUNG压测软件安装和使用

版权说明:本文系博主通过各种渠道学习整理发表或者全文转载自其他平台,作为学习笔记,不能保证所有知识点是完全正确以及表达无误,用于生产环境配置时请斟酌。如有错误或建议请联系。转载请注明出处,侵删联系:linuxops@foxmail.com。感谢各位!

前言

这几天,一个新的项目即将上线运营,在大力推广运营之前领导想要研发中心出一份压测的报告。市面上有很多使用的压测平台,比如腾讯和阿里,都有提供.但是费用极其昂贵,本着互联网的开放精神,找了一下开源的,果然让我遇见了tsung这款强大的开源的压测软件。

官方用户手册

什么是tsung?

tsung是一款开源的分布式的负载均衡测试软件,基于erlang语言开发的,它可以用来压力测试HTTP, WebDAV, SOAP, PostgreSQL, MySQL, LDAP 和 Jabber/XMPP的服务器。它可以分布在多个客户机,并能够模拟成千上万的虚拟用户数并发。tsung是一款高效的软件,在低配置下也能很好的模拟上千客户端并发,非常棒,关键是它是一款分布式的压测软件,能分布式说明它产生压力可以横向扩展,只要你有足够多的机器。


tsung安装

1、安装依赖

yum install -y gcc gnuplot gd libpngzlib perl unixODBC unixODBC-devel ncurses-devel perl-devel

2、安装erlang-otp

[root@tsung ~]# tar -zxvf erlang_otp_src_20.0.tar.gz 
[root@tsung ~]# cd otp_src_20.0/
[root@tsung otp_src_20.0]# ./configure --prefix=/usr/local/erlang
[root@tsung otp_src_20.0]# make 
[root@tsung otp_src_20.0]# make install

3、安装Tsung

[root@tsung ~]# tar -zxvf tsung-v1.7.0.tar.gz 
[root@tsung ~]# cd tsung-1.7.0/
[root@tsung tsung-1.7.0]# ./configure --prefix=/usr/local/tsung --with-erlang=/usr/local/erlang
[root@tsung tsung-1.7.0]# make 
[root@tsung tsung-1.7.0]# make install

4、安装perl Template,用于生成报告模板

[root@tsung ~]# tar -zxvf Template-Toolkit-2.26.tar.gz
[root@tsung ~]# cd Template-Toolkit-2.26
[root@tsung Template-Toolkit-2.26]# perl Makefile.PL
[root@tsung Template-Toolkit-2.26]# make
[root@tsung Template-Toolkit-2.26]# make install

5、为方便使用,将tsung和erlang加入环境变量。

[root@tsung ~]# tsung -v
Tsung version 1.7.0
[root@tsung ~]#

tsung的使用

tsung 安装完成了以后,在安装目录下有官方自带的示例配置文件。

配置文件是xml格式,对应每一种压测都会给出一个示例文件。

http和http的接口使用的是http_simple.xml。

示例文件:[root@tsung ~]# cd /usr/local/tsung/share/doc/tsung/examples/

但是本文不使用此示例配置文件,之前有做过微信接口的压测,就以这个压测配置文件为例子吧。

进入压测项目文件夹,查看一下项目需要的文件

[root@tsung wechat]# ll
total 12
-rw-r--r-- 1 root root  303 Oct 19 15:46 post.txt  #post到服务器的数据,里面包含了变量
-rw-r--r-- 1 root root 1978 Oct 14 11:45 user.csv  #微信用户数据
-rw-r--r-- 1 root root 2517 Oct 19 19:28 wechat.xml #tsung压测配置文件
[root@tsung wechat]#

看一下wechat.xml配置文件:

<?xml version="1.0"?>
<!DOCTYPE tsung SYSTEM "/usr/local/tsung/share/tsung/tsung-1.0.dtd">
<tsung loglevel="notice" version="1.0">

  <clients>
      <!--- client 配置tusng的服务器,可以配置多个client达到分布式并发的效果,但是需要配置SSH免登录 -->
      <!--- client 配置中的maxusers 指的是tsung产生最大的用户数,更具压测的需要调整 -->
      <client host="localhost" use_controller_vm="true" maxusers="100000000" />
  </clients>

<servers>
    <!--- server 配置被压测的服务器信息 -->
    <!--- 如果压测http类型的,host设置为http的域名,不用添加“http://”,如果有URL,也不可再此填写,URL应该在 request 中填写-->
    <!--- port 配置的是端口,type配置数据类型 -->
  <server host="wechat.qq.com" port="80" type="tcp"></server>
</servers>

  <monitoring>
      <!--- 监控配置,监控tsung服务器的信息 -->
    <monitor host="myserver" type="snmp"></monitor>
  </monitoring>

  <load>
  <!--- load 的配置就是阶段配置,tsung会根据此处的配置产生压力并且持续相应的时间 -->
  <!--- 其中 phase 配置是设置阶段编号 duration 配置持续时间数值,unit 配置持续时间单位,一般默认为分钟 -->
  <!--- users项配置的是产生的用,这里的arrivalrate表示产生用户数,unit表示时间单位-->
  <!--- 以下配置说明:第一阶段每秒钟产生30个用户,并且持续2分钟(可以认为是每秒并发30个) -->

   <arrivalphase phase="1" duration="2" unit="minute">
     <users arrivalrate="30" unit="second"/>
   </arrivalphase>

    <arrivalphase phase="2" duration="2" unit="minute">
     <users arrivalrate="40" unit="second"/>
   </arrivalphase>

    <arrivalphase phase="3" duration="2" unit="minute">
     <users arrivalrate="50" unit="second"/>
   </arrivalphase>

    <arrivalphase phase="4" duration="2" unit="minute">
     <users arrivalrate="60" unit="second"/>
   </arrivalphase>

    <arrivalphase phase="5" duration="2" unit="minute">
     <users arrivalrate="70" unit="second"/>
   </arrivalphase>

  </load>

  <options>
  <!--- options 配置选项资源,具体类型请查看说明文档
      以下的一个option配置是设置以文件为数据源,可以供变量调用,在下面的sessions会用到
      以下的一个option中,id是设置这个option的ID,在sessions中通过这个id来访问此option,value配置数据文件的路径 -->

  <option name="file_server" id='fromusernamedb' value="/root/wechat/user.csv" />

  <!--- 下面这个option配置了模拟何种那个浏览器访问,如果没有其他要求,一般默认就可以了
      值得注意的是probability配置,这个配置是指定百分比,产生压力的百分之多少使用这个模拟浏览器配置 -->
   <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 配置是用来实际的访问的,但是如果需要变量来替换,那么需要提前定义好,变量是用 %%_name%%方式来引用 -->

  <session name="http-example" probability="100" type="ts_http">

      <!--- setdynvars 用来定义一个变量,下面配置意思是:设置变量名name为valuestring,设置变量产生的类型为random_string随机字符串,设置产生的长度length为20个字符 -->
    <setdynvars sourcetype="random_string" length="20">
        <var name="valuestring"/>
      </setdynvars>

     <!--- 下面的配置意思是:设置变量名name为ids,设置变量产生类型为random_number随机数,设置产生随机数起始值start为1000000000,置产生随机数结束值end为9999999999
         值得注意的是,随机数产生的范围是1000000000-9999999999 并且起始值不能大于结束值-->     
      <setdynvars sourcetype="random_number" start="1000000000" end="9999999999">
        <var name="ids"/>
      </setdynvars>

      <!--- 以下配置引用了option中的一个配置id为fromusernamedb的配置
      sourcetype 配置类型  fileid引用option中的配置 delimiter 配置分隔符 order配置引用顺序
      以下配置意思是:应用option中的file_sever配置,以";"为分隔符分割每一行,
      第一个分隔符设置变量名为fromusername1,第二个为fromusername,第三个为fromusername3,并且按照顺序赋值-->
      <setdynvars sourcetype="file" fileid="fromusernamedb" delimiter=";" order="iter">
      <var name="fromusername1" />
        <var name="fromusername" />
        <var name="fromusername3" />
       </setdynvars>
       <!--- 以上配置中,经过我们的实际使用,第一个变量和第二个变量都不能被正确的访问,只有第二个变量才可以,请将需要的比那里放在中间以便于正确访问。 -->

       <!--- tsung是基于erlang开发的,变量也可以通过erlang代码来产生。
           在下面的一个代码中,设置变量为times ,值为压测机当前时间戳 -->
       <setdynvars sourcetype="eval" code='fun({Pid,DynVars})->
                                         {M, S, _} = os:timestamp(),
                                         M * 1000000 + S end.'>
          <var name="times"/>
        </setdynvars>

       <!--- 在下面的一个代码中,设置变量为localtimes,值为压测机当前时间,时间已经格式化 --> 
       <setdynvars sourcetype="eval" code='fun({Pid,DynVars})->
                                         {{Year, Month, Day}, {Hour, Minite, Second}} = calendar:local_time(),
                                         integer_to_list(Hour)++":"++integer_to_list(Minite)++":"++integer_to_list(Second) end.'>
          <var name="localtimes"/>
        </setdynvars>

    <!--- transaction 是tsung的一个事物,name配置为事务名称,会在tsung的报告中体现,
        在一个事物中可以有多个请求  --> 
    <transaction name="influxdb_post">

            <!--- request 是tsung中的一个请求,也是实际发起的访问
                subst配置是否引用变量,如果此项配置不是ture,那么上面设置好的变量将不能被引用 
                http 项中的 url是配置url的地址,请求的时候会和之前servers配置中的host配置进行组装然后访问。
                method配置访问的方法,比如post、get
                contents_from_file 配置了post的数据来源于此路径,如果post数据需要引用变量,那么可以直接使用%%_name%%来引用
                http_header 配置头部信息
                具体详细配置请查看官方说明 --> 
        <request subst="true">
           <http url="/wechat/wx5a60ac5b81934701/server" method="POST" contents_from_file="/root/wechat/post.txt">
           <http_header name="Content-Type" value="text/xml"/>
          </http>
        </request>
      </transaction>

  </session>
 </sessions>
</tsung>

以下是user.csv文件内容和结构:

abc;oJ6m2wMf6G3moRqZ_jqwE5-YWDeU;12313;
abc;oJ6m2wFe3QdhOKDp0VJAGRPp7jcs;12314;
abc;oJ6m2wIY-3YVkQ1-PfYfIVH-cgLE;12315;
abc;oJ6m2wC2puvh3LRmjVhCHiQRVXlQ;12316;
abc;oJ6m2wGYRxaU-PgeGPuosUvh8UF4;12317;
abc;oJ6m2wBUe0s828upQwuq9ubHP8OI;12318;
abc;oJ6m2wNhc0l6fX6m2Tgs7tGgV_30;12319;
abc;oJ6m2wGKGPAWVrvyjtSh39Stp6rY;12320;
abc;oJ6m2wGG6lLNcUUyMkoj9CQX2WhE;12321;
abc;oJ6m2wHcMD7CYtB3OyynmFqjJYwE;12322;

以下是post.txt文件的内容和结构

<xml><ToUserName><![CDATA[gh_741756215shgh]]></ToUserName><FromUserName><![CDATA[%%_fromusername%%]]></FromUserName><CreateTime>%%_times%%</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[201ghbjhjhY-%%_ids%%-%%_localtimes%%]]></Content><MsgId>%%_times%%%%_ids%%</MsgId></xml>

tsung测试HTTP服务器时,GET或POST方法有时需配置参数。

这里只颜色固定参数情况

GET:

<http url=’http://www.csdn.com/develop/c-develop/pbk1340.html?var=3&amp;b=4′ method=’GET’ />

注意,如果多个变量连接必须用实体& 而不是单独的 ‘&‘

POST:

<http url=’http://www.paobuke.com/develop/c-develop/pbk1340.html method=’POST’ contents=’username=pao&pass=buke’/>

注意:post方法中不需要写实体,直接用‘&‘

我的博客即将同步至 OSCHINA 社区,这是我的 OSCHINA ID:LINUXOPS,邀请大家一同入驻:https://www.oschina.net/sharing-plan/apply