一. 分布式测试
分布式应用(distributed application)指的是应用程序分布在不同计算机上,通过网络来共同完成一项任务的工作方式。性能测试当中,负载机的性能会对性能测试的执行产生影响。作为Java应用程序,Jmeter运行时也需要一定的资源,当性能测试的模拟的并发过大时,负载机的CPU,内存等会被大量消耗,经常会出现Java内存溢出的错误,往往导致负载机成为测试瓶颈。Jmeter提供了分布式操作的功能,用户可以通过扩展负载机的方式来解决单台机器负载过大的问题。
二. Jmeter分布式测试模型
按照分布式的架构,Jmeter会将一台机器作为master控制机,其他机器作为slave代理机。Master控制机只有一个,slave代理机可以有多个。
Master控制机的任务,是向salve机发送命令,并从slave机接收返回信息,收集测试数据。Master机最终展示的数据,是全部slave机测试数据的集合。Slave机的任务,是执行接收的命令,并向控制机返回测试结果数据。Slave机是通过命令行执行任务的,所以,不需要启动Jmeter GUI操作界面。
三. Jmeter分布式运行前的配置
首先对Slave机进行配置:
Step1:安装JDK,Jmeter,配置好环境变量。
Step2:通过“ipconfig”命令,查看IP地址。
机器上可能有多个网卡,一般我们都是在内网环境下执行测试的,所以我们需要的是内网IP,不要选错了。
Step3:打开${Jmeter_PATH}/bin/jmeter.properties,找到”remote_hosts=127.0.0.1”,把这一行修改为”remote_hosts=10.27.33.11:1099,1099是默认端口号,可根据需要改成其他端口。
Step4:启动${Jmeter_PATH}/bin/jmeter-server.bat服务。
其他slave机依照此步骤一样配置就好。注意,各机器之间,JDK,Jmeter版本最好保持一致,文件放置的目录也最好保持一致。不过有了Docker,slave机都是从master机复制过来的,所以,一般问题不大。
Master机的配置:
前2步和slave机前2步一样。
Step1:安装JDK,Jmeter,配置好环境变量。
Step2:通过“ipconfig”命令,查看IP地址。
Step3:打开${Jmeter_PATH}/bin/jmeter.properties,找到”remote_hosts=127.0.0.1”, 在master机上,把所有slave机的IP:端口都写在这里,并用逗号分隔。
Step4:启动${Jmeter_PATH}/bin/jmeter-server.bat服务。
配置完毕。在执行前,将测试需要的jmx文件和相关的csv,txt等数据文件放置在各机器上,路径注意要一致。然后,在master机上打开Jmeter,从Run->Remote Start可以看到所有的slave机(IP:端口)。
设置线程生产数据,点击Run->Remote Start->Remote Start All。
执行结束,因为执行了3台负载机,所以最后的samples数量是10x3=30.
Slave机的控制台信息如图。
四. 下面是几个坑,有很多是网上各位前辈总结的,一起列在这里。
(1).环境及数据问题。
前面也提过了,尽量保持各机器之间环境一致,jmx和数据文件放置的目录一致。否则运行时,master控制机会接收不到返回数据。
(2).机器之间出现拒绝连接的Exception
“Connection refused xxxx”,出现这种情况,可能是你的防火墙未关闭;又或者是机器不在一个网段内,最好都用内网IP。
(3).自定义端口
如果用的是自定义端口,找到jmeter.properties文件,修改如下两个配置项,比如改为1089:
server_port=1089
server.rmi.localport=1089
修改后,重启jmeter-sever.bat即可。
(4).jmeter-sever.bat启动后,IP不是内网
这个是多网卡造成的,很多时候启动的是公网的IP,而我们配置的是内网。
修改jmeter-sever.bat,
修改jmeter.bat:
新增set rmi_host=-Djava.rmi.server.hostname=本机ip;
修改set ARGS=%DUMP% %HEAP% %NEW% %SURVIVOR% %TENURING% %PERM% %DDRAW% % rmi_host%
修改后,重启jmeter-sever.bat