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%)

这样,利用docker进行jmeter分布式测试就成功运行起来了

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