压测不同请求量级的服务,需要模拟的用户并发请求数量也会差异很多。同时单机压测存在压测宿主机CPU和内存配置有限制,随着模拟用户线程数增加会让压测机存在很大性能瓶颈,所以需要通过jmeter分布式压测特性进行应用,支撑模拟更多用户进行压测
分布式压测配置 Controller机器配置找到%JMETER_HOME%/bin/jmeter.properties文件修改如下配置:
remote_hosts=192.168.100.36 server.rmi.ssl.disable=true # To change the default port (1099) used to access the server: #server.rmi.port=1234 如果server启动端口修改,则需要修改默认的端口
jmeter5.0以上版本需要生成证书(待完善 --前期报错未记录) Agent机器配置
找到%JMETER_HOME%/bin/jmeter.properties文件修改如下配置:
# RMI port to be used by the server (must start rmiregistry with same port) server_port=1099 #代表启动jmeter-server默认监听口 server.rmi.ssl.disable=true
若修改为端口10000启动服务后可以通过查看,对应服务监听了10000端口
分布式压测配置常见问题 1、jmeter远程启动提示“no such object in table”
解决方法:remote_hosts=192.168.100.36:1099 去掉配置host的端口
目前在默认在%JMETER_HOME%/bin/jmeter.properties指定了端口
# To change the default port (1099) used to access the server: #server.rmi.port=1234 如果需要修改默认的端口则需要修改2、远程启动服务时提示“java.net.ConnectException: Connection refused: connect”
可能原因:1、Slave未启动服务
2、启动服务但是同样报错,网络不同,检查agent和controller启动监听网口IP是否在同一网段
而我遇到的情况是,agent和controller存在多个网卡多个IP时,各自启动服务时监听网卡IP不在同一网段
服务端(Slave)配置:
方法一: jmeter-server -Djava.rmi.server.hostname=192.168.100.xxx 方法二: jmeter-server文件中添加 RMI_HOST_DEF=-Djava.rmi.server.hostname=192.168.x.x (和控制端可以通信的IP) 但具体使用哪种方法,有什么区别?
很多没有说明清楚jmeter在什么环境使用如上配置,接下来分别查看安装bin目录下jmeter-server.sh和jmeter-server.bat文件内容如下:
jmeter-server.sh分析
- 发现文件中包含RMI_HOST_DEF变量,且启动命令中使用了RMI_HOST_DEF变量,可以初步判断当时在linux上启动jmeter server时可以通过这种方式指定启动的IP
${DIRNAME}/jmeter ${RMI_HOST_DEF} -Dserver_port=${SERVER_PORT:-1099} -s -j jmeter-server.log "$@"
#!/bin/sh
删除掉部分内容
## To change the RMI/Server port:
##
## SERVER_PORT=1234 jmeter-server
##DIRNAME=`dirname $0`
# If the client fails with:
# ERROR - jmeter.engine.ClientJMeterEngine: java.rmi.ConnectException: Connection refused to host: 127.0.0.1
# then it may be due to the server host returning 127.0.0.1 as its address# One way to fix this is to define RMI_HOST_DEF below
#RMI_HOST_DEF=-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx${DIRNAME}/jmeter ${RMI_HOST_DEF} -Dserver_port=${SERVER_PORT:-1099} -s -j jmeter-server.log "$@"
jmeter-server.bat(部分实际运行内容)分析
1、(文件内容向下滚动)发现最后实际运行通过调用call jmeter -s -j jmeter-server.log %JMETER_CMD_LINE_ARGS%或者call jmeter -Dserver_port=%SERVER_PORT% -s -j jmeter-server.log %JMETER_CMD_LINE_ARGS%启动服务;
2、JMETER_CMD_LINE_ARGS通过脚本可以看出用于接受执行脚本文件时,cmd控制台传入的参数,例如jmeter-server -Djava.rmi.server.hostname=192.168.100.xxx命令中对应-Djava.rmi.server.hostname部分
3、是否可以通过如下方式设置达到目的,但最终发现始终失败,只有通过jmeter-server -Djava.rmi.server.hostname=192.168.xx.xxx能实现。按道理来将应该有其他解决方式,要不然每次加参数比较麻烦,待继续实践哈,给自己留点问题(2022.2.25)
setlocal if exist jmeter-server.bat goto winNT1 echo Changing to JMeter home directory cd /D %~dp0 :winNT1 if exist %JMETER_HOME%libextApacheJMeter_core.jar goto setCP echo Could not find ApacheJmeter_core.jar ... REM Try to work out JMETER_HOME echo ... Trying JMETER_HOME=.. set JMETER_HOME=.. if exist %JMETER_HOME%libextApacheJMeter_core.jar goto setCP echo ... trying JMETER_HOME=. set JMETER_HOME=. if exist %JMETER_HOME%libextApacheJMeter_core.jar goto setCP echo Cannot determine JMETER_HOME ! goto exit :setCP echo Found ApacheJMeter_core.jar REM No longer need to create the rmiregistry as it is done by the server REM set CLASSPATH=%JMETER_HOME%libextApacheJMeter_core.jar;%JMETER_HOME%libjorphan.jar REM START rmiregistry %SERVER_PORT% REM rem On NT/2K grab all arguments at once set JMETER_CMD_LINE_ARGS=%* if not "%SERVER_PORT%" == "" goto port call jmeter -s -j jmeter-server.log %JMETER_CMD_LINE_ARGS% goto end :port call jmeter -Dserver_port=%SERVER_PORT% -s -j jmeter-server.log %JMETER_CMD_LINE_ARGS% :end rem No longer needed, as server is started in-process rem taskkill /F /IM rmiregistry.exe :exit
控制端(Controller)配置
修改jmeter.bat文件
增加配置项:set rmi_host=-Djava.rmi.server.hostname=1.X.X.X(和server可正常通信的IP) 修改配置项:set ARGS=%DUMP% %HEAP% %NEW% %SURVIVOR% %TENURING% %PERM% %CLASS_UNLOAD% %DDRAW% %rmi_host%
3.当jmeter脚本中需要依赖csv等数据文件时,该文件需上传至服务器,并需要设置正确的路径



