老大交代了个接口性能测试的小任务,本来呢他提议用LR,但我对这么大体积的玩意儿真不待见,所以就倒腾起JMeter。

   具体任务内容就不多说了,基本要求是有1200的并发。但是我们发现JMeter运行800个线程左右就顶不上去了,基本运行一会就卡死。百度之(不以用百度为耻),貌似可以用JMeter分布式测试来达成目的,它所谓的分布式架构,其实也就是有一个Master或者Controller,控制其余多台机器运行,即所谓的 Agent或者Slave 来分担 JMeter自身的压力,由此扩展其性能,获取更大的并发用户数,只需要做一些配置,还有多态运行着Jmeter的物理机即可,配置如下:

   1. 首先要在环境中所有设备上运行 JMeter 作为 Load Generator,确定其中一台设备作为 Controller,其他的设备作为 Agent,主要务必要保证所有JMeter版本一致。然后运行所有 Agent设备 上的%JMeter_Home%/bin/JMeter-server.bat文件——此处假定使用两台设备 192.168.0.1 和 192.168.0.2 作为 Agent,192.168.0.100是Controller(局域网通常是一个子网)。

  2. 在Controller 设备的%JMeter_Home%/bin/目录下找到 JMeter.properties 文件并打开,查找“remote_hosts=”这个字符串,我们会看到这样一行“remote_hosts=127.0.0.1”,这是默认的远程Agent设备IP。这里需要修改为“remote_hosts=192.168.0.1:1099,192.168.0.2:1099”,其中的 1099 为 JMeter 的 Controller 和 Agent 之间进行通讯的默认 RMI 端口号。

  3. 保存以上文件,并重新启动 Controller 机器上的 JMeter.bat打开JMeter,打开 Run -> Remote Start 菜单项,已经可以看到远程启动菜单下面有192.168.0.1 ,192.168.0.1两个IP地址。

  4、如果要让某个Agent执行,点击对应的IP地址就可以启动,如果要运行所有的Agent,可以点击Run 菜单下的“Remote Run All”菜单。

  这时候我们就遇到一个问题,例如我们要求性能是并发数1200,然后我们有两台Agent(此时Controller设备是不执行参与生成并发数据的),那我们写性能测试脚本的时候,是把并发数写成600,然后把脚本复制到每一台Agent设备?还是写一个并发数1200的脚本,在Controller上运行即可,Controller会自动分配性能压力?抑或者写一个并发数为600在Controller端运行,同样配置下发到每个Agent上呢?实践证明是最后一种情况,即每一个Agent上都运行相同并发数,总和是我们的性能需求即可,但是不需要手动复制脚本

  查找资料有些博文说有时候代理的机器太少,需要将Controller设备也当作Agent来满足性能要求,也就是说有一台设备需要兼任Controller和Agent。这种情况我没有实践过,理论上应该也是可以的,通信上做一个回环就可以了。此处备注上使用方法:

  需要修改 JMeter.properties文件,将Controller的IP地址写入。然后,需要打先打开Controller %JMeter_HOME%/bin目录下的jmeter-server.bat,然后再打开JMeter.bat,此时,进入Run -> Remote Start菜单,可以看到Controller也作为远程机器进行运行。


参考:http://jmeter.apache.org/usermanual/remote-test.html