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

再补充一些tsung高级功能:

 
  1. 变量替换

  2. <setdynvars sourcetype="random_number" start="3" end="100">

  3. <var name="id" />

  4. </setdynvars>

  5. <request subst="true">

  6. <http url="/push?id=%%_id%%" version="1.1" method="POST" />

  7. </request>

  8.  
  9. 注意使用变量的方式是:下划线加变量名,并且包含在一对%%中。另外,request必须指定为需要进行动态替换(即subst="true"),否则不会进行动态替换。上面的例子中在3到100中随机产生一个数字,并保存在变量id中,请求URL的参数中使用这个变量达到每次请求带有随机的参数。

  10.  
  11. 从函数中获取随机内容:

  12. <setdynvars sourcetype="erlang" callback="ts_user_server:get_unique_id">

  13. <var name="uid" />

  14. </setdynvars>

  15.  
  16. 从文件中获取:

  17. <options>

  18. <option name="file_server" id="userdb" value="user.csv" />

  19. </options>

  20. <setdynvars sourcetype="file" fileid="userd" delimiter=";">

  21. <var name="user" />

  22. <var name="passwd" />

  23. </setdynvars>

  24. <request subst="true">

  25. <http url="login?user=%%_user%%&passwd=%%_passwd%%"

  26. version="1.1"

  27. method="GET"

  28. >

  29. </request>

  30.  
  31. 还可以将服务器响应的信息保存下来,在后续的请求中完成动态替换。

  32. <request>

  33. <dyn_variable name="date" header="date" />

  34. <http url="/test" method="GET" version="1.1" />

  35. </request>

  36. <request subst="true">

  37. <http url="/home/?date=%%_date%%" method="GET" version="1.1" />

  38. </request>

  39. 在第一个请求中,从服务器响应信息的http头部中取出date对应的内容,保存在名为date的变量中,在下一个请求的参数中完成动态替换。

  40.  
  41. Tsung主要由tsung_controller和tsung两个application共同完成压力测试,其中tsung_controller主要负责配置文件的解析,监控数据的统计,日志的记录等;tsung主要负责压力的产生,并完成与服务器的通信。两个应用一些关键的进程及进程树如下图所示:

  42. Tsung运作的大概流程是:

  43.  
  44. 1) 启动tsung_controller应用,初始化相关进程,然后由ts_config_server完成配置文件的解析

  45.  
  46. 2) 根据配置需要启动对服务器的监控

  47.  
  48. 3) 根据配置在不同节点上创建erlang虚拟机进程,并启动tsung应用,然后由ts_launcher进程和ts_launcher_static进程开始产生压力,这两个进程会不断创建出ts_client进程,最终在ts_client进程中模拟用户的行为完成与服务器的通信。

  49.  
  50. tsung中采用了erlang/otp自带的xmerl模块完成xml的解析。该模块使用较简单,调用xmerl_scan的string函数或者file函数完成xml的解析,解析后的内容是一个xmlelement的record,里面包含了所有的元素,对应的属性等信息。从中获取我们需要的信息即可。

  51.  
  52. tsung中多台物理机共同完成压力测试,或者是通过erlang的方式对服务器进行监控。最终都是由ts_config_server进程远程到对应的物理机上,创建一个erlang虚拟机进程,然后进行rpc调用完成相应的控制。这个过程具体实现是调用了slave:start(Host, Name, Args)完成的。

  53.  
  54. slave模块默认使用rsh(remote shell)的方式登录到Host指定的目标机器上,运行erlang虚拟机进程。我们也可以在启动时带上-rsh参数切换使用的登录方式

发布了52 篇原创文章 · 获赞 23 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/anndy_/article/details/88417949