tsung: 服务器压力测试软件

 tsung是一个非常好用的压力测试软件,基于erlang语言,支持多种协议如xmpp,http,mysql,支持集群,高效率(可以用一台普通的机器压垮几台性能强大的服务器)。
在公司建立内部xmpp服务器时,就可以用tsung来看看这个服务器能够承受多大的压力。
在Ubuntu上装好tsung之后,首先要用ulimit修改系统支持的最大fd数量,否则tsung最多只能创建不到1024个连接。
测试脚本是一个xml文件,就像下面这样:

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

    <!-- 下载 : http://tsung.erlang-projects.org/ -->

      <clients>
        <client host="localhost" use_controller_vm="false" maxusers="50000"></client>
        <!--要求能够用私钥ssh到本机,并且连通一次,留下记录在known_hosts-->
        <!--如果use_controller_vm="false",那么每maxusers个连接后会创建一个新的erlangVM,maxuser默认是800-->
        <!--否则达到上限就不再创建连接-->
        <!--能打开了limits,就不要使用多个erlangVM,容易crash-->
      </clients>

      <!-- Server side setup -->
     <servers>
      <server host="svr1.myserver.com" port="5222" type="tcp"></server>
     </servers>

      <load>
       <arrivalphase phase="1" duration="3600" unit="second">
        <users maxnumber="30000" interarrival="0.01" unit="second"></users>
      <!--总共启动的session数目,不过如果连接间隔是0.01的话,不是所有的session都能连接成功-->
       </arrivalphase>
      </load>

      <!-- JABBER parameters -->
      <!-- to synchronise users, use a global acknoledgement -->
     <options>
      <option type="ts_jabber" name="global_number" value="99999"></option>
      <option type="ts_jabber" name="userid_max" value="50000"></option>
      <!--总共账号数目,每个账号同时只登录一次-->
      <option type="ts_jabber" name="domain" value="myserver.com"></option>
      <option type="ts_jabber" name="username" value="myaccount"></option>
      <option type="ts_jabber" name="passwd" value="mypassword"></option>
      <!--账号和密码后面加上 1 到 userid_max 个后缀,后缀不用零填充,长度可变-->
     </options>

      <sessions>

       <session probability="100" name="jabber-example" type="ts_jabber">

        <request> <jabber type="connect" ack="local"></jabber> </request>
        <transaction name="authenticate">
          <request> <jabber type="auth_get" ack="local"></jabber> </request>
          <request> <jabber type="auth_set_plain" ack="local"></jabber> </request>
        </transaction>

        <request> <jabber type="presence:initial" ack="no_ack"/> </request>
        <!-- "presence:initial" : connected -> online -->
        <!-- "presence:final" : online -> connected-->


        <thinktime value="2"></thinktime>
        <transaction name="roster">
          <request> <jabber type="iq:roster:get" ack="local"></jabber></request>
        </transaction>

        <thinktime value="3"></thinktime>
        <transaction name="online">
        <request> <jabber type="chat" ack="no_ack" size="16" destination="online"></jabber> </request>
        </transaction>


        <for from="1" to="180" incr="1" var="counter">
         <thinktime value="120"></thinktime>
         <request> <jabber type="presence:initial" ack="no_ack"/> </request>
         <!--"%%_counter%%"-->
        </for>


        <transaction name="offline">
          <request> <jabber type="chat" ack="no_ack" size="56" destination="offline"></jabber> </request>
        </transaction>

        <request> <jabber type="presence:final" ack="no_ack"/> </request>

        <transaction name="close">
          <request> <jabber type="close" ack="no_ack"></jabber> </request>
        </transaction>

        <!-- 一个session结束后,tsung会立刻启动新的session(即使在这里休眠3600秒),(如果服务器承受得了)保证一直有 userid_max 个连接。如果不想这样,那么用maxnumber来限制最多启用的session数目即可 -->
      </session>
        


     </sessions>
    </tsung>

有话要说