Tsung负载测试Tigase
http://linyu19872008.iteye.com/blog/1605707
文档历史
日期
作者
版本
注释
2012/05/15
sina微博:weibo.com/csx1998
1.0
创建
?
?
?
?
?
?
?
?
tsung是一个非常好用的压力测试软件,基于erlang语言,支持多种协议如xmpp,http,mysql,支持集群,高效率,可以用一台普通的机器压垮几台性能强大的服务器。
针对消息通知服务xmpp服务器,可以用tsung来测试消息通知服务能承受多大的压力。
在Ubuntu上装好tsung之后,首先要用ulimit修改系统支持的最大fd数量(ulimit?-n?20480),否则tsung最多只能创建不到1024个连接,测试脚本是一个xml文件
详细参看:http://wenku.baidu.com/view/6fd5e6d126fff705cc170af2.html
1、下载Tsung:
从Tsung的官方网站下载源代码(http://tsung.erlang-projects.org/dist/),目前最新的是tsung-1.4.1.tar.gz,这边安装的也是tsung-1.4.1.tar.gz?ftp到服务器上解压
2、安装Tsung的依赖组件:
a、Erlang及相关组件(必装)?:sudo?apt-get?install?erlang?erlang-nox?erlang-dev?erlang-parsetools
b、gnuplot、perl5及template模板(如果需要生成报表的话):?sudo?apt-get?install?perl5?gnuplot?libtemplate-perl
3、编译Tsung
cd到Tsung的解压目录编译
./configure
make
sudo?make?install
4、编写tsung.xml配置文件
~/.tsung/tsung.xml为tsung默认的配置文件,在/usr/share/doc/tsung/examples/中有一些示例文件,如下:

?
可以参考jabber.xml文件来编写自己的tsung.xml?
5、运行Tsung
tsung?start???或者?tsung?-f?jabber.xml?start运行后,tsung会将数据保存在~/.tsung/log/目录下,完整目录示例如下:/home/grape/.tsung/log/20120515-1636
6、生成报表
tsung运行完成后,进入~/.tsung/log/***/目录,然后运行?/usr/lib/tsung/bin/tsung_stats.pl,会生成html报表页面。
编译Tsung后/usr/share/doc/tsung下包含测试的配置实例xml和tsung的用户手册user_manual.html
本次测试使用以下配置
<?xml?version="1.0"?>
<!DOCTYPE?tsung?SYSTEM?"/usr/share/tsung/tsung-1.0.dtd">
<tsung?loglevel="notice"?version="1.0">
<!--如果use_controller_vm="false",那么每maxusers个连接后会创建一个新的erlangVM,maxuser默认是800?否则达到上限就不再创建连接?能打开了limits,就不要使用多个erlangVM,容易crash?需要执行ulimit?-n?20480-->
??<clients>
<!--可以配置多台客户端-->
????<client?host="localhost"?use_controller_vm="true"??maxusers="10000"></client>
??</clients>
?
??<!--?Server?side?setup配置服务器IP或域名-->
?<servers>
??<server?host="192.168.3.242"?port="5222"?type="tcp"></server>
?</servers>
??<load>
<!--可以配置多个阶段相位,这边使用20分钟?也可以设置unit="minute"-->
???<arrivalphase?phase="1"?duration="1200"?unit="second">
<!--这边不是生成用户的时间间隔而,是总共尝试去连接的session数目,为了使所有用户都去连接,这边要计算出连接间隔?-->
????<users?maxnumber="12000"??interarrival="0.1"?unit="second"></users>
???</arrivalphase>
??</load>
?
??<!--?JABBER?parameters?-->
??<!--?to?synchronise?users,??use?a?global?acknoledgement?-->
?<options>
??<option?type="ts_jabber"?name="global_number"?value="10001"></option>
<!--总共账号数目,每个账号同时只登录一次-->
??<option?type="ts_jabber"?name="userid_max"?value="10000"></option>
??<option?type="ts_jabber"?name="domain"?value="test.rzico.net"></option>
<!--账号和密码后面加上?1?到?userid_max?个后缀?去xmpp服务器上授权-->
??<option?type="ts_jabber"?name="username"?value="chenshaoxian"></option>
??<option?type="ts_jabber"?name="passwd"?value="chenshaoxian"></option>
</options>
??<sessions>
<!—probability值加起来要达到100?-->
???<session?probability="50"?name="jabber-example"?type="ts_jabber">
????<request>?<jabber?type="connect"?ack="no_ack"></jabber>?</request>
????<thinktime?value="2"></thinktime>
????<transaction?name="authenticate">
??????<request>?<jabber?type="auth_get"?ack="local"></jabber>?</request>
??????<request>?<jabber?type="auth_set_plain"?ack="local"></jabber>?</request>
????</transaction>
????<!--?"presence:initial"?:?connected?->?online?-->
<!--?"presence:final"?:?online?->?connected-->
????<request>?<jabber?type="presence:initial"?ack="no_ack"/>?</request>
????<thinktime?value="2"></thinktime>
????<transaction?name="roster">
<request>?<jabber?type="iq:roster:get"?ack="local"></jabber></request>
</transaction>
????<thinktime?value="30"></thinktime>
????<transaction?name="online">
<request>?<jabber?type="chat"?ack="no_ack"?size="16"?destination="online"></jabber>?</request>
????</transaction>
????<thinktime?value="30"></thinktime>
????<transaction?name="offline">
<request>?<jabber?type="chat"?ack="no_ack"?size="56"?destination="offline"></jabber>?</request>
</transaction>
????<thinktime?value="30"></thinktime>
????<transaction?name="close">
<request>?<jabber?type="close"?ack="no_ack"></jabber>?</request>
</transaction>
??</session>
?
??<session?probability="20"?name="jabber-plain"?type="ts_jabber">
????<request>?<jabber?type="connect"?ack="no_ack"></jabber>?</request>
????<thinktime?value="2"></thinktime>?
????<transaction?name="auth_plain">
??????<request>?<jabber?type="auth_get"?ack="local"></jabber>?</request>
??????<request>?<jabber?type="auth_set_plain"?ack="local"></jabber>?</request>
????</transaction>
????<thinktime?value="30"></thinktime>
????<transaction?name="close">
??????<request>?<jabber?type="close"?ack="no_ack"></jabber>?</request>
????</transaction>
??</session>
?
??<session?probability="20"?name="jabber-digest"?type="ts_jabber">
????<!--?regexp?captures?stream?ID?returned?by?server?-->
????<request>
??????<dyn_variable?name="sid"?re="<stream:stream?id="(.*)"?xmlns:stream"/>
??????<jabber?type="connect"?ack="local"></jabber>
????</request>
????<thinktime?value="2"></thinktime>
????<transaction?name="auth_digest">
??????<request>?<jabber?type="auth_get"?ack="local"></jabber>?</request>
??????<request?subst='true'>?<jabber?type="auth_set_digest"?ack="local"></jabber>?</request>
????</transaction>
????<thinktime?value="30"></thinktime>
????<transaction?name="close">
??????<request>?<jabber?type="close"?ack="no_ack"></jabber>?</request>
????</transaction>
??</session>
?
??<session?probability="10"?name="jabber-sipdigest"?type="ts_jabber">
????<request>?<jabber?type="connect"?ack="no_ack"></jabber>?</request>
????<thinktime?value="2"></thinktime>
????<transaction?name="auth_sipdigest">
??????<!--?regexp?captures?nonce?value?returned?by?server?-->
??????<request>
????????<dyn_variable?name="nonce"?re="<Nonce?encoding="hex">(.*)<\/Nonce>"/>
????????<jabber?type="auth_get"?ack="local"></jabber>
??????</request>
??????<request?subst='true'>?<jabber?type="auth_set_sip"?ack="local"></jabber>?</request>
????</transaction>
????<thinktime?value="30"></thinktime>
????<transaction?name="close">
??????<request>?<jabber?type="close"?ack="no_ack"></jabber>?</request>
????</transaction>
??</session>
?</sessions>
</tsung>
?
对报表参数不太了解可以试着参看服务器上的tsung的用户手册user_manual.html
或参看:http://tsung.erlang-projects.org/user_manual.html
一些常用的名词解析:
request:每个请求的反应时间
page:每一系列请求的反应时间(a?page是一组不包含think-time的一组请求)??
connect:连接建立用的时间??
reconnect:重新连接的次数??
size_rcv:反应的大小(单位是byte)??
size_sent:请求的大小(单位是byte)??
session:用户会话时间??
users:同步用户数??
connected:同步连接用户数??
Tsung收集到监控数据后,会发送到数据统计进程。其实在会话进程运行时,也会产生大量的统计数据,比如发送了多个请求,执行了多个个事务(Tsung事务),通过网络发送了多少数据,收到多少数据等等。
根据手册中#?stats:’name’?10sec_count,?10sec_mean,?10sec_stdvar,?max,?min,?mean,?count
而counter类型的数据格式如下:
#?stats:’name’?count(during?the?last?10sec),?totalcount(since?the?beginning)
跟数据统计相关的模块主要有三个:ts_mon:提到数据统计的接口,监控数据的添加主要通过该模块中的接口来完成;ts_mon_cache:缓存,统计数据的内存写入由此模块完成;ts_stats_mon:将统计数据写入到文件。
添加一个统计项,一般的都通过调用ts_mon:add这个接口来完成,然后ts_mon:add会调用ts_mon_cache将统计项先写入内存。ts_mon_cache初始化是会定义一个定时器,每10秒会触发调用ts_stats_mon:add将10秒内的统计数据写入文件。
?
调整tigase.config配置文件,调整如下:
ENC="-Dfile.encoding=UTF-8?-Dsun.jnu.encoding=UTF-8"
#DRV="-Djdbc.drivers=com.mysql.jdbc.Driver:org.postgresql.Driver:org.apache.derby.jdbc.EmbeddedDriver"
DRV="-Djdbc.drivers=org.postgresql.Driver"
GC="-XX:+UseBiasedLocking?-XX:+UseConcMarkSweepGC?-XX:+CMSIncrementalMode?-XX:ParallelCMSThreads=8"
JAVA_HOME="/home/zhangtc/share/jdk1.6.0_31"
CLASSPATH=""
JAVA_OPTIONS="${GC}?${ENC}?${DRV}?-server?-d64?-Xms1024M?-Xmx2048M?-XX:PermSize=64m?-XX:MaxPermSize=256m?-XX:MaxDirectMemorySize=128m?"
TIGASE_CONFIG="etc/tigase.xml"
TIGASE_OPTIONS="?--property-file?etc/init.properties?--test"
?
调整init.properties配置文件,调整如下:
config-type=--gen-config-def
--admins=admin@test.rzico.net
--virt-hosts?=?test.rzico.net
--auth-db=tigase-auth
--user-db=mysql
--user-db-uri=jdbc:mysql://192.168.3.245:3306/tigasedb?user=root&password=123456
--user-repo-pool-size=12
--comp-name-1=srecv
--comp-class-1=tigase.server.sreceiver.StanzaReceiver
#--debug=server
#--monitoring=jmx:9050
编写数据库插入代码,在数据库插入相应的用户数据和相关联数据
原始tigase的负载能力,
报表地址如下:
http://192.168.3.242:8080/20120515-1513/report.html
Tigase和UIC使用数据库触发器关联的负载能力:
报表地址如下:
http://192.168.3.242:8080/20120516-1222/report.html(未做监控)
http://192.168.3.242:8080/20120516-1525/report.html
测试时间(20120516-1525到20120516-1545)
CPU、内存、网络监控图:?

?
?
?
从图表可看出在242服务器(tigase未做群集的情况)下带20000个用户产生的负载是比较低的。
grape-sync完整集成tigase后,?grape-sync负载能力,后续更新