1.簡介
千呼萬喚始出來,這一篇感覺寫了好久,總想寫的清楚明白簡潔,但是還是洋洋灑灑寫了好多,希望大家喜歡吧!本來打算將這一篇文章是放在效能測試中講解和分享的,但是有的童鞋或者小夥伴們私下問的太多了,實在是忍不了也解答煩了,索性就在這裡分享一下吧。權當參考,但是希望對大家有所幫助。
2.為什麼要使用分散式測試
(1)Jmeter是基於java程式執行的,在windows上使用Jmeter進行效能測試時,非常耗費客戶機的CPU和記憶體,如果併發數稍微大一點(比如100、1000...併發),單臺電腦的配置經常無法支援,很容易卡死,即使不卡死也會使電腦執行很慢,導致我們沒辦法進行其它操作。
(2)通過cmd命令列,或者是在Linux上使用Jmeter進行效能測試時,能夠大大縮減所需要的系統資源;但是需要將jmeter指令碼上傳到Linux上使用命令列方式執行,如果指令碼經常改動就要頻繁上傳;測試完成後要把結果資料下載到本地GUI環境中檢視,當結果檔案較大時,下載要花費大量時間,總是有很多不方便。
(3)按照一般的壓力機配置,jmeter的GUI模式下(Windows),最多支援300左右的模擬請求執行緒,再大的話,容易造成卡頓、無響應等情況,這是限於jmeter其本身的機制和硬體配置。
(4)有時候為了儘量模擬業務場景,需要模擬大量的併發請求,這個時候單臺壓力機就顯得有心無力。針對這個情況,jmeter的解決方案是支援分散式壓測,即將大量的模擬併發分配給多臺壓力機,來滿足這種大流量的併發請求場景。
普通壓測:單臺機可以對目標機器產生的壓力比較小,受限因素包括CPU,網路,IO等。
分散式壓測:利用多臺機器向目標機器產生壓力,模擬幾萬使用者併發訪問。
3.分散式壓測的原理
1、分散式測試中,選擇一臺作為管理機(Contorller),其他的機器作為測試執行的代理機(Agent);
2、執行測試時,由Contorller通過命令列將測試指令碼發給Agent,然後Agent執行測試(不需要啟動GUI),同時將測試結果傳送給Contorller;
3、測試完成,可以在Contorller上的監聽器裡面看到Agent發來的測試結果,結果為多個Agent測試結果彙總而成;
4.開始前的準備工作
本簡短教程說明了如何使用多個系統執行壓力測試。在我們開始之前,有幾件事要檢查。
- 系統上的防火牆已關閉或打開了正確的埠。
- 所有客戶端都在同一子網上。
- 如果使用192.xxx或10.xxx IP地址,則伺服器位於同一子網中。如果伺服器不使用192.xx或10.xx IP地址,則應該沒有任何問題。
- 確保JMeter可以訪問伺服器。
- 確保在所有系統上使用相同版本的JMeter和Java。混合版本將無法正常工作。
- 您已經為RMI設定了SSL或將其禁用。
一旦確定系統已準備就緒,就可以進行遠端測試了。本教程假定您已經在所有系統上安裝了JMeter。JMeter的工作方式是一個控制器節點在多個工作節點上啟動測試。
一個控制器節點和多個工作節點
在深入瞭解分步說明之前,最好先定義術語並確保定義清楚。
- 控制器節點:執行JMeter GUI(控制測試)的系統
- 工作節點:執行jmeter-server的系統,該系統從GUI接收命令並將請求傳送到目標系統
- 目標:我們計劃進行壓力測試的Web伺服器
5.普通壓測
普通壓測:單臺機可以對目標機器產生的壓力比較小,受限因素包括CPU,網路,IO等。下邊是巨集哥簡單用圖形描述了一下普通壓測。如下圖所示:
6.Jmeter分散式壓測介紹
在工作中使用jmeter做大併發壓力測試的場景下,單機受限記憶體、CPU、網路IO,會出現伺服器壓力還沒有上去,但是壓測伺服器已經由於模擬的壓力太大宕機了。為了讓jmeter工具提供更強大的負載能力,jmeter提供了多臺機器同時產生負載的機制,下面是架構圖。
原理:比如我在jmeter server配置執行緒數為10,迴圈次數為100,也就是會對測試伺服器發起1000次請求,我有3臺agent伺服器,如果我在server端選擇遠端啟動壓力測試,那麼每臺agent都會對測試伺服器發起10*100次請求,那麼這次壓力測試產生的請求就是10*100*3=3000次。
如果對原理不是很明白,看完下面的操作之後就會理解了。
6.1JMeter分散式執行原理說明
前提:在排程機上安裝JDK(我們這裡使用1.8版本的)+Jmeter(5.3)
1、客戶端機器(window系統)作為一個控制器controller,控制多臺slave機器的操作。
2、Controller和slave機器上最好裝有相同版本的jdk和jmeter,並配置好環境變數,安裝和配置方法跟windows環境類似。
3、controller通過GUI介面啟動slave機器,將jmeter壓測指令碼傳送給每臺啟動的slave,slave獲得指令碼後開始執行。slave本地不需預先儲存指令碼,但是需要有指令碼中的依賴檔案(如csv檔案等)。
4、各臺slave執行完成後,將結果傳回給controller,controller收集後整合顯示出來。
7.Jmeter分散式壓測環境搭建
7.1搭建前說明
伺服器環境說明:做效能測試可以直接在在雲平臺按需購買壓力機,一旦測試結束釋放壓力機即可。當然了這是個視公司資源和公司情況而定,如確實需要提前報備和領導申請經費或者裝置、時間等等。
分散式環境壓力伺服器要求:
- 需要server(控制機)和agent(壓力機),agent搭建在linux(centos 6.5)伺服器環境下,server搭建在windows(server 2012)環境下。
- 壓力測試瓶頸大都在頻寬上面,需要保證壓力機的頻寬要比伺服器的頻寬高,不然壓力上不去。
- 需要保證agent和server都在一個網路中,且在多網絡卡環境需要保證啟動的網絡卡都在一個網段。
- 需要保證server和agent之間的時間同步。
- 關閉防火牆。
7.2windows下配置
1、在Windows系統上安裝相同版本的JDk和Jmeter(參考排程機的安裝)
注意:JDK和Jmeter都要配置環境變數
Jmeter 環境變數的配置:
在系統環境變數中新增:JMETER_HOME=C:\jmeter\apache-jmeter-3.3\bin
在path系統變數中新增如下配置:%JMETER_HOME%\bin;
7.2.1排程機Controller
1.在多臺機器中按照上述步驟配置jmeter,選擇其中一臺為排程機,其他為執行機。巨集哥這裡將自己的本地電腦作為排程機。
2.在排程機上修改JMETER_HOME/bin/jmeter.properties
, 新增執行機的IP及埠 , 1099是預設的rmi通訊埠。
remote_hosts=192.168.174.130:1000,192.168.3.148:1888
程式碼中 , 192.168.174.130:1000
即是執行機IP和埠號。
3.取消server.rmi.ssl.disable=false
的中註釋並將false改為ture,或者你複製一下這一行程式碼,將false改為ture,當然了不要忘記去掉前邊的註釋。
server.rmi.ssl.disable=true
4.開啟執行指令碼機器上的server
服務,JMETER_HOME/bin/jmeter-server
5.在控制機執行分散式命令
#使用 -r 啟動所有從機執行指令碼
jmeter -n -t testplan/comic.jmx -r -l testResult/result1.jtl #指定從機IP
jmeter -n -t testplan/comic.jmx -R 10.15.243.53,10.15.230.78 -l testResult/result1.jtl
7.2.2執行機Agent
1、和排程機同樣的原理,找到對應的程式碼修改jmeter.properties
檔案中的程式碼,如下:
server_port=1000
server.rmi.localport=1000
server.rmi.ssl.disable=true
2、在執行機上自定義埠號
(1)進入Jmeter的bin目錄,找到Jmeter.properties檔案,開啟該檔案修改如下兩個配置項,比如修改埠號為:1355(預設埠號為:1099)(記得取消註釋)
server_port=1355
server.rmi.localport=1355
server.rmi.ssl.disable=true
(2)啟動執行機上的Jmeter-server.bat,如下圖所示,埠號已經修改為:1000.巨集哥這裡是修改成1000。
3、在排程機上新增遠端的負載機
進入Jmeter的bin目錄,找到Jmeter.properties檔案,進行如下配置:
4、在排程機上開啟,Jmeter,如下圖即可啟動遠端的負載機
5、驗證:啟動後如果執行正常,在排程機上可以看到遠端負載機的執行結果,如下圖:
在執行機上有如下顯示:
7.3linux下的配置
1、在Linux下安裝同調度機相同的JDK和Jmeter版本
JDK環境變數的配置參考如下:https://www.cnblogs.com/du-hong/p/14428790.html
Jmeter的環境變數配置,export PATH=/opt/apache-jmeter-3.3/bin/:$PATH(配置檔案位置:/etc/profile)如下圖所示:
驗證:Jmeter -v
2、在執行機上自定義埠號
(1)進入Jmeter的bin目錄,找到Jmeter.properties檔案,開啟該檔案修改如下兩個配置項,比如修改埠號為:1355(預設埠號為:1099)
server_port=1355
server.rmi.localport=1099
(2)啟動執行機上的Jmeter-server.bat,命令:./jmeter-server -Djava.rmi.server.hostname=192.168.0.199,如下圖,埠號已經修改為:1099。巨集哥的如下圖所示:
3、在排程機上新增遠端的負載機
進入Jmeter的bin目錄,找到Jmeter.properties檔案,進行如下配置:
4、在排程機上開啟,Jmeter,如下圖即可啟動遠端的負載機
5、驗證:啟動後如果執行正常,在排程機上可以看到遠端負載機的執行結果,如下圖:
在執行機上有如下顯示:
8.分佈壓測(全部啟動)
1、選擇遠端啟動-->遠端全部啟動,如下圖所示:
2、master結果,全部啟動,巨集哥配置了2臺slave,所以有兩次執行結果:
3、檢視結果樹,檢視執行機(兩臺兩個結果),如下圖所示:
察看結果樹如圖:
執行機巨集哥配置的是一臺Linux系統,一臺Windows系統,如圖:
9.小結
9.1實戰過程遇到問題
1、Linux下Jmeter-server啟動失敗,如下圖所示:
解決辦法:在啟動Jmeter-server的時候加上如下引數,完成命令如下:
./jmeter-server -Djava.rmi.server.hostname=192.168.0.199
2、Neither the JAVA_HOME nor the JRE_HOME environment variable is defined
在使用java遠端啟動linux伺服器上的jmeter服務是報Neither the JAVA_HOME nor the JRE_HOME environment variable is defined,如下圖所示:
解決辦法:查詢該報錯基本都是tomcat操作 , 編輯jmeter/bin/jmeter-server
檔案,在頂部新增JAVA_HOME
和JRE_HOME
即可
3、排程機報如下錯誤:
解決辦法:將執行機上的埠設定為固定埠即可(在之前的部署中已經說明如何自定義埠了,參考上文)
4、啟動Jmeter報錯:Java.net.ConnectionException: Connection refused:connect
解決問題:在執行機上重新啟動Jmeter-server服務,或者是你這個服務壓根就沒有啟動(我的測試環境這樣是可以解決的,如果你的環境解決不了,請仔細檢視執行機上的Jmeter-server.log中的報錯資訊)
5、啟動Jmeter報錯
解決辦法:1、找到JMETER_HOME\bin\jmeter.properties
2、修改server.rmi.ssl.disable=true (記得去除server.rmi.ssl.disable=true前的#),重新啟動jmeter-server.bat
9.2其它說明
1.排程機(master)和執行機(slave)最好分開,由於master需要傳送資訊給slave並且會接收slave回傳回來的測試資料,所以mater自身會有消耗,所以建議單獨用一臺機器作為mater。
2.引數檔案:如果使用csv進行引數化,那麼需要把引數檔案在每臺slave上拷一份且路徑需要設定成一樣的。
3.每臺機器上安裝的Jmeter版本和外掛最好都一致,否則會出一些意外的問題。
4.若是指令碼中設定的併發執行緒數是100,採用3臺slaver機器去施加壓力,那麼對於服務端來說,此時的併發執行緒數是300。
5.為了減少出錯的可能性,最好按照如下Jmeter 分散式要求:
- 各個機器在相同目錄下安裝相同版本的jdk;
- 各個機器在相同的目錄下安裝相同版本的jmeter;
- 配置/etc/hosts的IP和hostname的對映。
- 修改各個機器的jmeter的預設記憶體引數,從512m調整為合適大小。