基于Docker的JMeter分布式压测实战讲解

一个JMeter实例可能无法产生足够的负载来对你的应用程序进行压力测试。如本网站所示,一个JMeter实例将能够控制许多其他的远程JMeter实例,并对你的应用程序产生更大的负载。JMeter使用Java RMI远程方法调用来与分布式网络中的对象进行交互。JMeter主站和从站的通信如下图所示:

我们需要为每个Slave/Server打开2个端口。

Server_port=1099

server.rmi.localport=50000

在客户机上打开一个端口,让从机将结果发送给主机。

client.rmi.localport=60000

通过在多台机器上运行JMeter的多个实例作为服务器,我们可以根据需要产生大量的负载。

Docker

docker在这里有什么用?

Docker有点像一个虚拟机。但与虚拟机不同的是,Docker不是创建一个完整的虚拟操作系统,而是允许应用程序使用与它们所运行的系统相同的Linux内核,只要求应用程序与主机上尚未运行的东西一起运送。这使性能得到了极大的提升,并减少了应用程序的大小

Docker是一个基础设施的管理者。它能够将一个软件和它的所有依赖物打包成一个容器来运行。你可以将打包成docker镜像的软件部署到任何安装了docker的机器上。它将软件与硬件分离,因此开发者可以放心,应用程序将在任何机器上运行,无论该机器是否有任何定制的设置,可能与用于编写和测试代码的机器不同。

Docker在JMeter分布式测试中的作用

如果我们看一下上面的设置--要做分布式负载测试--我们需要1个主站和N个从站来产生巨大的负载。每台JMeter从机都需要安装特定版本的Java和JMeter。特定的端口应被打开,JMeter服务器应运行,准备并等待主站发送指令。

手动设置一些机器可能看起来很容易。如果我们要为50台、100台、1000台机器做这件事呢?想象一下,如果我们将来需要在所有的机器上升级JMeter版本,会发生什么?这就是docker出现的原因。

我们基本上在一个叫做Dockerfile的文件中设置了JMeter分布式测试的整个基础设施。检查这些dockerfile,并阅读注释以了解每一步的作用。

Dockerfile用于JMeter基础:

在分布式测试中,所有的环境都要有相同版本的Java、JMeter和插件等。主站和从站之间的唯一区别是暴露的端口和运行的进程。因此,让我们创建一个Docker文件,其中有主站和从站的所有共同步骤。让我们把它称为jmbase镜像,我们需要做以下工作来建立我们的基础镜像。

我们需要Java8 - 所以让我们打开jdk-8-jre瘦身版,以保持尽可能小的体积。

我们可能需要一些实用程序,如wget、unzip、telnet等。所以让我们安装它们。

我们需要最新版本的JMeter。为版本创建一个变量--这样以后的维护就会更容易。

添加一个包含所有插件的文件夹。

添加一个包含样本测试的文件夹。

复制代码
<span style="color:#232323"><code class="language-dockerfile"><span style="color:#008000"># Use Java 8 slim JRE</span>
<span style="color:#0000ff">FROM</span> openjdk:<span style="color:#880000">8</span>-jre-slim
<span style="color:#0000ff">MAINTAINER</span> TestAutomationGuru
 
<span style="color:#008000"># JMeter version</span>
<span style="color:#0000ff">ARG</span> JMETER_VERSION=<span style="color:#880000">3.3</span>
 
<span style="color:#008000"># Install few utilities</span>
<span style="color:#0000ff">RUN</span> apt-get clean && \
    apt-get update && \
    apt-get -qy install \
                wget \
                telnet \
                iputils-ping \
                unzip
 
<span style="color:#008000"># Install JMeter</span>
<span style="color:#0000ff">RUN</span>   <span style="color:#0000ff">mkdir</span> /jmeter \
      && <span style="color:#0000ff">cd</span> /jmeter/ \
      && wget https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-<span style="color:#008000">$JMETER_VERSION</span>.tgz \
      && tar -xzf apache-jmeter-<span style="color:#008000">$JMETER_VERSION</span>.tgz \
      && <span style="color:#0000ff">rm</span> apache-jmeter-<span style="color:#008000">$JMETER_VERSION</span>.tgz
 
<span style="color:#008000"># ADD all the plugins</span>
<span style="color:#0000ff">ADD</span> jmeter-plugins/lib /jmeter/apache-jmeter-<span style="color:#008000">$JMETER_VERSION</span>/lib
 
<span style="color:#008000"># ADD the sample test</span>
<span style="color:#0000ff">ADD</span> sample-test sample-test
 
