Home > Erlang探索, Linux, 工具介绍 > Tsung用于压测MySQL服务器的脚本

Tsung用于压测MySQL服务器的脚本

November 18th, 2010 Leave a comment Go to comments

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: Tsung用于压测MySQL服务器的脚本

这个MySQL服务器压测的需求是 :

环境: Linux RHEL 5U4 X86-64, 24G内存, 16核.
MySQL服务器在xx.232.36.1上。

压力由最多32个客户端发起,每个客户端分别做update, insert, delete操作,概率分别是50%, 30%, 20%, 每种操作循环999999 × 100次,每100次操作后休息1-3秒。
这样的压力最多持续2个小时。

我们用的是著名的tsung压力测试工具, 之前我有篇blog介绍过, 见这里

以下是用到的脚本, 用到了比较先进的随机动态参数替换等技术,对于编写此类脚本有很大的借鉴意义。


<!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="xx.232.36.1" port="3306" type="tcp"/>
 </servers>

 <load>
  <arrivalphase phase="1" duration="2" unit="hour">
    <users interarrival="0.1" unit="second" maxnumber="32"></users>
  </arrivalphase>
 </load>

 <sessions>
  <session probability="50" name="st-replace" type="ts_mysql">

      <request>
        <mysql type="connect" />
      </request>  
      <request>
        <mysql type="authenticate" database="test" username="test" password="mysqltest" />
      </request>  

      <for from="1" to="999999" var="counter">
        <for from="1" to="100" var="counter">
          <setdynvars sourcetype="random_number" start="1" end="999999999">
            <var name="rnd_uid" />
          </setdynvars>
          <setdynvars sourcetype="random_string" length="13">
            <var name="rnd_uname" />
          </setdynvars>
          <setdynvars sourcetype="random_number" start="0" end="1">
            <var name="rnd_male" />
          </setdynvars>
          <setdynvars sourcetype="random_number" start="1" end="120">
           <var name="rnd_age" />
         </setdynvars>
         <setdynvars sourcetype="random_string" length="10">
           <var name="rnd_city" />
         </setdynvars>
         <setdynvars sourcetype="random_string" length="52">
           <var name="rnd_profile" />
         </setdynvars>
         <request subst="true">        
           <mysql type="sql">replace into user(tid, uname, male, age, city, profile) values(%%_rnd_uid%%, "%%_rnd_uname%%", %%_rnd_male%%, %%_rnd_age%%, "%%_rnd_city%%", "%%_rnd_profile%%") </mysql>
         </request>  
        </for>
        <thinktime min="2" max="5" random="true" />
      </for>

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

  <session probability="20" name="st-delete" type="ts_mysql">

      <request>
        <mysql type="connect" />
      </request>  
      <request>
        <mysql type="authenticate" database="test" username="test" password="mysqltest" />
      </request>  

      <for from="1" to="999999" var="counter">
        <for from="1" to="100" var="counter">
          <setdynvars sourcetype="random_number" start="1" end="999999999">
            <var name="rnd_uid" />
          </setdynvars>
          <request subst="true">        
            <mysql type="sql">delete from user where tid = %%_rnd_uid%% </mysql>
          </request>  
        </for>
        <thinktime min="2" max="5" random="true" />
      </for>

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

  <session probability="30" name="st-update" type="ts_mysql">

      <request>
        <mysql type="connect" />
      </request>  
      <request>
        <mysql type="authenticate" database="test" username="test" password="mysqltest" />
      </request>  

      <for from="1" to="999999" var="counter">
        <for from="1" to="100" var="counter">
          <setdynvars sourcetype="random_number" start="1" end="999999999">
            <var name="rnd_uid" />
          </setdynvars>
         <setdynvars sourcetype="random_string" length="52">
           <var name="rnd_profile" />
         </setdynvars>

         <request subst="true">        
           <mysql type="sql">update  user set profile = "%%_rnd_profile%%" where tid = %%_rnd_uid%% </mysql>
         </request> 
        </for> 
        <thinktime min="2" max="5" random="true" />
      </for>

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


 </sessions>
</tsung>

祝压测开心!

Post Footer automatically generated by wp-posturl plugin for wordpress.

  1. November 18th, 2010 at 20:45 | #1

    学习了
    我这个网站就遇到了mysql 压力不行的问题
    郁闷中

    [Reply]

  2. 文通
    November 19th, 2010 at 11:01 | #2

    给力

    [Reply]

  3. wuyun.xl
    November 19th, 2010 at 11:02 | #3

    很久以前看tsung文档,说mysql插件支持有限,只能select,就一直没试用。 想不到现在支持的好多了~~~

    [Reply]

  4. November 19th, 2010 at 11:03 | #4

    一直都支持的不错,现在的动态替换什么做的更好了。。。

    [Reply]

  5. November 19th, 2010 at 11:39 | #5

    看到这个配置很欣慰啊,测试了一下,我想问问,如果测试完毕,通过统计之后得出了数据,如果来判定这个mysql的各种瓶颈在哪里?能给出一个事例和解释一下否?

    [Reply]

    Yu Feng Reply:

    可以的,tsung文档描述了大概的流程。。。

    [Reply]

  6. 武彻
    November 25th, 2010 at 18:00 | #6

    老大,给力的~哈哈

    [Reply]

  7. June 17th, 2011 at 15:15 | #7

    写的真好, 我也试试for循环的功能

    [Reply]

  8. 陈杨希
    October 16th, 2011 at 05:02 | #8

    我这死活就是1043错误。。换机子,换数据库版本都试了。。在erl中连又没问题。。无奈。。

    [Reply]

    Yu Feng Reply:

    方便的话,麻烦把步骤和出错信息发email给我. 当然你也可以 If you add the attribute dumptraffic=”true”, all the traffic will be logged to a file. Warn: this will considerably slow down Tsung, so use with care. It is useful for debugging purpose. 参看这里: http://tsung.erlang-projects.org/user_manual.html

    看日志就知道什么原因了。

    [Reply]

  9. 飞鱼
    October 28th, 2011 at 16:48 | #9

    用tsung压测mysql,安装erlang用不用安装mysql相关包?我测试的时候老报“function not exported”错误。。。

    [Reply]

    Yu Feng Reply:

    不需要的,它是走自己的mysql协议

    [Reply]

  10. September 4th, 2012 at 18:39 | #10

    create table user (tid int, uname varchar(128), male int default’0′, age int default’0′, city varchar(128), profile varchar(128));

    [Reply]

  11. shiziwen
    September 24th, 2012 at 19:09 | #11

    请问如果使用多台机器产生压力,例如A,B两台机器产生压力,对C进行测试,那么是不是A,B两台机器都需要安装tsung并且进行配置文件的修改?

    [Reply]

    Yu Feng Reply:

    2个要求: 1. A,B都安装tsung,而且路径要一样的。 2. A,B ssh互信。 剩下的事情tsung自己能搞定,用A,B同时向C施加压力。

    [Reply]

  12. songzhanyuan
    May 23rd, 2016 at 17:03 | #12

    Replace INTO `recorder_info` (proto,HOST,PORT,app,NAME,start_time,end_time,size,`INTERVAL`,`LAST`,`STATUS`,everyday,file_name) VALUES(1,”zgmfclwhsyfjo”,12345,”1″,”25″,1461823804,1461823923,0,0,0,2,0,”NULL”)

    问题:实际上并没有向数据库插入记录。通过数据库的访问日志,没发现执行操作。

    [Reply]

  1. No trackbacks yet.