一:引言
Jmeter 进行并发测试时对于本地负载机的CPU和内存的消耗比较大,当需要模拟数以千计的并发用户时(相当于同时开启数千计的线程),使用单台机器模拟所有的并发用户就有些力不从心,甚至会引起JAVA内存溢出错误。为了让jmeter提供更大的负载能力,便可以通过jmeter使用多台机器同时产生负载的机制。
那么,是如何实现多台负载机同时运行的呢?当然不会多个人坐在多台负载机面前,一喊开始,大家同时启动jmeter。这种方式很笨,也很难达到真正的同步。其实,我们通过单个jmeter 客户端就可以控制多个远程的jmeter服务器,使它们同步的对被测服务端进行压力测试。
原理图:
通过远程运行jmeter, 这样就可以模拟一个比较大的服务器压力,一个jmeter客户端,理论上可以控制任意多的远程jmeter服务器,并通过他们收集测试数据。这样一来,就有了如下特性:
(1) 保存测试数据到本地机器
(2)通过单台机器管理多个jmeter执行引擎。
(3)没有必要将测试计划复制到每一台机器,jmeter上,客户端会将它发往每一台jmeter服务器。
(4)每一台jmeter远程服务器都执行相同的测试计划,每一台服务器都会完整地运行测试计划。
二:操作步骤
在所有期望运行jmete的机器上安装jmeter(版本必须一致), 并确定其中一台机器作为 controller ,其他的的机器作为agent
(2)运行所有 agent 机器上的%JMeter_Home%/bin/目录下jmeter-server.bat 文件 (假定使用三台机器ip为192.168.1.101 和192.168.1.102,192.168.1.103 作为agent)
确保controller和agent都在一个子网内。
(3)在controller机器上的%JMeter_Home%/bin/目录下jmeter.properties 文件,
查找:remote_hosts=127.0.0.1
修改为:remote_hosts=192.168.1.101:1099,192.168.1.102:1099,192.168.1.103:1099
这里要特别注意端口后,有些资料说明端口1644为jmeter的controller 和agent 之间进行通信的默认RMI端口号,但是在测试时发现,设置为1644运行不成功,改成1099后运行通过。另外还要留意agent的机子是否开启了防火墙等(必须关掉)。
(4)启动controller 机器上的%JMeter_Home%/bin/目录下jmeter.bat,选择菜单“运行”—>“远程启动”,来分别启动agent ,也可以直接选择“远程全部启动”来将所有的agent启动。
这时候,例如我们的测试计划中要求性能是并发数1200,然后我们有3台Agent(此时Controller设备是不执行参与生成并发数据的),那我们写性能测试脚本的时候,把并发数写成1200,Controller会自动分配性能压力,每一个Agent上都运行相同并发数。
假如需要将Controller设备也当作Agent来参与生成并发数据,也就是说有一台设备需要兼任Controller和Agent。这种情况,需要修改JMeter.properties文件,将Controller的IP地址写入。然后,需要打先打开Controller的%JMeter_HOME%/bin目录下的jmeter-server.bat,然后再打开JMeter.bat,此时,进入Run->Remote Start菜单,可以看到Controller也作为远程机器进行运行。