jmeter是一款用Java开发的开源测试工具,可以用来做做服务端的性能测试,对接口发压;
但是GUI界面仅仅是为了调试方便,真正测试时图形界面会大大影响软件自身性能,所以我们测试时应适应命令行启动的方式,如下在启动jmeter时会出现的信息:
上述可见,官方建议我们使用
jmeter -n -t [jmx file] -l [results file] -e -o [Path to web report folder]
命令去执行性能测试;
但是jmeter自身也有性能承载的极限,这时候就需要多个jmeter一起运行,且运行结果可以汇总,这就需要靠分布式的方式来解决了
1、拉镜像,装环境
这里利用Docker Hub上已有的两个镜像可以很方便简单的完成jmeter的安装及相关环境配置
这两个镜像分别用来对应压测的master和slave:thperf/master 、thperf/slave
镜像里大概包含了这些内容:
Docker File:
Jmeter Base Docker File
FROM openjdk:8-jre-slim
MAINTAINER TesterHome
ARG JMETER_VERSION=5.3
# Install JMeter
RUN mkdir /jmeter \
&& cd /jmeter/ \
&& wget https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz \
&& tar -xzf apache-jmeter-$JMETER_VERSION.tgz \
# Set ENV
ENV JMETER_HOME /jmeter/apache-jmeter-$JMETER_VERSION/
ENV PATH $JMETER_HOME/bin:$PATH
// Docker build -t jmeterbase ./jmeterbase
Master File:
FROM thperf/jmeterbase
MAINTAINER TestHome
# Ports to be exposed from the container for JMeter Master
EXPOSE 60000
Slave File:
FROM thperf/jmeterbase
MAINTAINER TestHome
# Ports to be exposed from the container for JMeter Slaves/Server
EXPOSE 1099 50000
# Application to run on starting the container
ENTRYPOINT $JMETER_HOME/bin/jmeter-server \
-Dserver.rmi.localport=50000 \
-Dserver_port=1099
镜像会自动帮我们创建路径、安装下载安装jmeter、配置环境变量、设置默认端口为1099
2、启用容器,记录信息
- 如果第一步已经完成(没完成也没关系,这一步的运行命令发现未拉取镜像时会自动去搜索拉取镜像),使用如下命令分别运行master和slave镜像,这里运行两个slave为例:
docker run -d --name jmetermaster thperf/master
docker run -d --name jmeterslave1 thperf/slave
docker run -d --name jmeterslave2 thperf/slave
此时利用docker ps
可以看到3个容器都已经启动
localhost:~ qinzhen$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
0b57393ea566 thperf/slave "/bin/sh -c '$JMETER…" 13 hours ago Up 13 hours 1099/tcp, 50000/tcp jmeterslave2
0f2427c703f9 thperf/slave "/bin/sh -c '$JMETER…" 13 hours ago Up 13 hours 1099/tcp, 50000/tcp jmeterslave1
0481a89b1b69 thperf/master "/bin/bash" 13 hours ago Up 13 hours 60000/tcp jmetermaster
接着我们使用docker inspect --format '{{ .Name }} => {{ .NetworkSettings.IPAddress }}' $( docker ps -a -q)
命令来查看容器的IP地址,记录备用:
localhost:~ qinzhen$ docker inspect --format '{{ .Name }} => {{ .NetworkSettings.IPAddress }}' $( docker ps -a -q)
/jmeterslave2 => 172.17.0.5
/jmeterslave1 => 172.17.0.4
/jmetermaster => 172.17.0.3
/redis => 172.17.0.2
/keen_solomon => 172.17.0.2
/strange_jones =>
2、jmeter文件配置
- 用命令
docker exec -it jmetermaster /bin/bash
命令进去到master容器中,再vim jmeter/apache-jmeter-5.0/bin/jmeter.properties
打开配置文件(slave也一样,将命令中名字替换成slave的名字即可)
localhost:~ qinzhen$ docker exec -it jmetermaster /bin/bash
root@0481a89b1b69:/# vim jmeter/apache-jmeter-5.0/bin/jmeter.properties
- 再配置文件中找到
remote_hosts
,填入上一步中记录的IP地址:
这里顺便再改一个配置,将server.rmi.ssl.disable
设为true,否则启动连接slave的时候会报错:
java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
3、拷贝脚本,启动分布式测试
- 将准备好的jmx脚本拷贝至docker的master目录下
docker exec -i jmetermaster sh -c 'cat > /jmeter/apache-jmeter-5.0/bin/docker-loadtest.jmx' < /Users/qinzhen/Documents/TestDev/jmeter-test/apiLoadTest.jmx
- 命令
docker exec -it jmetermaster /bin/bash
进去到master里,再执行命令
jmeter -n -t /jmeter/apache-jmeter-5.0/bin/docker-loadtest.jmx -R172.17.0.4,172.17.0.5
运行jmeter测试,-R表示指定远端的IP地址
root@0481a89b1b69:/# jmeter -n -t /jmeter/apache-jmeter-5.0/bin/docker-loadtest.jmx -R172.17.0.4,172.17.0.5
Creating summariser <summary>
Created the tree successfully using /jmeter/apache-jmeter-5.0/bin/docker-loadtest.jmx
Configuring remote engine: 172.17.0.4
Configuring remote engine: 172.17.0.5
Starting remote engines
Starting the test @ Sun Aug 18 13:18:00 UTC 2019 (1566134280252)
Remote engines have been started
Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445
summary + 1 in 00:00:00 = 2.9/s Avg: 55 Min: 55 Max: 55 Err: 1 (100.00%) Active: 1 Started: 1 Finished: 0
summary + 3402 in 00:00:28 = 120.1/s Avg: 14 Min: 0 Max: 2011 Err: 3402 (100.00%) Active: 2 Started: 2 Finished: 0
summary = 3403 in 00:00:29 = 118.7/s Avg: 14 Min: 0 Max: 2011 Err: 3403 (100.00%)