JMeter 是一个100%的纯 JAVA 应用,对机器 CPU 和内存的消耗比较大,在用 JMeter 做并发测试、负载测试、压力测试等时,模拟的用户数以千计,使用单台机器模拟所有用户会有些力不从心,甚至会引起JAVA内存溢出。
1、JMeter 分布式负载原理
这时,我们可以使用 JMeter 的分布式负载(也叫联机负载)功能,通过单个 JMeter 控制机(Controller)控制多个远程的 JMeter 负载机(Agent),使它们同步对服务器进行性能测试。
首先来看一下控制机和负载机的作用:
控制机(Controller):存放 JMeter 脚本的机器,负责在开始运行前把脚本发送到各个负载机,在运行后回收和统计各个负载机的运行结果。
负载机(Agent):被控制用来运行脚本的机器,负责产生负载。
2、配置负载机(Agent)
了解了控制机和负载机的作用后,接下来学习如何配置负载机。
负载机上安装和配置 JDK 环境变量,JDK 版本建议和控制机的保持一致,避免因版本不一致导致出现其他的问题;
负载机上配置 JMeter 环境,版本也建议和控制机保持一致;
-
启动负载机 JMeter bin 目录下的 jmeter-server.bat 文件;
如果你使用的是4.0版本 JMeter ,在启动 jmeter-server.bat 文件时会出现上面的错误提示。这个是因为 JMeter 在4.0版本中,RMI的默认传输机制将使用SSL,SSL需要密钥和证书才能工作 。
解决这个问题的方式有2种,可以生成 jks 格式的密钥文件,另外也可以去修改负载机 JMeter bin目录下的 jmeter.properties 配置文件。在这里,我们只学习修改配置文件的方式。
修改配置文件只需要将 server.rmi.ssl.disable=false 改成 server.rmi.ssl.disable=true,然后重新启动 jmeter-server.bat 文件即可。
-
把运行过程中使用的测试数据文件和外部jar包等复制到负载机相同的目录下,测试脚本则不需要,运行前控制机会自动把测试脚本发送到负载机。
所有的负载机能否用同一份数据取决于系统的业务,如果数据要保持唯一性(如注册),那么各个负载机的数据不能用同一份,如果数据没有唯一性(如登录),那么可以用同一份。
3、配置控制机(Controller)
在控制机 JMeter bin目录下的 jmeter.properties 配置文件中找到 remote_hosts=......,设置远程负载机的 IP 和端口(默认1099,如要修改该端口需要在负载机配置文件中修改 server_port=xxx)。多个负载机之间用逗号隔开,如192.168.1.30:1099,192.168.1.44:1099。修改配置文件后切记重启 JMeter,否则修改的配置不生效。
重启 JMeter 后,在选择菜单运行(run) 的远程启动(remote start) 中启动负载机,可以逐个负载机运行,也可以全部一起运行。
启动后,控制机会自动把测试的脚本发送到各个负载机上,每个负载机接收到的脚本都是一样的。每个负载机的虚拟用户数等于控制机中配置的线程数N,所以服务器最终承受的用户数是:负载机数量 X 线程数N。
注意:
控制机如果无法连接负载机,在这里补充几种常见的坑。
网络不相通。互相 ping 一下看控制机和负载机网络是否相通,不相通则检查网络,确保控制机和负载机在同一网络环境。
连接被拦截。检查是否开启了杀毒软件或者防火墙,如果开启了就关闭再重新连接。
-
检查是否安装有 vm 虚拟机或将某个盘设置了共享权限。控制机在配置该负载机时,除 IP 地址外,虚拟机 IP 或者共享盘 IP 也会出现在远程连接待选列表中,连接时报错。
这个时候可以关闭虚拟机服务或撤销盘符共享。