性能測試工具JMeter的分布式執行是一種用于增強壓力測試能力的技術方案,它允許用戶通過多臺機器來共同完成同一個測試計劃的執行。這種方式特別適用于需要模擬成百上千甚至上萬用戶并發訪問的情況,當單臺機器由于硬件資源(如CPU、內存、網絡I/O等)限制無法滿足高并發需求時,分布式執行可以有效地解決這個問題。
分布式執行原理
在JMeter的分布式架構中,通常會有一臺機器作為控制機(Controller或Master),負責管理和協調整個測試過程;其他參與測試的機器則被稱為執行機(Agent或Slave)。
具體來說:
控制機:安裝有JMeter客戶端,并且配置了與所有執行機通信所需的設置。它可以是Windows或Linux系統,但建議使用獨立于執行機之外的機器以避免資源競爭。
執行機:同樣安裝了JMeter軟件,并且根據控制機發送過來的指令執行相應的測試任務。這些機器不需要啟動GUI界面,而是以命令行模式運行,從而減少不必要的資源消耗。
通信機制:控制機和執行機之間通過RMI(Remote Method Invocation)協議進行通信,默認情況下使用端口1099。為了保證安全性和效率,可以在jmeter.properties文件中禁用SSL加密或者自定義端口號。
運行模式如下圖所示:
Master 端和Slave 端通過RMI(Remote Method Invocation)的模式通信,Master控制場景的配置,執行及結果收集,Slave負責產生負載,把測試結果回傳給Master。
Jmeter分布執行過程大致如下:
1> Slave 端啟動(%JMETER_HOME%/bin/jmeter-server).
2>Master 端啟動執行。Master端解析測試計劃 Hash Tree,從配置文件中讀取Slave 端地址(可以是N個,N>=1),建立連接。例如參數文件,這些文件不會自動發送Slave端的,需要用戶自己存放到Slave端。
3>Slave端連接到Hash Tree 與啟動命令行,運行測試計劃,并把測試結果返回給Master端;每個Slave端上運行的測試計劃完全一樣,例如,在Master端上設置的線程數為100,那么總線程數為100*N,其中N 為Slave的個數。
配置步驟
要實現JMeter的分布式執行,首先需要確保所有涉及的機器都安裝了相同版本的JDK和JMeter,并且正確設置了環境變量。接著按照以下步驟操作:
修改配置文件:在每臺執行機上的bin/jmeter.properties文件中添加如下配置項:
server.rmi.ssl.disable=true // 禁用SSL
server_port=指定端口 // 設置監聽端口,例如1888
server.rmi.localport=指定端口 // 設置本地RMI端口,保持一致
啟動服務:進入JMeter安裝目錄下的bin文件夾,執行jmeter-server.bat(Windows)或./jmeter-server(Linux)命令來啟動遠程服務器實例。
配置控制機:編輯控制機上的bin/jmeter.properties文件,在其中加入所有執行機的信息,格式為remote_hosts=IP地址:端口號,IP地址:端口號...。例如:remote_hosts=192.168.1.102:1888,192.168.1.103:1888。
啟動測試:打開JMeter GUI界面,加載要執行的測試計劃(.jmx文件),然后選擇“運行”->“遠程啟動”,可以選擇單獨啟動某一臺執行機,也可以點擊“遠程全部啟動”讓所有配置好的執行機同時開始工作。
使用SSL
Jmeter從4.0版本以后,RMI的默認傳輸機制將使用SSL,因此我們要配置密鑰和證書。解決方式有兩種,一種是忽略SSL,另外一種方式生成密鑰和證書,然后進行配置。
%JMETER_HOME%/bin/ 目錄下有create-rmi-keystor.bat,create-rmi-keystor.sh 兩個文件分別為windows 系統和Linux系統下生成密鑰證書。
create-rmi-keystor.bat 支持windows系統生成密鑰和證書
Windows系統下生成的證書。
create-rmi-keystor.sh 支持Linux系統生成密鑰和證書。
把生成的證書拷貝到其它待用的機器上,配置不做任何修改,保持默認即可。
啟動Slave端,在Linux系統下運行%JMETER_HOME%/bin/jmeter-server,在windows系統下運行Jmeter-server.bat。默認的監聽端口號1099,如果需要修改,則在jmeter.properties中設置的server_prot=[端口],同時在Master端的Jmeter.properties 文件中設置remote_hosts=server:[端口]。
注意事項
所有機器應該處于同一局域網內,并且關閉防火墻或開放必要的端口以便于通信。
如果使用CSV文件或其他外部數據源進行參數化,則需確保這些文件存在于每個執行機相同路徑下。
為了避免潛在的問題,最好保證所有參與測試的機器擁有相同的JMeter版本及插件配置。
通過上述方法可以成功搭建起一個基于JMeter的分布式壓測環境,這對于評估Web應用或其他服務在大規模并發條件下的表現具有重要意義。此外,隨著技術的發展,一些第三方平臺也提供了對JMeter分布式部署的支持和服務,進一步簡化了這一過程。
閱讀后若有收獲,不吝關注,分享,在看等操作!!!