本文的原文链接

概述

单个的JMeter实例可能无法生成足够的负载来对应用程序进行压力测试。如本网站所示,一个JMeter实例将能够控制多个远程JMeter实例,并在你的应用程序上产生更大的负载。JMeter使用Java RMI [Remote Method Invocation远程方法调用]与分布式网络中的对象进行交互。

JMeter master和slave之间的通信,如下图所:

我们需要为每个从节点 或者 服务器打开2个端口。
Server_port=1099
server.rmi.localport=50000

在客户端计算机上打开一个端口,以便从属服务器将结果发送给主服务器。
client.rmi.localport=60000

通过在多台机器上将JMeter的多个实例作为服务器运行,我们可以生成尽可能多的负载。

Docker:

Docker在这里起到什么作用?

Docker有点像虚拟机;但与虚拟机不同,而不是创建整个虚拟操作系统,Docker允许应用程序使用与其所运行的系统相同的Linux内核,并且只要求应用程序附带在主机上尚未运行的东西。这极大地提高了性能,并减少了应用程序的占用空间——来自:opensource.com

Docker管理着基础架构;它将能够将软件及其所有依赖项打包成一个容器运行。你可以将要部署的软件打包成一个Docker image(映像),并部署在安装了任何安装了docker的机器上;它可以将软件与硬件分开–因此,开发人员可以放心,应用程序都可以在任何计算机上运行,不管运行的计算机有什么自定义设置不同于编写和测试代码的机器。

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

如果我们看上面的设置–进行分布式负载测试–我们需要1个master,N个slave来生成大量的负载。每个JMeter slave都需要安装相同(指定)版本的Java和JMeter。应该打开指定的端口并运行JMeter服务器,准备就绪并等待主服务器发送指令。

手动设置三五台计算机看起来很容易,那如果我们必须对50/100/1000台计算机执行此操作怎么办?还可以想象如果将来需要在所有机器上升级JMeter版本或者Java版本会发生什么!!!?至此,Docker就该派上用场了:

通常,我们在名为 Dockerfile 的文件中配置了JMeter分布式测试的整个基础架构,检查dockerfile并阅读注释以了解每个步骤的作用

用于JMeter Base的Dockerfile:

在分布式测试中,所有的环境都应该使用相同版本的Java、JMeter、plugins等。master和slave之间唯一区别是所公开的端口和正在运行的进程。因此,让我们创建一个Dockerfile,该文件具有master和slave的所有通用步骤,称其为 jmbase 映像,我们将需要执行以下操作来构建基本映像:

  • 需要Java8 –因此,让openjdk-8-jre slim版本,大小保持尽可能小
  • 需要安装一些公共的工具包,例如wget,unzip,telnet等。
  • 需要最新版本的JMeter,为版本创建变量,以便后续维护。
  • 添加一个包含所有插件的文件夹。
  • 添加一个包含测试用例的文件夹。
# Use Java 8 slim JRE
FROM openjdk:8-jre-slim
MAINTAINER TestAutomationGuru# JMeter version
ARG JMETER_VERSION=3.3# Install few utilities
RUN apt-get clean && \apt-get update && \apt-get -qy install \wget \telnet \iputils-ping \unzip# 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 \&& rm apache-jmeter-$JMETER_VERSION.tgz# ADD all the plugins
ADD jmeter-plugins/lib /jmeter/apache-jmeter-$JMETER_VERSION/lib# ADD the sample test
ADD sample-test sample-test# Set JMeter Home
ENV JMETER_HOME /jmeter/apache-jmeter-$JMETER_VERSION/# Add JMeter to the Path
ENV PATH $JMETER_HOME/bin:$PATH

用于JMeter Client/Master的Dockerfile:

Master docker文件应继承基础映像,并应公开端口60000。

# Use vinsdocker base image
FROM vinsdocker/jmbase
MAINTAINER TestAutomationGuru# Ports to be exposed from the container for JMeter Master
EXPOSE 60000

用于JMeter Server/Slave 的Dockerfile:

服务器docker文件应该继承基础映像,并应在jmeter-server运行的时候公开端口1099和50000。

# Use vinsdocker base image
# 使用vinsdocker基本映像
FROM vinsdocker/jmbase
MAINTAINER TestAutomationGuru# Ports to be exposed from the container for JMeter Slaves/Server
# 从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

