一個JMeter實例可能無法產生足夠的負載來對你的應用程序進行壓力測試。如本網站所示,一個JMeter實例將能夠控制許多其他的遠程JMeter實例,并對你的應用程序產生更大的負載。JMeter使用Java RMI[遠程方法調用]來與分布式網絡中的對象進行交互。JMeter主站和從站的通信如下圖所示:
我們需要為每個Slave/Server打開2個端口。
Server_port=1099
server.rmi.localport=50000
在客戶機上打開一個端口,讓從機將結果發送給主機。
client.rmi.localport=60000
通過在多臺機器上運行JMeter的多個實例作為服務器,我們可以根據需要產生大量的負載。
Docker
docker在這里有什么用?
Docker有點像一個虛擬機。但與虛擬機不同的是,Docker不是創建一個完整的虛擬操作系統,而是允許應用程序使用與它們所運行的系統相同的Linux內核,只要求應用程序與主機上尚未運行的東西一起運送。這使性能得到了極大的提升,并減少了應用程序的大小
Docker是一個基礎設施的管理者。它能夠將一個軟件和它的所有依賴物打包成一個容器來運行。你可以將打包成docker鏡像的軟件部署到任何安裝了docker的機器上。它將軟件與硬件分離,因此開發者可以放心,應用程序將在任何機器上運行,無論該機器是否有任何定制的設置,可能與用于編寫和測試代碼的機器不同。
Docker在JMeter分布式測試中的作用
如果我們看一下上面的設置--要做分布式負載測試--我們需要1個主站和N個從站來產生巨大的負載。每臺JMeter從機都需要安裝特定版本的Java和JMeter。特定的端口應被打開,JMeter服務器應運行,準備并等待主站發送指令。
手動設置一些機器可能看起來很容易。如果我們要為50臺、100臺、1000臺機器做這件事呢?想象一下,如果我們將來需要在所有的機器上升級JMeter版本,會發生什么?這就是docker出現的原因。
我們基本上在一個叫做Dockerfile的文件中設置了JMeter分布式測試的整個基礎設施。檢查這些dockerfile,并閱讀注釋以了解每一步的作用。
Dockerfile用于JMeter基礎:
在分布式測試中,所有的環境都要有相同版本的Java、JMeter和插件等。主站和從站之間的唯一區別是暴露的端口和運行的進程。因此,讓我們創建一個Docker文件,其中有主站和從站的所有共同步驟。讓我們把它稱為jmbase鏡像,我們需要做以下工作來建立我們的基礎鏡像。
我們需要Java8 - 所以讓我們打開jdk-8-jre瘦身版,以保持盡可能小的體積。
我們可能需要一些實用程序,如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客戶端/主站的Dockerfile
Master dockerfile應繼承自基礎鏡像,并應暴露60000端口:
# Use vinsdocker base image FROM vinsdocker/jmbase MAINTAINER TestAutomationGuru # Ports to be exposed from the container for JMeter Master EXPOSE 60000
Dockerfile for JMeter Server / Slave:
服務器docker文件應該從基礎鏡像中繼承,并且應該暴露1099和50000端口。jmeter-server應該正在運行
# Use vinsdocker base image FROM vinsdocker/jmbase MAINTAINER TestAutomationGuru # Ports to be exposed from the container for 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主服務器創建一個容器
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鏡像中包含了一個運行了30秒的樣本測試,其中有5個并發用戶,你可以在容器中看到。路徑。/sample-test/sample-test.jmx
如果 - 你需要從主機復制任何文件到docker容器 - 你可以發出以下命令。例如:我把測試復制到我的JMeter主容器中。這個命令將把我的本地jmeter測試(docker-test.jmx)復制到主容器的這個路徑中:
/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
用下面的命令進入容器內部,我們可以看到文件是否被成功復制了:
sudo docker exec -it master /bin/bash
讓我們在主服務器上運行測試,看看它是否工作正常[不是在分布式模式下]。Docker容器將能夠運行JMeter測試,因為它擁有運行JMeter測試的所有軟件和依賴:
jmeter -n -t sample-test/sample-test.jmx Creating summariserCreated the tree successfully using sample-test/sample-test.jmx Starting the test @ Thu Dec 21 1759 UTC 2017 (1513876499683) Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445 summary + 1 in 0001 = 1.5/s Avg: 265 Min: 265 Max: 265 Err: 0 (0.00%) Active: 1 Started: 1 Finished: 0 summary + 336 in 0029 = 11.4/s Avg: 112 Min: 87 Max: 325 Err: 0 (0.00%) Active: 5 Started: 5 Finished: 0 summary = 337 in 0030 = 11.2/s Avg: 113 Min: 87 Max: 325 Err: 0 (0.00%) summary + 4 in 0000 = 210.5/s Avg: 97 Min: 93 Max: 109 Err: 0 (0.00%) Active: 0 Started: 5 Finished: 5 summary = 341 in 0030 = 11.3/s Avg: 113 Min: 87 Max: 325 Err: 0 (0.00%) Tidying up ... @ Thu Dec 21 1730 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 summariserCreated 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 1748 UTC 2017 (1513875708955) Remote engines have been started Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445 summary + 4 in 0011 = 0.4/s Avg: 182 Min: 98 Max: 232 Err: 0 (0.00%) Active: 15 Started: 15 Finished: 0 summary + 1021 in 0020 = 51.5/s Avg: 111 Min: 85 Max: 283 Err: 0 (0.00%) Active: 0 Started: 15 Finished: 15 summary = 1025 in 0030 = 33.7/s Avg: 111 Min: 85 Max: 283 Err: 0 (0.00%) Tidying up remote @ Thu Dec 21 1720 UTC 2017 (1513875740196) ... end of run
如果你已經注意到,我們在同一臺主機上創建了所有的容器。也就是說,JMeter和JMeter從機都在同一臺機器上運行。因此,所有的系統資源將被這些容器共享。
總結
在這篇文章中,我們的目的是使用Docker來創建JMeter分布式測試基礎設施。如果你按照上面的步驟,你就會明白,使用docker創建測試基礎設施是非常容易和快速的。我們把整個基礎設施寫在一個文件中,可以進行版本控制。然后我們從該文件中創建一個實例(容器)。Docker確保該容器具有所有的軟件和依賴性等。你可能會問,在一臺機器上運行多個jmeter服務器實例以產生更多的負載是否可以?不,這是不可以的。這根本沒有幫助。事實上,一個JMeter實例比在同一主機上運行多個JMeter實例能夠產生更多的負載。
那么,為什么我們要使用docker并做這些事呢?正如我上面所說,我們在這里的目的是了解docker在JMeter測試中的作用。當我們使用AWS/Digitalocean這些云計算服務提供商時,我們可以理解docker的真正用途,在那里你可以按需創建任意數量的虛擬機。
審核編輯:黃飛
-
服務器
+關注
關注
12文章
9205瀏覽量
85558 -
ip地址
+關注
關注
0文章
303瀏覽量
17069 -
負載測試
+關注
關注
0文章
18瀏覽量
9475 -
Docker
+關注
關注
0文章
472瀏覽量
11865
原文標題:基于Docker的JMeter分布式壓測
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論