我们这里使用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 Match
No data for Event
No data for Async
No 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就可以跟踪系统的瓶颈所在。然后进行有效的优化。