1. 为什么要用分布式?
大家在使用 jmeter 压测过程中,可能会度遇到内存溢出的错误,这是为什么呢?
因为 jmeter 是 java 写的应用,java 应用 jvm 堆内存 heap 受负载机硬件限制,虽然我们可以
调整堆内存大小,但是单机无法支撑数以万计大并发,此时,需要多个负载机进行分压测试,
这样性能瓶颈就不会是我们的负载机了。
假设我们的测试计划会产生 100 个 threads,我们使用 6 台机器进行分布式测试的时候,一
共会产生 100 * 6 = 600 的负载。
超过 2000 并发,可使用分布式。
2. 原理
jmeter 分布式压测时,选择其中一台作为控制机,其余的机器做为执行机,执行时,控制机
会把脚本发送到每个执行机上,执行机获取到脚本就执行脚本(执行机只需要启动
jmeter-server.bat 或者 jmeter-server),执行后,执行机回传执行结果给控制机,控制机会
进行汇总。值得注意的是:如果请求执行成功,不会回传请求的响应信息,所以在查看结果
树中, 响应结果看到是空的。
3. 注意事项
(1) 关闭防火墙
(2) 保证控制机和远程执行机 jdk、jmeter 版本一致,否则会出现一些意外的问题
4. 配置说明
环境说明:
控制机部署到 widows 环境上;执行机部署到 Linux 环境上。
从 JMeter 4.0 开始,RMI 的默认传输机制将使用 ssl。SSL 需要**和证书才能工作,不使
用 ssl 将存在安全漏洞。
(1) 无论是执行机还是控制机均在 jmeter 的安装目录下的 bin 目录编辑 jmeter.properties
文件。
“server.rmi.ssl.disable=true” 使 server.rmi.ssl.disable 为 true.
(2)执行机 运行 bin 目录下 jmeter-server 文件
./jmeter-server -Djava.rmi.server.hostname=172.17.51.15 -Dserver.rmi.localport=6000 -Dserver_port=1299
会出现如下界面,表示运行成功。
java.rmi.server.hostname 即为 jmeter 执行机的 ip.
server_port=1299 (Jmeter-Server 中的 Jmeter 侦听器)
server.rmi.localport 用于答复客户端的请求。
(3)配置控制机
jmeter 的安装目录下的 bin 目录编辑 jmeter.properties 文件.
找到 remote_hosts 项(remote_hosts=执行机 1_ip:端口号,执行机 2_ip:端口号
)。
remote_hosts=172.17.51.15:1299
可在控制机上 telnet 该 ip 和端口,看是否正确
(4) 重启或者打开控制机 Jmeter.
(5) 控制机 Jmeter 界面
“run”->”Remote Start”->172.17.51.15:1299 即为刚才配置的执行机
(6) 控制机运行
“run”->”Remote Start All”
执行机会出现如下界面:
控制机会出现运行结果:
注意事项:
(1) 执行机过了一段时间打印了”Starting.....”之后,一直没有变化,没有 Finish,控制机也
没有执行结果。
查看 jmeter-server.log,发现:
该 ip 又是从哪来的呢?
最终发现,该 ip 虚拟机网卡。
解决方案:
(1) 禁用掉控制机上的虚拟机网卡
(2). 重新运行执行机 server 文件(./jmeter-server -Djava.rmi.server.hostname=172.17.51.15
-Dserver.rmi.localport=1299 -Dserver_port=1599)
(3). 重启控制机的 jmeter,执行 Jmeter 脚本即可成功。