首页 > 其他分享 >巧用docker+jmeter快速实现分布式百万级并发

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

时间:2024-06-06 15:32:23浏览次数:8  
标签:bin jmeter VERSION build docker JMETER 巧用

分享背景

碰到的问题:

一个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<[email protected]>
 
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<[email protected]>
 
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报告输出路径;

标签:bin,jmeter,VERSION,build,docker,JMETER,巧用
From: https://blog.csdn.net/weixin_45014379/article/details/136886803

相关文章

  • jmeter连接数据库查询数据库表数据
    1、先下载mysql-connector-java-5.1.7插件放到jmeter目录的lib下面,下载地址(https://downloads.mysql.com/archives/c-j/),因为我的jmeter是放在Windows的,所以我下载第二个​2、下载完后解压文件,复制文件夹下面的mysql-connector-java-5.1.7-bin存放到jmeter的lib目录下(忘记jmet......
  • DockerCompose中部署Jenkins(Docker Desktop在windows上数据卷映射)
    场景Docker+Jenkins+Gitee+Maven项目配置jdk、maven、gitee等拉取代码并自动构建以及遇到的那些坑:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/128399052Windows10(家庭版)中DockerDesktop(docker)的配置、安装、修改镜像源、使用:https://blog.csdn.net/BADAO......
  • docker
    查看linxu系统:lsb_release-aDistributorID:UbuntuDescription:Ubuntu22.04.4LTSRelease:22.04Codename:jammy1、安装docker:1.1更新软件包:sudoaptupdate#从包管理器(APT)下载最新的包列表,获取是否有任何新的或更新的包可供安装或升级。......
  • Linux 安装 docker-compose
    什么是DockerComposeDockerCompose是一个单独的开源项目,DockerCompose可以高效管理和定义多个容器作用:批量容器编排web服务、redis、mysql、nginx等等多个容器docker-compose.ymlversion:'3.1'services:web:build:.ports:-"5000:5000"volumes:-.:/code-......
  • 如何解决 Docker Compose文件无法拉取:解决运维技术领域的Bug :Failed to pull Docker C
    如何解决DockerCompose文件无法拉取:解决运维技术领域的Bug:FailedtopullDockerComposeYAMLfilefromGitHubrepository原创作者:猫头虎作者微信号:Libin9iOak作者公众号:猫头虎技术团队更新日期:2024年6月6日博主猫头虎的技术世界......
  • Docker Hub 国内镜像设置方法,解决Docker镜像拉取失败
    由于某些原因,DockerHub官方仓库在国内已经无法拉取,如果是国内网络环境,可配置国内镜像使用,从而解决Docker镜像拉取失败或缓慢问题。配置Docker镜像源如果不存在/etc/docker/daemon.json这个配置文件,可以直接使用下面的命令:#创建目录sudomkdir-p/etc/docker#写入镜像配......
  • 04.docker的主要组成部分
    docker体验docker是传统的CS架构分为dockerclient和dockerserver,跟mysql一样查看版本命令:dockerversion查看docker下载的是社区版,ce代表社区rpm-qa|grepdocker查看docker系统命令dockersystemdockerinfo(如果要做监控)docker主要组件docker主要组件有:......
  • 构建HTTP Server容器Docker构建一个简单的HTTP Server。
    构建HTTPServer容器Docker构建一个简单的HTTPServer。HTTPServer在访问根路径/时返回"Hello,World!"。提供完整的Dockerfile和启动命令。步骤1:创建HTTPServer的Python脚本首先,创建一个目录来存放HTTPServer文件:mkdirhttp_servercdhttp_server在这个目录中,创建一......
  • Docker 启蒙教程 (1)
    Docker启蒙教程(1)本教程致力于以通俗易懂的方式使读者上手Docker。本文使用CentOS7系统演示。第一章什么是DockerDocker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows操作系统的机器......
  • 服务器部署-docker-容器版本
    后端部署准备docker环境,拉取所需镜像正式安装docker环境:1)较旧的Docker版本称为docker或docker-engine。如果已安装这些程序,请卸载它们以及相关的依赖项。[root@localhost~]#sudoyumremovedocker\docker-clientdocker-client-latestdocker-commondocker-la......