JMeter:使用Docker進行分佈式負載測試

本文的原文鏈接
JMeter:使用Docker進行分佈式負載測試

概述

單個的JMeter實例可能無法生成足夠的負載來對應用程序進行壓力測試。如本網站所示,一個JMeter實例將能夠控制多個遠程JMeter實例,並在你的應用程序上產生更大的負載。JMeter使用Java RMI [Remote Method Invocation遠程方法調用]與分佈式網絡中的對象進行交互。

JMeter master和slave之間的通信,如下圖所:
master和slave之間的通信
我們需要爲每個從節點 或者 服務器打開2個端口。
Server_port=1099
server.rmi.localport=50000

在客戶端計算機上打開一個端口,以便從屬服務器將結果發送給主服務器。
client.rmi.localport=60000

通過在多臺機器上將JMeter的多個實例作爲服務器運行,我們可以生成儘可能多的負載。
Jmeter Server/Slave

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)

查看容器的IP

  • 我在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進行分佈式負載測試

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章