1,什么是分布式
用单个 JMeter 客户端控制多个远程 JMeter 引擎。通过远程运行 JMeter,从而在服务器上模拟更大的负载。
- 将测试样本保存到本地机器
- 从单台机器管理多个 JMeterEngine
- 无需将测试计划复制到每个服务器 - 客户端将其发送到所有服务器
2,为什么要做分布式
实现更大负载;
原理图:
3,怎么做
3-1,准备工作
负责控制的服务器,我们称之为控制机;负责脚本运行的机器,我们称之为负载机;
3-1-1,安装java
为控制机和负载机配置相同的java
3-1-2,安装jmeter
为控制机和负载机配置相同的jmeter,可本地下载后,scp到需要使用到服务器;
3-1-3,配置环境变量
将java和jmeter配置到环境变量,linux下配置到/etc/profile文件;
3-1-4,检查注意事项
- 系统上的防火墙已关闭或打开了正确的端口。
检查防火墙状态:firewall-cmd --state firewall-cmd --state
关闭防火墙:systemctl stop firewalld
- 所有客户端都在同一个子网上。
- 如果使用192.xxx或10.xxx IP 地址,则服务器位于同一子网中。如果服务器不使用192.xx或10.xx IP 地址,应该没有任何问题。
- 确保 JMeter 可以访问服务器。
- 确保在所有系统上使用相同版本的 JMeter 和 Java。混合版本将无法正常工作。
- 您已为 RMI 设置 SSL或禁用它。
3-2,配置控制机和负载机
-
检查服务器dns配置是否打开:/etc/resolv.conf中nameserver是否打开,未打开时,需要打开;
- 存在参数文件时,需存放到控制机和负载机相同目录下;
- 在jmeter.properties中配置远程主机remote_hosts=ip1,ip2
-
选择是否启用SSL,默认启用
选择启用时,操作如下:
-
创建密钥;
该脚本位于bin目录中,可用于 Windows 系统(称为bin/create-rmi-keystore.bat)和类 Unix 系统(称为bin/create-rmi-keystore.sh)。它将生成一个密钥对,有效期为 7 天,默认密码短语为“ changeit ”。建议从bin目录中调用它;
运行后,可一直回车,遇到yes/no时,输入y,完成后,bin目录下生成rmi_keystore.jks文件,说明执行成功;
-
复制密钥;
复制rmi_keystore.jks到所有负载的jmeter/bin目录下;
若运行时,提示找不到rmi_keystore.jks文件时,可在bin/下jmeter.properties中设置server.rmi.ssl.keystore.file=rmi_keystore.jks的绝对路径
-
配置system.properties文件;
在控制机和负载机下在bin/下system.properties最后追加java.rmi.server.hostname=本机IP
-
检查是否成功,jmeter/bin目录下运行 jmeter-server.bat(在 unix 上 为jmeter-server );如下图所示代表成功;
选择禁用时,操作如下:
-
在bin/下jmeter.properties中将server.rmi.ssl.disable注释打开,并修改为true;
-
检查是否成功,jmeter/bin目录下运行 jmeter-server.bat(在 unix 上 为jmeter-server );如下图所示代表成功;
-
3-3,运行脚本
未配置环境变量时:/srv/jmeter/apache-jmeter-5.4.3/bin/jmeter -n -t jmeter1.jmx -r -l result.jtl
配置环境变量时:jmeter -n -t jmeter1.jmx -r -l result.jtl
带参数执行(参数引用:${__P(threadNum, 1)}):jmeter -n -t jmeter1.jmx -r -l result.jtl -JthreadNum=100 -JloopNum=1 -JrampupTime=0
线程数:threadNum;循环次数:loopNum;启动间隔时间:rampupTime
生成报告(跨服务器需要用-G进行传参): jmeter -n -t jmeter-login.jmx -r -l /srv/jmeter/result.jtl -JthreadNum=100 -JloopNum=1 -JrampupTime=0 -e -o /srv/jmeter/reports
3-4,查看报告
运行后,生成报告,可复制到本地进行查看;
4,优缺点
优点:
1,支持更大负载;
2,使用no gui模式,可减少本地资源占用;
缺点:
1,修改脚本没有界面形式便捷;
2,生成报告不够便捷,需另改名或删除之前的报告;
3,报告查看不够方便;
5,一些坑
问题一:java.net.UnknownHostException:Name or Service not known;
解决:控制机和负载机需要修改配置文件:在/etc/resolv.conf中设置nameserver
/etc/resolv.conf:DNS客户机配置文件
nameserver:定义dns服务器IP地址
domain:定义本地域名
search:定义域名搜索列表
sortlist:对返回域名进行排序
问题二:rmi_keystore.jks已经在bin目录下,依然找不到,rmi_keystore.jks (No such file or directory)
解决:将在属性“server.rmi.ssl.keystore.file”中引用rmi_keystore.jks
问题三:本地进行传参使用-J可以,且分布式也能正常运行,但是传参就不生效;
解决:向服务器传参需要使用-G