想做客户端间的通信压力测试,找了半天找不到相应的测试文件,只能自己翻官文了……
================================分割线======================================================
没有对jabber的recoder所以你必须自己写session
Jabber插件并没有从语法上解析XML
因为jabber插件并不解析XML,所以必须告诉程序何时一个request完成了。有三种方式,使用ack属性:
Ack=‘local’:一旦从服务中返回的packet被接收,就认为是完成了。如果你使用一个从来不从服务返回的ack,它将会永远等待下去。
Ack=‘no_ack ’,一旦request发送了,就认为是完成了,不用等待返回数据
Ack=‘global’同步用户,其主要作用是在发送消息前等待所有的用户连接。为了达到这个目的,将一个request设置为global ack,比如:
<request> <jabber type=”presence”ack=”glocal”/> </request>
同时你也必须定义将要连接的用户:
<option type="ts_jabber"name="global_number" value="100"></option>
为了保证所有的global_number用户都开始了,给users增加maxnumber属性
<users maxnumber="100"interarrival="1.0" unit="second"></users>
双向的presence
如果你将session中bidi属性的值设为true,从服务端来的消息就会被解析,当前,只有名单订阅请求会被处理,如果一个用户收到一个subscription request(名单订阅请求<presence ... type="subscribe">),。其将会返回一个名单订阅请求信息:<presence ... type="subscribed">
状态:offline connected online、
你可以发送信息给一个在线或者离线用户,一个用户会被认为是在线的如果他已经发送了一个presence:initial信息(在这条信息之前,这个用户的状态该是connected)
如果你想在变为offline之前改为connected,你可以使用一个presence:final信息:
Presence:final做两件事情:
从在线用户online列表中移出用户,然后将他们移动到连接用户connected列表中
发送一个广播状态更新类型为”unavailable“
Presence:final是可选的
验证
下面是一个可能的验证方法的配置例子,注意:这儿用的通常的表达式只是例子,他们可能会被修改,一句一个具体的服务是如何实现的,如何组装消息的。
普通验证:发送一个标准的文本密码:
<session probability="100"name="jabber-plain" type="ts_jabber">
<request><jabber type="connect" ack="local"></jabber></request>
<thinktimevalue="2"></thinktime>
<transactionname="auth_plain">
<request> <jabber type="auth_get"ack="local"></jabber> </request>
<request> <jabber type="auth_set_plain"ack="local"></jabber> </request> </transaction>...
</session>
XMPP JEP-0078中描述的摘要式身份验证,non-sasl身份验证:
<session probability="100"name="jabber-digest" type="ts_jabber">
<!-- regexp captures stream ID returnedby server -->
<request>
<dyn_variable name="sid"re="<stream:streamid="(.*)"xmlns:stream"/>
<jabber type="connect"ack="local"></jabber>
</request>
<thinktimevalue="2"></thinktime>
<transactionname="auth_digest">
<request> <jabbertype="auth_get" ack="local"></jabber></request>
<request subst="true"> <jabbertype="auth_set_digest" ack="local"></jabber></request> </transaction>
...
</session>
Sip-digest身份验证
<session probability="100"name="jabber-sipdigest" type="ts_jabber">
<request> <jabbertype="connect" ack="local"></jabber></request>
<thinktimevalue="2"></thinktime>
<transactionname="auth_sipdigest">
<!-- regexp captures nonce valuereturned by server -->
<request>
<dyn_variable name="nonce"re="<Nonceencoding="hex">(.*)<\/Nonce>"/>
<jabber type="auth_get"ack="local"></jabber>
</request>
<request subst="true"><jabber type="auth_set_sip"ack="local"></jabber> </request> </transaction>
...
</session>
文档结构:
默认编码是utf-8,可以使用不同的编码格式:
<?xml version="1.0"encoding="ISO-8859-1"?>
客户端和服务端
基本建立:
对于非均匀分布荷载,可以使用基本建立,比如:
<clients>
<client host="localhost"use_controller_vm="true"/>
</clients>
<servers>
<server host="192.168.1.1"port="80" type="tcp"></server>
</servers>
这样就会开始在同一个host和同一个erlang虚拟机上压力测试
服务是集群的入口,你可以添加很多个服务,默认情况下每一个服务权重都是1,并且每一个session都会随机根据权重选择一个服务。你可以为每一个服务分配一个权重,如下所示:
<servers>
<server host="server1"port="80" type="tcp"weight="4"></server>
<server host="server2"port="80" type="tcp"weight="1"></server>
</servers>
高端建立:
如下所示:
<clients> <clienthost="louxor" weight="1" maxusers="800"><ip value="10.9.195.12"></ip> <ipvalue="10.9.195.13"></ip> </client> <clienthost="memphis" weight="3" maxusers="600"cpu="2"/> </clients>
<servers> <serverhost="10.9.195.1" port="8080"type="tcp"></server> </servers>
一些虚拟ip可以被用来模拟更多机器,这是很有用的,有利于负载均衡,可以使用<ip scan="yes" value="eth0"/>来自动探测可用ip
Maxusers
这个变量是用来绕开一个单线程所能打开的最大socket数,当用户比限制的更多是,就会多开一个虚拟机,来处理新的用户,
Monitoring监控
Tsung可以检测远程服务,私用一些后端的技术来和远端agent交流。
Erlang
远端agent由tsung开启,其使用erlang来检索服务上活动的统计,比如,这儿是一个建立在erlang agents上的集群监控,是一个六台计算机的集群
<monitoring> <monitorhost="geronimo" type="erlang"></monitor><monitor host="bigfoot-1"type="erlang"></monitor> <monitorhost="bigfoot-2" type="erlang"></monitor><monitor host="f14-1" type="erlang"></monitor><monitor host="f14-2" type="erlang"></monitor><monitor host="db" type="erlang"></monitor></monitoring
定义压力测试过程:
随机注册用户:
<load>
<arrivalphase phase="1"duration="10" unit="minute">
<users interarrival="2"unit="second"></users>
</arrivalphase>
<arrivalphase phase="2"duration="10" unit="minute">
<users interarrival="1"unit="second"></users>
</arrivalphase>
<arrivalphase phase="3"duration="10" unit="minute">
<users interarrival="0.1"unit="second"></users>
</arrivalphase>
</load>
第一阶段,在前十分钟,每两秒钟创建一个用户,第二阶段,在接下来的10分钟内,每秒钟会创建一个用户,第三阶段,在最后的十分钟内,每一秒钟会建立十个用户,当所有用户结束其session时,测试结束。
也可以用interarrival代替interarrival,比如:
<arrivalphase phase="1"duration="10" unit="minute">
<users arrivalrate="10"unit="second"></users>
</arrivalphase>
可以通过maxnumber属性限制每一个阶段生成的用户数,如下所示:
<arrivalphase phase="1"duration="10" unit="minute">
<users maxnumber="100"arrivalrate="10" unit="second"></users>
</arrivalphase>
<arrivalphase phase="2"duration="10" unit="minute">
<users maxnumber="200"arrivalrate="10" unit="second"></users>
</arrivalphase>
在这个例子中,只有100个用户会在第一阶段被创建,然后两百个在第二阶段。
完整的顺序可以使用loop属性在load标签中,loop=2表示要再循环两次结果就是执行三次。
设置选择项options
BOSH的路径
你可以使用如下设置来设置BOSH的路径:
<option name="bosh_path"value="/http-bind"/>
WebSocket设置
当你的server使用WebSocket时,你可以设置如下WebSocket设置:
<option name="websocket_path"value="/chat"/>
<!-- send websocket data with textframe, default binary-->
<option name="websocket_frame"value="text"/>
使用WebSocket_path来设置websocket request的路径,使用websocket_frame来设置类型(binary ,text,默认是binary)
XMPP/JABBER 选项:
专有协议下的默认值是可以定义的,比如:
<option type="ts_jabber"name="global_number" value="5" />
<option type="ts_jabber"name="userid_max" value="100" />
<option type="ts_jabber"name="domain" value="jabber.org" />
<option type="ts_jabber"name="username" value="myuser" />
<option type="ts_jabber"name="passwd" value="mypasswd" />
<option type="ts_jabber" name="muc_service"value="conference.localhost"/>
Thinktimes
你可以设置固定的或者随机的thinktimes来分割请求,
<thinktime value="20"random="true"></thinktime>
<thinktime min="2"max="10" random="true"></thinktime>
<thinktimevalue="%%_rndthink%%" random="true"></thinktime>
============================================================乱七八糟的翻译的结束的分割线====================
哪位朋友知道如何用tsung测客户端间通信的压力测试,或者知道如何测websocket,求留言。。。