Tsung百万压测之一:执行步骤篇
Tsung百万压测之二:环境搭建、配置文件编写和运行、报表生成
Tsung百万压测之三:配置文件(压测脚本)的关键配置
Tsung压测踩坑之server集群
首先,需要一个master,多个slave的结构。因为master要登陆slave运行tsung,并且slave要返回登陆master同步数据,所以需要双向登陆能力。
此外,tsung通过主机名相互登录:因此master和slave的hostname应该存在彼此的.ssh/known_hosts里面。
如果有配置ip白名单,黑名单之类的,也需要考虑网络的互通性问题。
其次修改/etc/hosts进行dns域名映射。
最后在tsung.xml的配置文件中的client部分加上多个客户端。
集群的压力测试就开始了,最后的结果会自动汇总在控制机器的log目录下,除了在配置文件中,其它过程根本不需要管其它机器的,它们只要开着并联网就行。
控制机器上的tsung会在集群其它机器上自动启动tsung,并在tsung集群的机器间自动分配压力测试,每个机器上可能会有一个或多个tsung实例在运行,取决于每个机器所要提供的压力大小。如果tsung达不到指定的压力,这时tsung不会再继续,将自动退出。你只能试着减少压力,或者增加机器才能提供更大的压力。
这里的坑是,多个slave时出不来数据。原因在查。等搞定了再更新这里。
<setdynvars sourcetype="random_number" start="3" end="100">
<var name="id" />
</setdynvars>
<request subst="true">
<http url="/push?id=%%_id%%" version="1.1" method="POST" />
</request>
注意使用变量的方式是:下划线加变量名,并且包含在一对%%中。另外,request必须指定为需要进行动态替换(即subst=“true”),否则不会进行动态替换。上面的例子中在3到100中随机产生一个数字,并保存在变量id中,请求URL的参数中使用这个变量达到每次请求带有随机的参数。
<setdynvars sourcetype="erlang" callback="ts_user_server:get_unique_id">
<var name="uid" />
</setdynvars>
<options>
<option name="file_server" id="userdb" value="user.csv" />
</options>
<setdynvars sourcetype="file" fileid="userd" delimiter=";">
<var name="user" />
<var name="passwd" />
</setdynvars>
<request subst="true">
<http url="login?user=%%_user%%&passwd=%%_passwd%%" version="1.1" method="GET">
</request>
还可以将服务器响应的信息保存下来,在后续的请求中完成动态替换。
<request>
<dyn_variable name="date" header="date" />
<http url="/test" method="GET" version="1.1" />
</request>
<request subst="true">
<http url="/home/?date=%%_date%%" method="GET" version="1.1" />
</request>
在第一个请求中,从服务器响应信息的http头部中取出date对应的内容,保存在名为date的变量中,在下一个请求的参数中完成动态替换。
Tsung主要由tsung_controller和tsung两个application共同完成压力测试,其中tsung_controller主要负责配置文件的解析,监控数据的统计,日志的记录等;tsung主要负责压力的产生,并完成与服务器的通信。两个应用一些关键的进程及进程树如下图所示:
1、启动tsung_controller应用,初始化相关进程,然后由ts_config_server完成配置文件的解析
2、根据配置需要启动对服务器的监控
3、根据配置在不同节点上创建erlang虚拟机进程,并启动tsung应用,然后由ts_launcher进程和ts_launcher_static进程开始产生压力,这两个进程会不断创建出ts_client进程,最终在ts_client进程中模拟用户的行为完成与服务器的通信。
tsung中采用了erlang/otp自带的xmerl模块完成xml的解析。该模块使用较简单,调用xmerl_scan的string函数或者file函数完成xml的解析,解析后的内容是一个xmlelement的record,里面包含了所有的元素,对应的属性等信息。从中获取我们需要的信息即可。
tsung中多台物理机共同完成压力测试,或者是通过erlang的方式对服务器进行监控。最终都是由ts_config_server进程远程到对应的物理机上,创建一个erlang虚拟机进程,然后进行rpc调用完成相应的控制。这个过程具体实现是调用了slave:start(Host, Name, Args)完成的。
slave模块默认使用rsh(remote shell)的方式登录到Host指定的目标机器上,运行erlang虚拟机进程。我们也可以在启动时带上-rsh参数切换使用的登录方式