[心得] Tsung多台压测环境调试踩坑总结

单台压力上不去了,怎么办?

首先,需要一个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时出不来数据。原因在查。等搞定了再更新这里。

再补充一些tsung高级功能:

变量替换
<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主要负责压力的产生,并完成与服务器的通信。两个应用一些关键的进程及进程树如下图所示:
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参数切换使用的登录方式

你可能感兴趣的:(性能测试)