JMeter分布式压测部署
1. 说明

分布式压测,即通过单个jmeter 客户端就可以控制多个远程的jmeter服务器,使它们同步的对服务器进行压力测试。
我们负责启停/分发脚本的jmeter客户端一般称为控制机(control),而负责接收并执行这些脚本的机器,则为代理机(agent);
通过远程运行jmeter,测试人员可以跨越多台计算机复制测试,这样就可以模拟一个比较大的服务器压力,一个jmeter客户端实例,理论上可以控制任意多的远程jmeter实例,并通过他们收集测试数据。这样一来,就有了如下特性:
- 保存测试采样数据到本地机器。
- 通过单台机器管理多个jmeter执行引擎。
- 没有必要将测试计划复制到每一台机器,jmeter GUI客户端会将它发往每一台jmeter服务器。
- 每一台jmeter远程服务器都执行相同的测试计划,jmeter不会在执行期间做负载均衡,每一台服务器都会完整地运行测试计划。
2. 操作步骤
前置条件
- 在所有期望运行jmeter作为负载机的机器上安装jmeter,并确定其中一台机器作为控制机control,其他机器作为代理机agent;
- 所有机器上的jmeter版本需保持一致;
- 所有机器上的jdk版本需保持一致;
- 确保jmeter及jdk的环境变量配置正确;
- 如果需要使用csv进行参数化,参数文件必须拷贝到每台代理机agent上,且路径必须一致;
- 需确保所有机器的防火墙都处于关闭状态;
- 确保控制机control与所有代理机agent都处于同一局域网内。
2.1. 详细步骤
2.1.1. 启动所有代理机agent上的jmeter-server文件
文件位置:/jmeter目录/bin/jmeter-server
Windows:启动 jmeter-server.bat 文件,右键单击选择管理员身份运行;
MacOs/Linux:启动 jmeter-server.sh 文件,启动命令./jmeter-server.sh
2.1.2. 修改控制机control上的jmeter.properties文件
文件位置:/jmeter目录/bin/jmeter.properties
Windows:双击打开文件,找到如图的 remote_hosts,修改为代理机的IP地址,填写默认端口1099,如代理机IP地址为 192.168.20.38 及 192.168.20.39,则修改为 192.168.20.38:1099,192.168.20.39:1099,如图

# jmeter.properties
remote_hosts=127.0.0.1
# 修改为
remote_hosts=192.168.20.38:1099,192.168.20.39:1099
MacOs/Linux:使用vim命令打开文件进行修改,如下
# 切换至jmeter所在路径的bin目录下
cd /jmeter路径/bin
# 打开文件
vim jmeter.properties
# 输入 i 修改remote_hosts后保存
使用键盘的 esc + :,进入命令模式,输入 wq! 后,进行回车

# 查看代理机agent的IP地址
# 1、Windows
ipconfig
# 2、Linux/MacOs
ifconfig
2.1.3. 打开控制器control上的jmeter远程运行/命令行运行
Windows:运行bin目录下的jmeter.bat文件打开jmeter;
MacOs/Linux:启动jmeter,启动命令./jmeter.sh

启动之后,点击【运行】的选项,便可以看到我们在 jmeter.properties 文件中配置的代理机的信息,我设置了一个,所以这边只显示这一个,IP为我自定义的IP(192.168.60.241,端口为默认的1099)
我们可以通过点击【远程启动所有】来启动所有代理机agent来进行测试,也可以通过【远程启动】选择某一代理机来执行测试。
命令行执行
# 非gui模式运行jmeter
# 所有分布式节点
JMeter -n -t [JMX脚本路径] -r -l 测试输出文件路径 -j 日志路径
# 指定ip分布式
JMeter -n -t [JMX脚本路径] -R ip:端口 -l 测试输出文件路径 -j 日志路径
- -n : 表示non gui mode 非图形化模式
- -t : testplan 后跟要运行的jmeter脚本路径和脚本名称
- -l : 指定生成测试结果的保存文件,jtl 文件格式
- -r : 启动所有远程的代理机agent(用在分布式测试场景下,不是分布式只是单点就不需要-r)
- -R : 指定某些机器
- -H : 设置Jmeter使用的代理主机
- -P : 设置Jmeter使用的代理主机的端口
- -e : 测试结束后,生成测试报告
- -o : 指定测试报告的存放位置
2.2. 执行结果说明
控制机control会将jmeter脚本分发至每一台要参与本次测试的代理机agent,在执行的过程中不会进行负载均衡,即脚本设置的线程组为100,那么每台代理机agent也将会启动100个线程来进行测试;
- 远程启动测试后,所有代理机会执行与控制机一样的脚本;
- 测试执行结束后,控制机control会收集所有的代理机agent的执行结果并做汇总;
- 执行日志信息,可在生成的jmeter.log跟jmeter-server.log查看,内含代理机的所有执行信息。
举例说明:
控制器control的脚本设置的线程组为100,接口总执行次数控制在10000,代理机信息有两台,那么测试执行结束之后,最终的结果将会是两台代理机agent的总和;
线程总数:100+100=200
接口执行次数:10000+10000=20000
其余信息雷同。
3. 报错解析及处理
3.1. java.io.FileNotFoundException
Server failed to start: java.rmi.server.ExportException: Listen failed on port: 0; nested exception is:
java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
An error occurred: Listen failed on port: 0; nested exception is:
java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
系统在jmeter安装目录下的bin目录下找不到rmi_keystore.jks文件,这是由于没有通过SSL的RMI的有效密钥库,且未禁用SSL导致的。
解决方案1:在bin目录下执行create-rmi-keystore.bat/create-rmi-keystore.sh文件,按提示生成密钥,会在bin目录下生成一个rmi_keystore.jks文件。
Windows:右键单击 create-rmi-keystore.bat 文件,选择以管理员身份运行;
MacOs/Linux:进入bin目录内,启动 create-rmi-keystore.sh 文件,命令./create-rmi-keystore.sh
解决方案2:不使用SSL,打开 bin目录下的 jmeter.properties 找到 server.rmi.ssl.disable=false ,改为 true。


