Jmeter分布式压测
简单来说就是,多台机器同时安装jmeter,选择一台机器作为调度机,其他作为压力机。进行相应的配置后,就可以用调度机操控压力机发起请求。
分布式执行原理
负载机配置
安装JAVA
- 下载并解压JDK
mkdir /usr/lib/jvm/
cd /usr/lib/jvm/
tar -zxvf jdk1.8.0_121.tar.gz
配置jdk的环境变量
#vi /etc/profile
export JAVA_HOME=/usr/lib/jvm/jdk1.8.0_121
export JRE_HOME=/usr/lib/jvm/jdk1.8.0_121/jre
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
export PATH=$PATH:$JAVA_HOME/bin
- 再执行
source /etc/profile
刷新配置文件 - 通过
java -version
查看是否设置成功
安装Jmeter
下载jmeter.tgz
文件,并将文件上传至/data/
#将jmeter文件解压,并将解压后的文件拷贝至指定路径/data/
tar xvf apache-jmeter-4.0.tgz
配置jmeter的环境变量,将下述内容复制粘贴
#vi /etc/profile
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib/rt.jar:$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$JMETER_HOME/lib/logkit-2.0.jar:
export PATH=$PATH:$JAVA_HOME/bin:$JMETER_HOME/bin:
export JMETER_HOME=/data/apache-jmeter-4.0
- 再执行
source /etc/profile
刷新配置文件 - 通过
jmeter -v
查看是否设置成功
在jmeter目录创建testplan testresult
子目录 , 将测试脚本login.jmx
上传至testplan
,进入bin文件下执行测试输出测试结果命令
cd /data/apache-jmeter-4.0/bin
jmeter -n -t ./testplan/login.jmx -l ./result/test.jtl -e -o ./testresult/
分布式配置
调度机Controller
- 在多台机器中按照上述步骤配置jmeter,选择其中一台为调度机,其他为执行机
- 在调度机上修改
bin/jmeter.properties
, 添加执行机的IP及端口 , 1099是默认的rmi通信端口
remote_hosts=192.168.174.130:1000,192.168.3.148:1888
案例中 , 192.168.174.130:1000
即是执行机IP和端口号
- 取消
server.rmi.ssl.disable=false
的中注释并将false改为ture
# Remote Hosts - comma delimited
remote_hosts=192.168.5.95:1099,192.168.5.103:1099
server.rmi.ssl.disable=true
- 开启执行脚本机器上的
server
服务,bin/jmeter-server
- 在控制机执行分布式命令
#使用 -r 启动所有从机执行脚本
jmeter -n -t testplan/comic.jmx -r -l testResult/result1.jtl
#指定从机IP
jmeter -n -t testplan/comic.jmx -R 10.15.243.53,10.15.230.78 -l testResult/result1.jtl
执行机Agent
- 修改
jmeter.properties
server_port=1000
server.rmi.localport=1000
server.rmi.ssl.disable=true
- 然后执行命令 , 启动服务
sudo jmeter-server -Djava.rmi.server.hostname=192.168.174.130 #从机自身IP
遇到的问题及解决
An error occurred: Cannot start. localhost is a loopback address
In latest version, you can run your script with:指定本地IP
解决方案:
sudo jmeter-server -Djava.rmi.server.hostname=192.168.174.130 #从机自身IP
java.io.FileNotFoundException: rmi_keystore.jks
1、Jmeter4.0,启动slave报错java.io.FileNotFoundException: rmi_keystore.jks
-
解决方法一:slave的
jmeter.properties
中,设置server.rmi.ssl.disable=true
原因:jmeter4.0以上的版本,默认启用RMI连接的安全通信,需要创建密钥库。所以将SSL禁用即可。 -
解决方法二:手动生成秘钥和证书。执行
create-rmi-keystore.bat
(Windows适用)或create-rmi-keystore.sh
(Linux适用)
Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
在使用java远程启动linux服务器上的jmeter服务是报Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
查询该报错基本都是tomcat操作 , 编辑jmeter/bin/jmeter-server
文件,在顶部添加JAVA_HOME
和JRE_HOME
即可
其它说明
1.调度机(master)和执行机(slave)最好分开,由于master需要发送信息给slave并且会接收slave回传回来的测试数据,所以mater自身会有消耗,所以建议单独用一台机器作为mater。
-
参数文件:如果使用csv进行参数化,那么需要把参数文件在每台slave上拷一份且路径需要设置成一样的。
-
每台机器上安装的Jmeter版本和插件最好都一致,否则会出一些意外的问题。
-
若是脚本中设置的并发线程数是100,采用3台slaver机器去施加压力,那么对于服务端来说,此时的并发线程数是300。
-
为了减少出错的可能性,最好按照如下Jmeter 分布式要求:
- 各个机器在相同目录下安装相同版本的jdk;
- 各个机器在相同的目录下安装相同版本的jmeter;
- 配置/etc/hosts的IP和hostname的映射。
- 修改各个机器的jmeter的默认内存参数,从512m调整为合适大小。