当前位置:   article > 正文

巧用docker+jmeter快速实现分布式百万级并发_jmeter docker

jmeter docker

分享背景

碰到的问题:

一个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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

创建/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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

编写构建脚本

其实,有 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}" .
 
  • 1
  • 2
  • 3
  • 4
  • 5

–build-arg 设置构建时变量
-t 设置镜像名 + TAG。

  • 构建 master 镜像
$ bash ./build.sh
  • 1

创建/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}" .
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 构建 slave 镜像
$ bash ./build.sh
  • 1

查看镜像

$ 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
  • 1
  • 2
  • 3
  • 4
  • 5

如何启动容器:

启动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报告输出路径;

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/923576
推荐阅读
相关标签
  

闽ICP备14008679号