# 禁用SSL
# 原有
server.rmi.ssl.disable=false
# 修改为 true
server.rmi.ssl.disable=true
3.2. 报错permission denied
当代理机agent为Linux系统或者将服务器作为代理机等情况时,文件没有授权没有可执行的权限,启动服务也会报错 permission denied 权限不足;
解决方案:给整个jmeter目录赋予可执行的权限
chmod -R 755 apache-jmete5.6.3/(目录即可)
3.3. 报错connection timed out:connect
解决方案
- 查看代理机agent的IP地址,和控制机control的配置文件(jmeter.properties)中设置的IP是否一致
- 检查防火墙是否关闭
3.4. ./jmeter-server启动报错localhost.localdomain is a loopback address
解决方案:启动命令加一个参数
./jmeter-server.sh -Djava.rmi.server.hostname=ip地址(执行机ip)
# IP地址写压力机对应的地址
3.5. ./jmeter-server启动报错Unrecognized VM option
解决方案:JDK版本不对,重新更换1.8版本JDK配置好环境变量
3.6. 代理机太少,需要将作为Control的电脑也当作Agent
同样需要修改JMeter.properties文件,将Control的IP地址写入。
这时,需要打先打开Control电脑中JMeter内bin目录下的 jmeter-server.bat / jmeter-server.sh(根据自己的操作系统来),
然后再打开 JMeter.bat / JMeter.sh,
此时,进入【运行】 -> 【远程启动】菜单,可以看到Control也作为远程机器进行运行。
3.7. 警告信息
Could not find ApacheJmeter_core.jar …
… Trying JMETER_HOME=..
Found ApacheJMeter_core.jar
解决方案:这个是开始没有找到ApacheJmeter_core.jar,后来去JMETER_HOME目录下去查找,最后找到了,如果不希望看到Could not find的字样,可以配置一下jmeter_home的路径(即bin目录的上一级目录),这样启动jmeter-server服务时,就只会看到Found ApacheJMeter_core.jar
3.8. 自定义端口。
3.8.1. 查看1099端口是否被占用
# 查看1099端口是否被占用
netstat -ano | findstr "1099"
tasklist | findstr "1099"
3.8.2. 修改agent机器上的jmeter.properties文件
修改 jmeter.properties 文件中的两个参数,修改为新的端口号,比如修改为1888
# jmeter.properties
server_port=1888
server.rmi.localport=1888
3.8.3. 修改control机器上的jmeter.properties文件
修改 jmeter.properties 文件中的 remote_hosts 参数,修改为新的端口号
# jmeter.properties
remote_hosts=192.168.20.38:1888,192.168.20.39:1888
修改完成后重启jmeter即可
3.9. 在Control端上控制某台机器Run,提示"Bad call to remote host"。
解决方案:
检查被控制机器上的 jmeter-server 服务有没有启动,或者 jmeter.properties 中 remote_hosts 的配置错误。
3.10. Agent机器启动Jmeter-server服务时,后台提示:"could not find ApacheJmeter_core.jar"
解决方案:确定在Agent机器安装jdk,并设置环境变量。
3.11. 远程启动时报错
ERROR - jmeter.gui.action.RemoteStart: Failed to initialise remote engine java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested exception is:
java.net.ConnectException: Connection refused: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.newCall(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Unknown Source)
at org.apache.jmeter.engine.ClientJMeterEngine.getEngine(ClientJMeterEngine.java:54)
at org.apache.jmeter.engine.ClientJMeterEngine.<init>(ClientJMeterEngine.java:67)
at org.apache.jmeter.gui.action.RemoteStart.doRemoteInit(RemoteStart.java:180)
at org.apache.jmeter.gui.action.RemoteStart.doAction(RemoteStart.java:80)
at org.apache.jmeter.gui.action.ActionRouter.performAction(ActionRouter.java:81)
解决方案:jmter-server的服务没有启动,启动代理机agent上的jmeter-server的服务就可以。
更多推荐

所有评论(0)