一個(gè)JMeter實(shí)例可能無法產(chǎn)生足夠的負(fù)載來對(duì)你的應(yīng)用程序進(jìn)行壓力測(cè)試。如本網(wǎng)站所示,一個(gè)JMeter實(shí)例將能夠控制許多其他的遠(yuǎn)程JMeter實(shí)例,并對(duì)你的應(yīng)用程序產(chǎn)生更大的負(fù)載。JMeter使用Java RMI[遠(yuǎn)程方法調(diào)用]來與分布式網(wǎng)絡(luò)中的對(duì)象進(jìn)行交互。JMeter主站和從站的通信如下圖所示:
我們需要為每個(gè)Slave/Server打開2個(gè)端口。
Server_port=1099
server.rmi.localport=50000
在客戶機(jī)上打開一個(gè)端口,讓從機(jī)將結(jié)果發(fā)送給主機(jī)。
client.rmi.localport=60000
通過在多臺(tái)機(jī)器上運(yùn)行JMeter的多個(gè)實(shí)例作為服務(wù)器,我們可以根據(jù)需要產(chǎn)生大量的負(fù)載。
Docker
docker在這里有什么用?
Docker有點(diǎn)像一個(gè)虛擬機(jī)。但與虛擬機(jī)不同的是,Docker不是創(chuàng)建一個(gè)完整的虛擬操作系統(tǒng),而是允許應(yīng)用程序使用與它們所運(yùn)行的系統(tǒng)相同的Linux內(nèi)核,只要求應(yīng)用程序與主機(jī)上尚未運(yùn)行的東西一起運(yùn)送。這使性能得到了極大的提升,并減少了應(yīng)用程序的大小
Docker是一個(gè)基礎(chǔ)設(shè)施的管理者。它能夠?qū)⒁粋€(gè)軟件和它的所有依賴物打包成一個(gè)容器來運(yùn)行。你可以將打包成docker鏡像的軟件部署到任何安裝了docker的機(jī)器上。它將軟件與硬件分離,因此開發(fā)者可以放心,應(yīng)用程序?qū)⒃谌魏螜C(jī)器上運(yùn)行,無論該機(jī)器是否有任何定制的設(shè)置,可能與用于編寫和測(cè)試代碼的機(jī)器不同。
Docker在JMeter分布式測(cè)試中的作用
如果我們看一下上面的設(shè)置--要做分布式負(fù)載測(cè)試--我們需要1個(gè)主站和N個(gè)從站來產(chǎn)生巨大的負(fù)載。每臺(tái)JMeter從機(jī)都需要安裝特定版本的Java和JMeter。特定的端口應(yīng)被打開,JMeter服務(wù)器應(yīng)運(yùn)行,準(zhǔn)備并等待主站發(fā)送指令。
手動(dòng)設(shè)置一些機(jī)器可能看起來很容易。如果我們要為50臺(tái)、100臺(tái)、1000臺(tái)機(jī)器做這件事呢?想象一下,如果我們將來需要在所有的機(jī)器上升級(jí)JMeter版本,會(huì)發(fā)生什么?這就是docker出現(xiàn)的原因。
我們基本上在一個(gè)叫做Dockerfile的文件中設(shè)置了JMeter分布式測(cè)試的整個(gè)基礎(chǔ)設(shè)施。檢查這些dockerfile,并閱讀注釋以了解每一步的作用。
Dockerfile用于JMeter基礎(chǔ):
在分布式測(cè)試中,所有的環(huán)境都要有相同版本的Java、JMeter和插件等。主站和從站之間的唯一區(qū)別是暴露的端口和運(yùn)行的進(jìn)程。因此,讓我們創(chuàng)建一個(gè)Docker文件,其中有主站和從站的所有共同步驟。讓我們把它稱為jmbase鏡像,我們需要做以下工作來建立我們的基礎(chǔ)鏡像。
我們需要Java8 - 所以讓我們打開jdk-8-jre瘦身版,以保持盡可能小的體積。
我們可能需要一些實(shí)用程序,如wget、unzip、telnet等。所以讓我們安裝它們。
我們需要最新版本的JMeter。為版本創(chuàng)建一個(gè)變量--這樣以后的維護(hù)就會(huì)更容易。
添加一個(gè)包含所有插件的文件夾。
添加一個(gè)包含樣本測(cè)試的文件夾。
# 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應(yīng)繼承自基礎(chǔ)鏡像,并應(yīng)暴露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:
服務(wù)器docker文件應(yīng)該從基礎(chǔ)鏡像中繼承,并且應(yīng)該暴露1099和50000端口。jmeter-server應(yīng)該正在運(yùn)行
# 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會(huì)處理剩下的事情。
我已經(jīng)將這些Dockerfile推送到vinsdocker賬戶下的docker hub中。因此,任何人都可以提取這些文件并建立JMeter分布式測(cè)試基礎(chǔ)設(shè)施。
確保docker已經(jīng)安裝在你的機(jī)器上。一旦安裝完畢,剩下的就很容易了。你只需要遵循這里的步驟。
逐一運(yùn)行以下命令:
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會(huì)自動(dòng)提取我上傳的docker鏡像,并為JMeter服務(wù)器創(chuàng)建3個(gè)容器。如果你需要更多的容器,繼續(xù)執(zhí)行上述命令,只需改變?nèi)萜髅Q即可。
運(yùn)行下面的命令,為JMeter主服務(wù)器創(chuàng)建一個(gè)容器
sudo docker run -dit --name master vinsdocker/jmmaster /bin/bash
運(yùn)行下面的命令可以看到所有正在運(yùn)行的容器和打開的端口等:
sudo docker ps –a
運(yùn)行下面的命令來獲得這些容器的IP地址列表:
sudo docker inspect --format '{{ .Name }} => {{ .NetworkSettings.IPAddress }}' $(sudo docker ps -a -q)
我在docker鏡像中包含了一個(gè)運(yùn)行了30秒的樣本測(cè)試,其中有5個(gè)并發(fā)用戶,你可以在容器中看到。路徑。/sample-test/sample-test.jmx
如果 - 你需要從主機(jī)復(fù)制任何文件到docker容器 - 你可以發(fā)出以下命令。例如:我把測(cè)試復(fù)制到我的JMeter主容器中。這個(gè)命令將把我的本地jmeter測(cè)試(docker-test.jmx)復(fù)制到主容器的這個(gè)路徑中:
/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
用下面的命令進(jìn)入容器內(nèi)部,我們可以看到文件是否被成功復(fù)制了:
sudo docker exec -it master /bin/bash
讓我們?cè)谥鞣?wù)器上運(yùn)行測(cè)試,看看它是否工作正常[不是在分布式模式下]。Docker容器將能夠運(yùn)行JMeter測(cè)試,因?yàn)樗鼡碛羞\(yùn)行JMeter測(cè)試的所有軟件和依賴:
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
就這樣了?,F(xiàn)在我們已經(jīng)準(zhǔn)備好使用docker容器在分布式中運(yùn)行我們的測(cè)試。我們只需要添加-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
如果你已經(jīng)注意到,我們?cè)谕慌_(tái)主機(jī)上創(chuàng)建了所有的容器。也就是說,JMeter和JMeter從機(jī)都在同一臺(tái)機(jī)器上運(yùn)行。因此,所有的系統(tǒng)資源將被這些容器共享。
總結(jié)
在這篇文章中,我們的目的是使用Docker來創(chuàng)建JMeter分布式測(cè)試基礎(chǔ)設(shè)施。如果你按照上面的步驟,你就會(huì)明白,使用docker創(chuàng)建測(cè)試基礎(chǔ)設(shè)施是非常容易和快速的。我們把整個(gè)基礎(chǔ)設(shè)施寫在一個(gè)文件中,可以進(jìn)行版本控制。然后我們從該文件中創(chuàng)建一個(gè)實(shí)例(容器)。Docker確保該容器具有所有的軟件和依賴性等。你可能會(huì)問,在一臺(tái)機(jī)器上運(yùn)行多個(gè)jmeter服務(wù)器實(shí)例以產(chǎn)生更多的負(fù)載是否可以?不,這是不可以的。這根本沒有幫助。事實(shí)上,一個(gè)JMeter實(shí)例比在同一主機(jī)上運(yùn)行多個(gè)JMeter實(shí)例能夠產(chǎn)生更多的負(fù)載。
那么,為什么我們要使用docker并做這些事呢?正如我上面所說,我們?cè)谶@里的目的是了解docker在JMeter測(cè)試中的作用。當(dāng)我們使用AWS/Digitalocean這些云計(jì)算服務(wù)提供商時(shí),我們可以理解docker的真正用途,在那里你可以按需創(chuàng)建任意數(shù)量的虛擬機(jī)。
審核編輯:黃飛
-
服務(wù)器
+關(guān)注
關(guān)注
12文章
9024瀏覽量
85186 -
ip地址
+關(guān)注
關(guān)注
0文章
295瀏覽量
17006 -
負(fù)載測(cè)試
+關(guān)注
關(guān)注
0文章
18瀏覽量
9442 -
Docker
+關(guān)注
關(guān)注
0文章
454瀏覽量
11815
原文標(biāo)題:基于Docker的JMeter分布式壓測(cè)
文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論