我们这里使用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….
必须安装perl5、libtemplate-perl、gnuplot
则表示没安装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}]}}后面我们使用的数据大约7M,30w条记录。并且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就可以跟踪系统的瓶颈所在。然后进行有效的优化。