<span style="color:#008000"># Set JMeter Home</span>
<span style="color:#0000ff">ENV</span> JMETER_HOME /jmeter/apache-jmeter-$JMETER_VERSION/
 
<span style="color:#008000"># Add JMeter to the Path</span>
<span style="color:#0000ff">ENV</span> PATH $JMETER_HOME/bin:$PATH</code></span>

用于JMeter客户端/主站的Dockerfile

Master dockerfile应继承自基础镜像,并应暴露60000端口:

复制代码
<span style="color:#232323"><code class="language-dockerfile"><span style="color:#008000"># Use vinsdocker base image</span>
<span style="color:#0000ff">FROM</span> vinsdocker/jmbase
<span style="color:#0000ff">MAINTAINER</span> TestAutomationGuru
 
<span style="color:#008000"># Ports to be exposed from the container for JMeter Master</span>
<span style="color:#0000ff">EXPOSE</span> <span style="color:#880000">60000</span></code></span>

Dockerfile for JMeter Server / Slave:

服务器docker文件应该从基础镜像中继承,并且应该暴露1099和50000端口。jmeter-server应该正在运行

复制代码
<span style="color:#232323"><code class="language-dockerfile"><span style="color:#008000"># Use vinsdocker base image</span>
<span style="color:#0000ff">FROM</span> vinsdocker/jmbase
<span style="color:#0000ff">MAINTAINER</span> TestAutomationGuru
 
<span style="color:#008000"># Ports to be exposed from the container for JMeter Slaves/Server</span>
<span style="color:#0000ff">EXPOSE</span> <span style="color:#880000">1099</span> <span style="color:#880000">50000</span>
 
<span style="color:#008000"># Application to run on starting the container</span>
<span style="color:#0000ff">ENTRYPOINT</span> <span style="color:#008000">$JMETER_HOME</span>/bin/jmeter-server \
                        -Dserver.rmi.localport=50000 \
                        -Dserver_port=1099</code></span>

正如你在上面的Dockerfile中看到的,如果我们需要改变Java/JMeter的版本/端口,我只需要更新dockerfile,Docker会处理剩下的事情。

我已经将这些Dockerfile推送到vinsdocker账户下的docker hub中。因此,任何人都可以提取这些文件并建立JMeter分布式测试基础设施。

确保docker已经安装在你的机器上。一旦安装完毕,剩下的就很容易了。你只需要遵循这里的步骤。

逐一运行以下命令:

sudo docker run -dit --name slave01 vinsdocker/jmserver /bin/bash

sudo docker run -dit --name slave02 vinsdocker/jmserver /bin/bash

sudo docker run -dit --name slave03 vinsdocker/jmserver /bin/bash

Docker会自动提取我上传的docker镜像,并为JMeter服务器创建3个容器。如果你需要更多的容器,继续执行上述命令,只需改变容器名称即可。

运行下面的命令,为JMeter主服务器创建一个容器

sudo docker run -dit --name master vinsdocker/jmmaster /bin/bash

运行下面的命令可以看到所有正在运行的容器和打开的端口等:

sudo docker ps --a

运行下面的命令来获得这些容器的IP地址列表:

sudo docker inspect --format '{{ .Name }} => {{ .NetworkSettings.IPAddress }}' $(sudo docker ps -a -q)

我在docker镜像中包含了一个运行了30秒的样本测试,其中有5个并发用户,你可以在容器中看到。路径。/sample-test/sample-test.jmx

如果 - 你需要从主机复制任何文件到docker容器 - 你可以发出以下命令。例如:我把测试复制到我的JMeter主容器中。这个命令将把我的本地jmeter测试(docker-test.jmx)复制到主容器的这个路径中:

/jmeter/apache-jmeter-3.3/bin/docker-test.jmx

sudo docker exec -i master sh -c 'cat > /jmeter/apache-jmeter-3.3/bin/docker-test.jmx' < docker-test.jmx

用下面的命令进入容器内部,我们可以看到文件是否被成功复制了:

sudo docker exec -it master /bin/bash

让我们在主服务器上运行测试,看看它是否工作正常不是在分布式模式下。Docker容器将能够运行JMeter测试,因为它拥有运行JMeter测试的所有软件和依赖:

jmeter -n -t sample-test/sample-test.jmx

Creating summariser <summary>

Created the tree successfully using sample-test/sample-test.jmx

Starting the test @ Thu Dec 21 17:14:59 UTC 2017 (1513876499683)

Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445

