tsung压力测试

    技术2022-05-20  66

    我们这里使用tsung对一个搜索引擎服务及mysql进行压力测试。以查看系统的QPS

    搜索服务的压力测试

    配置文件如下:

    <!DOCTYPE tsung SYSTEM "/usr/local/share/tsung/tsung-1.0.dtd">

    <tsung loglevel="warning" dumptraffic="true">   <!—将压的日志写到tsung.dump文件,在实际的压力时最好改成false-->

     

      <clients>

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

      </clients>

     

     <servers>

      <!—要压的服务器-->

      <server host="10.232.31.228" port="7711" type="tcp"/>

     </servers>

     

     <load>

      <!—定义用户生成的规则,这里每0.1s产生一个,最多50-->

      <arrivalphase phase="1" duration="10" unit="hour"> <!—可以定义多个阶段phase-->

        <users interarrival="0.1" unit="second" maxnumber="50"></users>

      </arrivalphase>

     </load>

     

     <options>

        <!—这里定义了一个文件,动态变量将从这个文件里读取值-->

        <option name="file_server" id='comm_csv' value="/u01/datas/csvtsung30w#"/>

     </options>

     

    <sessions>  

      <!—sessions里可以定义多个session,并且指定每个session使用的时间比例probability ,所有probability 之和必须有100-->

      <session probability="100" name="isearch_benchmark_session1" type="ts_http">

        <--每个session(user)执行6000次该操作-->

    <for from="1" to="6000" var="counter">

                 <!—读取文件,这里的文件每行有2个字段,使用分离-->

           <setdynvars sourcetype="file" fileid="comm_csv" delimiter="," order="iter">

            <var name="uid" />

                 <var name="comm_key" />

          </setdynvars>

          <request subst="true">

             <!—真正的报文请求命令-->

                        <http url="/bin/search?auction?uid=%%_uid%%&q=%%_comm_key%%

                                &n=15000" method="GET" version="1.1"></http>

          </request>

       </for>

      </session>

    </sessions>

     

    </tsung>

     

     

    启动命令:tsung -f search.xml start

    进入这个日志目录cd ~/.tsung/log/xxxxx

    生成 html 的压力测试报告:/usr/local/lib/tsung/bin/tsung_stats.pl

    如果该过程出现错误:

    warn, last interval (1) not equal to the first, use the first one (10)No data for MatchNo data for EventNo data for AsyncNo data for Errors

    Can't locate Template.pm in @INC (@INC contains: /usr/lib64/perl5/site….

    必须安装perl5libtemplate-perlgnuplot

    则表示没安装perl画图模板库:apt-get install libtemplate-perl gnuplot

    https://launchpadlibrarian.net/19366473/libtemplate-perl_2.20.orig.tar.gz

    如果命令执行成功的话,最后一定有一个report.html的文件,使用浏览器打开它就可以看到整个压力测试的数据及图表,包括connect建立使用的时间,page的响应时间,request的响应时间,一个session的持续时间;数据接收的速度及发送速度。如果服务器有日志数据的话,甚至可以得到服务器的QPS

    详细的图表的解释见:http://tsung.erlang-projects.org/user_manual.html#htoc68

    另外当读取的文件过大的时候,可能会报如下错误:

    {timeout,{gen_server,call,[{global,ts_file_server},{get_next_line,comm_csv}]}}后面我们使用的数据大约7M30w条记录。并且tsung对于request请求的格式要求非常严格,即上面的http url,必须按照url encoding。如'&'字符必须写成'&'等。

     

    mysql的压力测试

    配置文件如下:

    <!DOCTYPE tsung SYSTEM "/usr/local/share/tsung/tsung-1.0.dtd">

    <tsung loglevel="warning" dumptraffic="false">

      <clients> 

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

      </clients> 

     

     <servers> 

      <server host="127.0.0.1" port="3308" type="tcp"/> 

     </servers> 

     

     <load>

      <arrivalphase phase="1" duration="10" unit="hour">

        <users interarrival="0.1" unit="second" maxnumber="50"></users>

      </arrivalphase>

     </load>

     

       <options>

        <option name="file_server" id='comm_csv' value="/u01/datas/csvtsungmysql30w"/>

       </options>

     

     <sessions>

      <session probability="100" name="isearch_benchmark_session1" type="ts_mysql">

          <request>

            <mysql type="connect" />

          </request> 

     

          <request>

            <mysql type="authenticate" database="ad" username="ad_test" password="ad_test" />

          </request>   

         

               <request subst="true">

                      <mysql type="sql"> set names gbk;</mysql>

               </request>

     

               <for from="1" to="6000" var="counter">

                  <setdynvars sourcetype="file" fileid="comm_csv" delimiter="," order="iter">

                  <var name="uid" />

               </setdynvars>

               <request subst="true">

                         <mysql type="sql">select ad.id, custid, comm_key, comm_title, adgroaupid from isearch use index(`query`) join ad using(id) where isearch.query="%%_uid%%";</mysql>

                      </request>

               </for>

              

           <request> 

            <mysql type="close"></mysql> 

          </request> 

     

      </session>

     </sessions>

    </tsung>

     

     

    在进行压力测试的时候能够很好的知道系统的性能及稳定性,同时通过其它性能监测工具如Oprofile就可以跟踪系统的瓶颈所在。然后进行有效的优化。


    最新回复(0)