介绍
HTTP,WebDAV,SOAP,PostgreSQL,MySQL,LDAP和Tsung可以模拟上百万用户OS IP别名技术在单个机器上使用多(CPU,内存), 支持XML方式的配置文件
模拟真实的流量HTML或者图表的方式报告测试结果
下载程序包
下载 wget http://www.erlang.org/download/otp_src_R14B.tar.gz
下载 wget http://ncu.dl.sourceforge.net/project/gnuplot/gnuplot/4.4.2/gnuplot-4.4.2.tar.gz
下载 wget
http://tsung.erlang-projects.org/dist/tsung-1.3.3.tar.gz
注意:如果使用集群安装/root/
对上面下载的对应的./configure --with-readline=builtin)
如果在tsung,那么首先配置工具配置文件,将1个执行文件到tsung.xml,例如:
我们要模拟cp /root/tsung-1.3.3/examples/http_simple.xml ~/.tsung/tsung.xml
然后找到路径")格式添加 -->
<!DOCTYPE tsung SYSTEM "/usr/local/share/tsung/tsung-1.0.dtd" [
<!ENTITY sessions1 SYSTEM "/root/.tsung/notifications_send.xml">
<!ENTITY sessions2 SYSTEM "/root/.tsung/msg_statistics_new_count.xml">
<!ENTITY sessions3 SYSTEM "/root/.tsung/msg_statistics_view.xml">
<!ENTITY sessions4 SYSTEM "/root/.tsung/other_msgs_reset_count.xml">
] >
<!-- loglevel:工具写日志的标识,级别默认是"info",长时间运行建议调整为error -->
<!-- dumptraffic:运行的调试信息dump文件,如需要看脚本是否正确可以设置为"true",
级别默认是"false",长时间运行建议调整为false -->
<tsung loglevel="error" dumptraffic="false" version="1.0">
<!-- 集群Client的设置 -->
<clients>
<!-- host:填别名,需要先去host文件配置,如:
127.0.0.1 localhost
10.0.0.252 s252
10.0.0.52 sl52
-->
<!-- weight: 节点上面用户的比例,一般设置为1即可 -->
<!-- maxusers: 一般设置为800,3000即可,根据机器配置来设置大小 -->
<!-- cpu: 根据机器硬件配置来设置,如果是4核CPU,最佳设置为3,以此类推 -->
<client host="localhost" weight="1" maxusers="3000" cpu="3"/>
</clients>
<!-- 集群servers的设置 -->
<servers>
<!-- host: 填别名,需要先去host文件配置 -->
<!-- port: 填可用对外端口,一般8080 -->
<!-- type: 协议类型,tsung支持tcp/udp,根据自己的需要 -->
<server host="localhost" port="8080" type="tcp"></server>
</servers>
<!-- 监控(cpu, network, memory). 使用erlang或SNMP,erlang是默认值
但是要保证监控的机器和server可以互相访问,装有erlang,否则用snmp -->
<monitoring>
<!-- host: 填别名,需要先去host文件配置 -->
<monitor host="localhost" type="erlang"></monitor>
</monitoring>
<!-- 负载场景设置 -->
<load>
<!-- phase:阶段,填数字即可,系统会按顺序执行,可是设置多个阶段组合场景 -->
<!-- duration:持续时段,填数字即可,单位是unit="minute"设置,是分钟
也可设置小时,天,详细情况参考API -->
<!-- arrivalrate:虚拟用户数,填写数字即可,一般最大800,如过机器配置好,可自己调试最佳参数
有效单位unit="second" 是秒,每秒虚拟300个虚拟用户,实际执行情况可能超过,也可能达不到,需要根据调试得到最佳参数 -->
<arrivalphase phase="1" duration="1" unit="minute">
<users arrivalrate="300" unit="second"></users>
</arrivalphase>
</load>
<!-- 脚本执行的基本参数设置 -->
<options>
<!-- 从.CSV文件读取测试数据,id必须唯一,如需要从数据库读取测试数据,请参考API -->
<option name="file_server" id='userdb' value="/root/.tsung/test_userid.csv"/>
<option name="file_server" id='user' value="/root/.tsung/test_user.csv"/>
<!-- 设置用户请求的浏览器信息,probability为比重,总值为100 -->
<option type="ts_http" name="user_agent">
<user_agent probability="50">Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050513 Galeon/1.3.21</user_agent>
<user_agent probability="50">Mozilla/5.0 (Windows; U; Windows NT 5.2; fr-FR; rv:1.7.8) Gecko/20050511 Firefox/1.0.4</user_agent>
</option>
</options>
<!-- 测试脚本,session's的probabilities 参数总和必须为100,在每个-->
<sessions>
&sessions1;
&sessions2;
&sessions3;
&sessions4;
</sessions>
</tsung>
见附件xxxxx.xml文件,文档格式如下:
<!-- 测试脚本的设置 --> <sessions> <!-- name:脚本名称,唯一值 --> <!-- probability:压力比重,总值100,可按需求设置 --> <!-- type:这里根据测试对象来,我这里是http请求,其他类型参考API --> <session name="msg_statistics" probability="100" type="ts_http"> <!-- 变量的设置 --> <!-- sourcetype:根据需求,参考API,我这里是csv文件 --> <!-- fileid:根据tsung.xml内的option文件操作的id一致 --> <!-- order:我这里选择的random随机,根据需求参考API --> <!-- name:这个变量的名称 --> <setdynvars sourcetype="file" fileid="user" order="random"> <var name="userid" /> </setdynvars> <!-- sourcetype:根据需求,参考API,我这里是csv文件 --> <!-- fileid:根据tsung.xml内的option文件操作的id一致 --> <!-- order:我这里选择的random随机,根据需求参考API --> <!-- name:这个变量的名称 --> <setdynvars sourcetype="file" fileid="userdb" order="random"> <var name="user" /> </setdynvars> <!-- sourcetype:根据需求,参考API,random_number随机数字 --> <!-- start:开始数字 --> <!-- end:结束数字 --> <!-- name:这个变量的名称 --> <setdynvars sourcetype="random_number" start="1" end="40"> <var name="rndint" /> </setdynvars> <!-- repeat:定义一个循环,name:名称 --> <repeat name="myloop"> <!-- transaction:定义一个事物,name:名称 --> <transaction name="notifications_send"> <!-- request:定义一个请求,subst="true"是提交类型的请求 --> <request subst="true"> <!-- http:定义一个http请求内容,根据自己的需求添加 --> <http url='http://test.rest.msg.sdo.com:80/msg_statistics/%%_userid%%/new_count' content_type='application/json' method='GET' contents=''> <http_header name="EncType" value="application/json"/> <http_header name="Mode" value="HTML"/> </http> </request> </transaction> <!-- until:定义一个循环的出口条件,这个变量rndint永远不会为0,为了让虚拟用户不停循环 --> <until var="rndint" eq="0"/> </repeat> </session> </sessions> |
注意:如果没有组合脚本的存在,也可以将此脚本写入session内,将脚本变量替换掉。
在图像界面的操作系统tsung 采用了巧妙的“录制 http proxy 默认使用 firefox 使用(推荐),所有”这个 http 动作都会被记录下来,测试时可以”这些步骤来产生请求。
tsung stop_recorder
”完了,会得到一个 tsung.xml 之中
增加http请求脚本示例:
<session name="http_send" probability="100" type="ts_http">
<setdynvars sourcetype="random_number" start="01" end="50"> <var name="rndint" /> </setdynvars>
<for from="1" to="800000" var="i"> <transaction name="queryWalletBalance">
<request subst="true"> <http url="http://10.130.70.13:8089/mpay/queryWalletBalance.do" method="POST" version="1.1" contents="userId=deng0000%%_rndint%%&userIdType=1&spId=0&appId=10&businessCode=196&costType=107&queryMode=01&eventTimestamp=20110304111111&signMethod=1&sign=32534535"> </http> </request> <thinktime value="0.1" random="true"></thinktime>
</transaction> </for> </session> |
在<load>标签
duration:持续时段,填数字即可,单位是API
800,如过机器配置好,可自己调试最佳参数,有效单位300个虚拟用户,实际执行情况可能超过,也可能达不到,需要根据调试得到最佳参数
<!-- 负载场景设置 --> <load> <!-- 第1阶段,持续10分钟,每秒2个用户 --> <arrivalphase phase="1" duration="10" unit="minute"> <users interarrival="2" unit="second"></users> </arrivalphase> <!-- 第2阶段,持续10分钟,每秒1个用户 --> <arrivalphase phase="2" duration="10" unit="minute"> <users interarrival="1" unit="second"></users> </arrivalphase> <!-- 第3阶段,持续10分钟,每秒10个用户 --> <arrivalphase phase="3" duration="10" unit="minute"> <users interarrival="0.1" unit="second"></users> </arrivalphase> <!-- 第4阶段,持续10分钟,每秒10个用户 --> <arrivalphase phase="4" duration="10" unit="minute"> <users arrivalrate="10" unit="second"></users> </arrivalphase> </load> |
为了保证压力传递的参数,我们在执行的时候需要分析请求是否正确,首先设置
dumptraffic="true"
注:切记不可忘记调试完成改回tsung start
>>Starting Tsung
logs目录tsung.dump
例如 ~/.tsung/log 目录会生成一个以时间命名的目录,进入这个目录
/usr/local/lib/tsung/bin/tsung_stats.pl
查看目录内生成的ssh登录
linux下可以用用/私钥对,下面以A(192.168.1.155),A通过B。
A机下生成公钥
[chenlb ~]$ ssh-keygen -t rsa -P ''
-P '' 就表示空密码,也可以不用-P就一次回车。/home/chenlb下生成.ssh下有id_rsa.pub。
2.把id_rsa.pub复制到B机的scp复制。
代码[chenlb ~]$ scp .ssh/id_rsa.pub
id_rsa.pub 100% 223 0.2KB/s 00:00
chenlb@192.168.1.181:/home/chenlb/id_rsa.pub
id_rsa.pub 100% 223 0.2KB/s 00:00
由于还没有免密码登录的,所以要输入密码。
3.B机把从id_rsa.pub添加到
[chenlb@B ~]$ chmod 600 .ssh/authorized_keys
[chenlb@B ~]$ chmod 600 .ssh/authorized_keys
600。
4.A机登录
The authenticity of host '192.168.1.181 (192.168.1.181)' can't be established.
Are you sure you want to continue connecting (yes/no)? yes
Last login: Thu Jul 3 09:53:18 2008 from chenlb
[chenlb ~]$ ssh 192.168.1.181
RSA key fingerprint is 00:a6:a8:87:eb:c7:40:10:39:cc:a0:eb:50:d9:6a:5b.
Warning: Permanently added '192.168.1.181' (RSA) to the list of known hosts.
[chenlb@B ~]$
yes,现在B机了。登录的机子可有私钥,被登录的机子要有登录机子的公钥。这个公钥rsa算法的公钥dsa(对应的文件是id_dsa.pub),想让B机无密码互登录,那
配置/etc/hosts中配置机器之间的名字解析/etc/hosts代码
代码127.0.0.1 localhost
10.0.0.52 sl52
所有的机器都要有类似这样的配置
,在这个文件中指定所有的 Tsung.xml代码
<client host="s252" weight="2" maxusers="800">
</client>
<ip value="10.0.0.135"></ip> </client>
tsung集群的所有机器上都装有tsung.xml就行了,其它机器只要满足无密码提示的ok,然后在控制机器上运行
log目录下,除了在配置文件中,其它过程根本不需要管其它机器的,它们只要开着并联网就行。
根据tsung会在集群其它机器上自动启动tsung集群的机器间自动分配压力测试,每个机器上可能会有一个或多个tsung达不到指定的压力,这时
启动
Host key verification failed
这是因为ip地址)互相登陆,解决办法是通过主机名(而不是ssh登录,例子如下,.ssh/known_hosts文件中记下主机名的登录
ssh gserver135
本机要修改默认端口22
vi /etc/ssh/sshd_config
/etc/rc.d/init.d/sshd restart 重新启动SSH服务器
常见的问题
l 设置的client端不支持22端口创建性能实例,需要调整本机默认端口为22,然后设置密钥,如果不想这么麻烦,可以使用参数:
<client host="mymachine"use_controller_vm="true">
l 其他
<FONT style="FONT-SIZE: 12px" color="black" face=""">
如果生成报表报错