summary + 1 in 00:00:01 = 1.5/s Avg: 265 Min: 265 Max: 265 Err: 0 (0.00%) Active: 1 Started: 1 Finished: 0

summary + 336 in 00:00:29 = 11.4/s Avg: 112 Min: 87 Max: 325 Err: 0 (0.00%) Active: 5 Started: 5 Finished: 0

summary = 337 in 00:00:30 = 11.2/s Avg: 113 Min: 87 Max: 325 Err: 0 (0.00%)

summary + 4 in 00:00:00 = 210.5/s Avg: 97 Min: 93 Max: 109 Err: 0 (0.00%) Active: 0 Started: 5 Finished: 5

summary = 341 in 00:00:30 = 11.3/s Avg: 113 Min: 87 Max: 325 Err: 0 (0.00%)

Tidying up ... @ Thu Dec 21 17:15:30 UTC 2017 (1513876530127)

... end of run

就这样了。现在我们已经准备好使用docker容器在分布式中运行我们的测试。我们只需要添加-Rslave01,slave02,slave03

jmeter -n -t sample-test/sample-test.jmx -R172.17.0.5,172.17.0.6,172.17.0.7

Creating summariser <summary>

Created the tree successfully using sample-test/sample-test.jmx

Configuring remote engine: 172.17.0.5

Configuring remote engine: 172.17.0.6

Configuring remote engine: 172.17.0.7

Starting remote engines

Starting the test @ Thu Dec 21 17:01:48 UTC 2017 (1513875708955)

Remote engines have been started

Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445

summary + 4 in 00:00:11 = 0.4/s Avg: 182 Min: 98 Max: 232 Err: 0 (0.00%) Active: 15 Started: 15 Finished: 0

summary + 1021 in 00:00:20 = 51.5/s Avg: 111 Min: 85 Max: 283 Err: 0 (0.00%) Active: 0 Started: 15 Finished: 15

summary = 1025 in 00:00:30 = 33.7/s Avg: 111 Min: 85 Max: 283 Err: 0 (0.00%)

Tidying up remote @ Thu Dec 21 17:02:20 UTC 2017 (1513875740196)

... end of run

如果你已经注意到,我们在同一台主机上创建了所有的容器。也就是说,JMeter和JMeter从机都在同一台机器上运行。因此,所有的系统资源将被这些容器共享。

总结

在这篇文章中,我们的目的是使用Docker来创建JMeter分布式测试基础设施。如果你按照上面的步骤,你就会明白,使用docker创建测试基础设施是非常容易和快速的。我们把整个基础设施写在一个文件中,可以进行版本控制。然后我们从该文件中创建一个实例(容器)。Docker确保该容器具有所有的软件和依赖性等。你可能会问,在一台机器上运行多个jmeter服务器实例以产生更多的负载是否可以?不,这是不可以的。这根本没有帮助。事实上,一个JMeter实例比在同一主机上运行多个JMeter实例能够产生更多的负载。

那么,为什么我们要使用docker并做这些事呢?正如我上面所说,我们在这里的目的是了解docker在JMeter测试中的作用。当我们使用AWS/Digitalocean这些云计算服务提供商时,我们可以理解docker的真正用途,在那里你可以按需创建任意数量的虚拟机

最后:【可能给你带来帮助的教程】

相关推荐
小智老师PMP3 分钟前
2026深度解析|PMP第八版与NPDP核心侧重点本质区别(管理类证书怎么选)
开发语言·分布式·算法·职场和发展·产品经理
Y3815326626 分钟前
Docker Compose 服务依赖与健康检查:healthcheck 让容器按正确顺序启动
运维·docker·容器
2601_965235482 小时前
快速了解docker
docker·容器·dubbo
会周易的程序员2 小时前
5Draft(五帝)测试报告
服务器·c++·分布式·raft·共识算法·共识·算力服务器
李昊哲小课2 小时前
Deepin 25 上安装 Docker CE 实战记录
运维·docker·容器·deepin
重生之我来学Python4 小时前
Docker套装的简介、安装、超级详细教程
linux·docker·容器·eureka·github
想要打 Acm 的小周同学呀8 小时前
Kafka消息队列出现挤压如何解决?
分布式·kafka
起名真的太难了8 小时前
Docker 项目部署
docker·容器·eureka
狼与自由8 小时前
docker 安装milvus
docker·milvus
摇滚侠9 小时前
《SpringBoot 3:入门与应用实战》第 14 章 打包与部署 制作 Docker 镜像 阅读笔记 43
spring boot·笔记·docker