1.JMETER 为什么需要分布式
单台压测机通常会遇到客户端瓶颈,受制于客户机的性能。可能由于网络带宽,CPU,
内存的限制不能给到服务器足够的压力,这个时候你就需要用到分布式方案来解决客户机
的瓶颈,压测的结果也会更加接近于真实情况.
由于JMeter 并发的时候每并发一个用户(线程组)都需要消耗压测机的cpu、内存、带宽
等服务器资源。 随并发用户数量增加,单台压力机已经没法满足用户的业务需求,
所以,需要通过分布式多台压测机。
假设当前单台压测机的内存配置为:8G,机器未部署其他的应用,只安装JDK 和
JMETER 等应用,该单台压测机并发的用户数量不能超过1000,如果并发用户数量
超过1000,就会导致单台压测机内存消耗尽,JMETER 工具出现假死现象,
聚合报告中间的响应时间就会失真,压测结果失去参考价值。所以,当并发用户数量
超过1000 用户的时候,就需要采用分布式进行压测,一台压测机作为控制机器,
另外一台机器做为代理机器。
2.JMETER分布式原理
分布式压测分为两块: 控制器(master)和代理(slave)
1、master 负责把脚本分发给 slave执行。
2、slave 负责执行脚本,产生对服务器的实际压力,slave 运行 non GUI model,
点击 jmeter-server.bat 即可。slave 执行脚本后,把压测的结果发送给 master。
3、master 作为控制器不加入实际测试(也可以加入),只负责发送和收集 agent 信息。
控制器-->slave(jmeterslave1/2/3/4)-->测试服务器。
3.处理过程
一:调度机master启动以后,会拷贝本地的jmx文件分发到远程的slave机器上;
二:slave机器拿到脚本以后启动命令行模式去执行脚本,对于每台slave机器拿到
的脚本都是一样的;
三:执行时,slave会把执行获得的数据结果传给master机器,master机器会收集
所有slave机器的信息并汇总,这样master机器上就存在一份所有slave机器汇总的
数据结果。
在所有需要做分布式的机器上部署java和jmeter,要求需要保证每台机器上部署的jmeter
版本相同插件版本也相同,最好部署在同一路径下(这样如果有csv参数化比较方便)
jmeter底层用java开发,耗内存、cpu,如果项目要求大并发去压测服务端的话,
jmeter单节点难以完成大并发的请求,这时就需要对jmeter进行分布式测试
调度机(Controller):主要负责性能测试脚本的分发,及各个执行机(Slave)的测试
结果收集汇总,报告产出。
执行机(Slave):主要负责执行性能测试脚本及断言等(命令行模式执行,无界面),
并将执行结果反馈给调度机(Controller),若断言执行成功则不返回请求响应数据
及详细断言信息。
4.jmeter 配置 slave 代理压测机
我的jmeter版本是 apache-jmeter-5.1,在 slave 机器上需要修改配置
jmeter.properties,修改以下两处配置:
找到 server_port 去掉 #,设置端口 。
找到 server.rmi.ssl.disable=false 改成 true
vi jmeter.properties
server_port=1099
server.rmi.ssl.disable=true
双击 jmeter-server.bat ,这个 ip 有用,要配到 master 机器上的配置文件里
(若报错'jmeter' is not recognized,需要配置 jmeter 环境变量)
(启动中间提示的IP 地址必须是内网的IP 地址,如果是外网IP 地址需要关闭虚拟网卡)
5.jmeter 配置master控制器压测机
打开 master的配置文件 jmeter.properties 找到 remote_hosts ,
把刚才第二个步骤的 ip 配进去;
vi jmeter.properties
remote_hosts=127.0.0.1:1099,192.168.1.15:1099
server_port=1099
server.rmi.ssl.disable=true
6.JMETER分布式部署注意事项
1、 slave 和master两台机器网络必须互通,telnet 端口是否通
2、Jmeter 版本必须一致
3、JDK 版本一致,JDK1.8 对应(JMETER 5.1),必须配置JDK 的环境变量,必须配置JMETER
环境变量
4、如果master也需要进行压测需启动jmeter.server,slave 机只需启动jmeter.server
即可
5、 服务上显示 运行成功提示
Starting the test on host 127.0.0.0:1099
6、jmeter.server 启动是显示外网IP,(问题的根源在于:我安装的VMware的一个
windows虚拟机的网络设置成了“Bridge 并勾选 Replicate physical network IP address
所以在controller机器的网络路由设置中,显示的网络连接为:VirtualBox Host-Oly Network,
在这个连接上右键,选择“Disable“,禁用掉,然后重新运行jmeter-server.bat,
在窗口中发现IP已经正确了,这样问题就解决了)
(https://www.cnblogs.com/insane-Mr-Li/p/10713147.html)
7、分布式压测时,slave返回的 response data 在 views Result tree 中查看是空。
这个问题取消 jmeter.properties 中 mode=Standard 的注释,然后重启 jmeter master
即可解决(慎用此开关,经过测试600多的qps就能打满千兆带宽)
参数化文件路径必须是绝对路径,不要用相对路径。
7.JMETER SLAVE和MASTER 分布式启动压测
Master 启动jmeter.bat 编写脚本
线程数:1
运行-远程启动所有:127.0.0.1:1099/192.168.1.15:1099
slave 和 master 分布式进行压测的计算公式如下:
聚合报告中间的样本数量=线程数*循环次数*agent(机器台数)=1*1*2=2 2*3*3=12
分布式测试总样本数=线程数 x 循环次数 x slave负载机数量
注意事项:
有问题记得看jmeter.server.log 定位问题