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
脚本即可成功。