正如上述的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 master创建一个容器。
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映像中包含了一个测试样本,该测试可以在5个并发用户的情况下运行30秒,您可以在容器内部看到它。
    路径:/sample-test/sample-test.jmx
  • 为了以防万一 – 你需要将某些文件从主机复制到docker容器,你可以发出以下命令。
    例如: 我将 test 复制到我的JMeter master容器中。
    此命令会将我的本地jmeter测试(docker-test.jmx)复制到master容器中的路径下:/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
  • 在master中运行测试并查看它是否可以正常工作(非分布式模式下)。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容器在分布式环境中运行测试。我们只需要附加 -R[slave01,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 slave都在同一台机器上运行。因此,所有系统资源将由这些容器共享。

总结

在本文中,我们的目的是使用Docker创建JMeter分布式测试基础架构。如果你按照上述步骤操作,你将理解使用docker创建测试基础架构并且是非常容易和快速的。我们将整个基础架构写入一个可以进行版本控制的文件中。然后,我们从文件中创建一个实例(容器)。 Docker确保容器拥有所有软件和依赖项等。

你可能会问,是否可以在一台机器上运行多个jmeter 服务实例来产生更多的负载! 不,这不行。这一点用也没有。实际上,在同一台机器上,一个JMeter实例将比运行多个JMeter实例产生更多的负载。
那么我们为什么要使用docker来做这些事情呢?
如上所述,我们的目标是了解docker在JMeter测试中的工作方式。当我们使用AWS/digitalocean云计算服务时,我们可以理解docker的真正用途,在这些提供商中,你可以根据需要创建任意数量的vm。我们将在下一篇文章中看到!

JMeter:在AWS中使用Docker进行分布式负载测试

JMeter:使用Docker进行分布式负载测试相关推荐

  1. JMeter分布式负载测试(吞吐量控制器)

    在本节中,我们将学习如何使用吞吐量控制器在JMeter中创建分布式负载测试计划. 出于测试目的,我们将在我们网站 www.yiibai.com 的URL下的某些网页上创建分布式负载.这些网页包括: 主 ...

  2. 性能测试——JMeter脚本录制和HTTP负载测试

    实验目的 (1)了解Jmeter性能测试工具的用途和简单的操作: (2)掌握Jmeter性能测试工具测试过程: (3)能够使用Jmeter进行负载测试: 实验步骤 使用Jmeter对MercuryTo ...

  3. 运用Kubernetes进行分布式负载测试

    2019独角兽企业重金招聘Python工程师标准>>> # git clone https://github.com/rootsongjc/distributed-load-test ...

  4. java xmpp_Java XMPP负载测试工具

    java xmpp 在本文中,我们将开发用Java编写的XMPP负载测试工具. 目录 1.简介 2. XMPP负载测试工具 3.先决条件 4. LoadXmppTest Java程序 4.1. 创建一 ...

  5. Java XMPP负载测试工具

    在本文中,我们将开发用Java编写的XMPP负载测试工具. 目录 1.简介 2. XMPP负载测试工具 3.先决条件 4. LoadXmppTest Java程序 4.1. 创建一个新的Maven项目 ...

  6. soapui工具_基于开源的API测试工具!不再为web服务负载测试而发愁

    通过一个可视化.拖拽式的界面,LoadUI允许您实时.交互式地创建.配置和重分配负载测试.在单一测试环境下,LoadUI提供完整的测试覆盖,支持所有标准的协议和技术.它功能强大,能从任意数量的本地和远 ...

  7. 在ASP.NET Core微服务架构下使用数据库切分和扩展, 并用JMeter进行负载测试

    原文链接:https://itnext.io/how-to-scale-an-asp-net-core-microservice-and-sharded-database-load-test-with ...

  8. 使用JMeter进行HTTP负载测试

    在本文中,我将介绍一些如何用 JMeter 来进行 HTTP 负载测试的基础知识.JMeter 是一个java应用程序,用于模拟产生一个 高负载到一个服务器上,以测试这个服务器的承载强度,或用于分析在 ...

  9. jmeter负载测试测试_使用Apache JMeter负载测试Web应用程序

    jmeter负载测试测试 Apache JMeter是用于模拟Web应用程序上的用户负载以测试性能的出色工具. 您可以通过指定用户数量和请求间隔来轻松地构建测试计划,然后JMeter将为每个用户生成一 ...

最新文章

  1. 有存款,才能过得更踏实
  2. 20170623_oracle基础知识_常见问题
  3. python怎么打开交互式窗口-在交互式环境中执行Python程序过程详解
  4. 码栈开发手册(四)---编码方式开发(日期相关函数)
  5. 知识点小记之转义字符
  6. Vue.js 动态组件 异步组件
  7. javascript中的表结构
  8. ysql怎么处理百分数? “%”
  9. LwIP应用开发笔记之六:LwIP无操作系统TCP客户端
  10. 早高峰共享单车潮汐点的群智优化(想法)
  11. VUE的导入(HelloWord)
  12. android vitamio 教程,使用vitamio开发步骤
  13. Visual Studio Code 使用 ESLint 增强代码风格检查
  14. 树的存储_ 双亲表示法 及 双亲孩子表示法
  15. 听一下牛人是怎样自学MIT计算机系全部课程的[转]
  16. 318.最大单词长度乘积
  17. 计算机知识技能大赛总结,计算机知识技能大赛总结
  18. 2018年湖南省高中数学联赛(A)卷试题
  19. 你知道了区块链,现在该了解DCEP央行数字货币了
  20. Android手机屏幕变化监听

热门文章

  1. burp绕过验证码爆破
  2. 导入导出Nvidia显卡设置的方法
  3. cas:500295-52-3,三(2-(4-三氟甲基苯基)吡啶)合铱 fac-ir(p-cf3ppy)3
  4. 在php中标签input用法,html input标签的属性有哪些?input标签的用法总结(附实例)...
  5. java卸载程序名称_在java中卸载类?
  6. MySQL之事务 索引 锁_MySql 知识点之事务、索引、锁原理与用法解析
  7. 【shell】shell脚本实战-awk基本介绍
  8. 【linux】循序渐进学运维-基础篇-配置静态IP详解
  9. 可调电源diy_DIY源图
  10. 一维非稳态对流扩散——显示格式+QUICK格式,左、右边界定壁温的Python程序