分享背景
碰到的问题:
一个JMeter实例可能无法产生足够的负载来对你的应用程序进行压力测试~
解决办法:
1、修改jmeter配置文件里的内存堆
2、引入jmeter分布式压测
带来的问题:
如果我们要做分布式负载测试–我们需要1个主机和N个从机来产生巨大的负载。每台JMeter从机都需要安装特定版本的Java和JMeter。特定的端口应被打开,运行环境要一样,JMeter服务器应运行,准备并等待主机发送指令。
手动设置一些机器可能看起来很容易。如果我们要为50台、100台、1000台机器做这件事呢?想象一下,如果我们将来需要在所有的机器上升级JMeter版本,会发生什么?这就是docker出现的原因。
分布式介绍
一个JMeter实例将能够控制许多其他的远程JMeter实例,并对你的应用程序产生更大的负载。JMeter使用Java RMI[远程方法调用]来与分布式网络中的对象进行交互
通过在多台机器上运行JMeter的多个实例作为服务器,我们可以根据需要产生大量的负载。
Docker
docker在这里有什么用?
Docker有点像一个虚拟机。但与虚拟机不同的是,Docker不是创建一个完整的虚拟操作系统,而是允许应用程序使用与它们所运行的系统相同的Linux内核。这使性能得到了极大的提升,并减少了应用程序的大小
Docker是一个基础设施的管理者。它能够将一个软件和它的所有依赖物打包成一个容器来运行。你可以将打包成docker镜像的软件部署到任何安装了docker的机器上。它将软件与硬件分离。
我们要做的
我们首先要创建jmeter的镜像,收集搭建jmeter镜像的材料。
如何收集:
这里就引入了dockerfile的概念
我们需要在一个叫做Dockerfile的文件中设置JMeter分布式测试的整个基础设施
编写 Dockerfile
由于我们要制作的是JMeter分布式镜像master和slave,所以,需要两个 Dockerfile
创建/master/Dockerfile 文件。
# openjdk 8
FROM openjdk:8
# 更新版本1
MAINTAINER defnngj<defnngj@gmail.com>
ARG JMETER_VERSION="5.2.1"
ENV JMETER_HOME /opt/apache-jmeter-$JMETER_VERSION
ENV JMETER_DOWNLOAD_URL https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
ENV SSL_DISABLED true
RUN mkdir -p /tmp/dependencies \
&& curl -L --silent $JMETER_DOWNLOAD_URL > /tmp/dependencies/apache-jmeter-$JMETER_VERSION.tgz \
&& mkdir -p /opt \
&& tar -xzf /tmp/dependencies/apache-jmeter-$JMETER_VERSION.tgz -C /opt \
&& rm -rf /tmp/dependencies
# TODO: plugins (later)
# && unzip -oq "/tmp/dependencies/JMeterPlugins-*.zip" -d $JMETER_HOME
# Set global PATH such that "jmeter" command is found
ENV PATH $PATH:$JMETER_HOME/bin
VOLUME ["/data"]
WORKDIR $JMETER_HOME
RUN sed 's/#server.rmi.ssl.disable=false/server.rmi.ssl.disable=true/g' ./bin/jmeter.properties > ./bin/jmeter_temp.properties
RUN mv ./bin/jmeter_temp.properties ./bin/jmeter.properties
创建/slave/Dockerfile 文件
# openjdk 8
FROM openjdk:8
# 更新版本1
MAINTAINER defnngj<defnngj@gmail.com>
ARG JMETER_VERSION="5.2.1"
ENV JMETER_HOME /opt/apache-jmeter-$JMETER_VERSION
ENV JMETER_DOWNLOAD_URL https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-$JMETER_VERSION.tgz
ENV SSL_DISABLED true
RUN mkdir -p /tmp/dependencies \
&& curl -L --silent $JMETER_DOWNLOAD_URL > /tmp/dependencies/apache-jmeter-$JMETER_VERSION.tgz \
&& mkdir -p /opt \
&& tar -xzf /tmp/dependencies/apache-jmeter-$JMETER_VERSION.tgz -C /opt \
&& rm -rf /tmp/dependencies
# TODO: plugins (later)
# && unzip -oq "/tmp/dependencies/JMeterPlugins-*.zip" -d $JMETER_HOME
# Set global PATH such that "jmeter" command is found
ENV PATH $PATH:$JMETER_HOME/bin
VOLUME ["/data"]
WORKDIR $JMETER_HOME
EXPOSE 1099 60001
ENTRYPOINT jmeter-server -Dserver.rmi.localport=60001 -Dserver_port=1099 \
-Jserver.rmi.ssl.disable=$SSL_DISABLED
编写构建脚本
其实,有 Dockerfile 文件就可以用 docker build 进行构建了。为了简化操作,我们可以进一步创建 build.sh 来实现构建脚本。
创建/master/build.sh 文件
JMETER_VERSION=${JMETER_VERSION:-"5.5"}
# Example build line
docker build --build-arg JMETER_VERSION=${JMETER_VERSION} -t "defnngj/jmeter-master:${JMETER_VERSION}" .
–build-arg 设置构建时变量
-t 设置镜像名 + TAG。
- 构建 master 镜像
$ bash ./build.sh
创建/slave/build.sh 文件
JMETER_VERSION=${JMETER_VERSION:-"5.5"}
# Example build line
docker build --build-arg JMETER_VERSION=${JMETER_VERSION} -t "defnngj/jmeter-slave:${JMETER_VERSION}" .
- 构建 slave 镜像
$ bash ./build.sh
查看镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
defnngj/jmeter-slave 5.5 9e5c9141fcc4 19 minutes ago 672MB
defnngj/jmeter-master 5.5 c4a2eab57be7 19 minutes ago 673MB
如何启动容器:
启动master容器:
sudo docker run -dit --name master defnngj/jmeter-master /bin/bash
启动slave容器:
sudo docker run -dit --name slave01 defnngj/jmeter-slave /bin/bash
sudo docker run -dit --name slave02 defnngj/jmeter-slave /bin/bash
sudo docker run -dit --name slave03 defnngj/jmeter-slave /bin/bash
运行下面的命令可以看到所有正在运行的容器和打开的端口等:
sudo docker ps –a
运行下面的命令来获得这些容器的IP地址列表:
sudo docker inspect --format ‘{{ .Name }} => {{ .NetworkSettings.IPAddress }}’ $(sudo docker ps -a -q)
从主机复制任何文件到docker容器 - 你可以发出以下命令。例如:我把测试复制到我的JMeter主容器中。这个命令将把我的本地jmeter测试(docker-test.jmx)复制到主容器的这个路径中:
/jmeter/apache-jmeter-5.2.1/bin/docker-test.jmx
sudo docker exec -i master sh -c ‘cat > /jmeter/apache-jmeter-5.2.1/bin/docker-test.jmx’ < docker-test.jmx
进入到master中运行脚本:
sudo docker exec -it master /bin/bash
单机运行:
jmeter -n -t sample-test/sample-test.jmx
多机运行:
我们只需要添加-R[slave01,slave02,slave03]
jmeter -n -t sample-test/sample-test.jmx -R172.17.0.5,172.17.0.6,172.17.0.7
生成报告的完整命令:
jmeter -n -t XXX.jmx -l result.jtl -e -o html
-l 表示生成指定的报告文件,一般使用jtl格式来保存,因为jtl文件可以使用jmeter任意监听器打开;
-e -o : (*注意:测试报告的文件夹必须是空文件夹)
-e 表示生成html报告;
-o 表示html报告输出路径;