概述
單個的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。我們將在下一篇文章中看到!