如果您的JMeter客戶端計算機無法使用性能方面,要模擬足夠的用戶來增強壓力或受限于網絡級別,則可以選擇從單個JMeter客戶端控制多個遠程JMeter引擎。通過遠程運行JMeter,您可以跨許多低端計算機復制測試,從而模擬服務器上的較大負載。JMeter客戶端的一個實例可以控制任意數量的遠程JMeter實例,并從中收集所有數據。這提供以下功能:
- 將測試samples保存到本地機器
- 從單個機器管理多個JMeter Engines
- 無需將測試計劃復制到每個服務器 - 客戶端將其發送到所有服務器
注意:所有服務器都運行相同的測試計劃。JMeter不會在服務器之間分配負載,每個都運行完整的測試計劃。所以如果你設置1000個線程并且有6個JMeter服務器,你最終會注入6000個線程。
然而,遠程模式確實使用更多的資源,而不是獨立運行相同數量的非GUI測試。如果使用許多服務器實例,客戶端JMeter可能會變得過載,客戶端網絡連接也會如此。這通過切換到“Stripped modes ”模式(見下文)得到了改進,但是您應該始終檢查您的客戶端是否沒有超載。
請注意,雖然您可以在應用程序服務器上執行JMeterEngine,但您需要注意的是,這將在應用程序服務器上添加處理開銷,因此您的測試結果將會受到某種程度的污染。建議的方法是將一臺或多臺計算機與您配置為運行JMeter Engine的應用程序服務器位于同一個以太網段上。這將最大限度地減少網絡對測試結果的影響,而不會影響應用服務器本身的性能。
步驟0:配置節點
確保所有節點(客戶端和服務器):
- 正在運行完全相同版本的JMeter。
- 在所有系統上都使用相同版本的Java。使用不同版本的Java可能會工作,但不鼓勵。
如果測試使用任何數據文件,請注意,這些文件不會由客戶端發送,因此請確保這些文件在每個服務器上的相應目錄中可用。如果需要,您可以通過編輯每個服務器上的user.properties或system.properties文件來為屬性定義不同的值。這些屬性將在服務器啟動時被提取,并且可能在測試計劃中用于影響其行為(例如連接到其他遠程服務器)。或者在測試使用的任何數據文件中使用不同的內容(例如,如果每個服務器必須使用唯一的ids,在數據文件之間劃分這些內容)
步驟1:啟動服務器
要在遠程節點中運行JMeter,請通過運行JMETER_HOME / bin / jmeter-server(unix)或JMETER_HOME / bin / jmeter-server.bat(windows)腳本在要運行的所有計算機上啟動JMeter服務器組件。
請注意,除非使用不同的RMI端口,否則每個節點上只能有一個JMeter服務器。
自JMeter 2.3.1起,JMeter服務器應用程序啟動RMI注冊本身;沒有必要單獨啟動RMI注冊。要還原到以前的行為,請定義JMeter屬性
server.rmi.create = FALSE
在服務器主機系統上。
默認情況下,RMI為JMeter服務器引擎使用動態端口。這可能會導致防火墻出現問題,因此您可以定義JMeter屬性server.rmi.localport來控制此端口號。如果這不是零,它將被用作服務器引擎的本地端口號。
步驟2:將服務器IP添加到客戶端的屬性文件
編輯控制JMeter機器上的屬性文件。在JMETER_HOME / bin / jmeter.properties中,找到名為“remote_hosts”的屬性,并添加運行JMeter服務器IP地址的值。可以添加多個這樣的服務器,以逗號分隔。
請注意,您可以使用-R命令行選項來指定要使用的遠程主機。這與使用-r和-Jremote_hosts = {serverlist}的效果相同。例如
jmeter -Rhost1,127.0.0.1,host2
如果定義JMeter屬性server.exitaftertest = true,那么在運行單個測試后,服務器將退出。另見-X標志(如下所述)
步驟3a:從GUI客戶端啟動JMeter客戶端以檢查配置
現在您可以開始控制JMeter客戶端了。對于MS-Windows,使用腳本“bin / jmeter.bat”啟動客戶端。對于UNIX,請使用腳本“bin / jmeter”。您將注意到,“運行”菜單包含兩個新的子菜單:“遠程啟動”和“遠程停止”(見圖1)。這些菜單包含您在屬性文件中設置的客戶端。使用遠程啟動和停止代替JMeter正常啟動和停止菜單項。
圖1 - 運行菜單
步驟3b:從非GUI客戶端啟動JMeter
GUI模式只能用于調試,作為一個更好的選擇,您應該從非GUI(命令行)客戶機啟動遠程服務器上的測試。這樣做的命令是:
jmeter -n -t script.jmx -r
要么
jmeter -n -t script.jmx -R server1,server2,...
可能有用的其他標志:
-Gproperty =值
在所有服務器中定義一個屬性(可能會出現多次)
-X
在測試結束時退出遠程服務器。
第一個例子將開始測試JMeter屬性remote_hosts中定義的任何服務器;
第二個例子將從服務器列表中定義remote_hosts,然后在遠程服務器上啟動測試。
當所有遠程服務器停止時,命令行客戶端將退出。
13.1手動操作
在某些情況下,jmeter-server腳本可能無法正常工作(如果您使用JMeter開發人員未預期的操作系統平臺)。以下是如何通過更加手動的過程啟動JMeter服務器(上述步驟1):
步驟1a:啟動RMI注冊表
自JMeter 2.3.1起,JMeter服務器啟動RMI注冊表,因此本部分在正常情況下不適用。要恢復以前的行為,請在服務器主機系統上定義JMeter屬性server.rmi.create = false,然后按照以下說明進行操作。
JMeter使用遠程方法調用(RMI)作為遠程通信機制。因此,您需要運行JDK附帶的RMI注冊表應用程序(命名為“rmir??egistry”),并位于“bin”目錄中。運行rmir??egistry之前,請確保您的系統類路徑中包含以下jar:
- JMETER_HOME / lib / ext目錄/ ApacheJMeter_core.jar
- JMETER_HOME / lib目錄/ jorphan.jar
- JMETER_HOME / lib目錄/ logkit-2.0.jar
rmir??egistry應用程序需要訪問某些JMeter類。沒有參數運行rmir??egistry。默認情況下,應用程序偵聽端口1099。
步驟1b:啟動JMeter服務器
一旦RMI注冊表應用程序運行,啟動JMeter服務器。使用jmeter啟動腳本(“jmeter -s”)中的“-s”選項。
步驟2和3保持不變。
13.2 提示
JMeter / RMI需要從客戶端到服務器的連接。這將使用您選擇的端口,默認為1099。
JMeter / RMI還需要反向連接才能將服務器上的樣本結果返回給客戶端。
這將使用高端口。
此端口可以通過JMeter的屬性來控制client.rmi.localport在jmeter.properties。
如果JMeter客戶端和服務器之間有任何防火墻或其他網絡過濾器,則需要確保它們被設置為允許連接通過。如有必要,請使用監控軟件來顯示正在生成的流量。
如果您正在運行Suse Linux,這些提示可能會有所幫助。默認安裝可能會啟用防火墻。在這種情況下,遠程測試將無法正常工作。以下提示由Sergey Ten提供。
如果看到連接被拒絕,通過傳遞以下選項來打開調試。
rmir??egistry -J-Dsun.rmi.log.debug = true \-J-Dsun.rmi.server.exceptionTrace = true \-J-Dsun.rmi.loader.logLevel = verbose \-J-Dsun.rmi.dgc.logLevel = verbose \-J-Dsun.rmi.transport.logLevel = verbose \-J-Dsun.rmi.transport.tcp.logLevel = verbose \
自JMeter 2.3.1起,RMI注冊表由服務器啟動;但是,這些選項仍然可以從JMeter命令行傳入。例如:“jmeter -s -Dsun.rmi.loader.logLevel = verbose”(即省略-J前綴)。或者,可以在system.properties文件中定義屬性。
該解決方案是從/ etc / hosts中刪除127.0.0.1和127.0.0.2環回。如果127.0.0.2環回不可用,那么發生什么事情就是jmeter-server無法連接到rmiregistry。使用以下設置來解決問題。
更換
`dirname $ 0` / jmeter -s“$ @”
同
HOST =“ - Djava.rmi.server.hostname = [computer_name] [computer_domain] \-Djava.security.policy =`dirname $ 0` / [policy_file]“\`dirname $ 0` / jmeter $ HOST -s“$ @”
還要創建一個策略文件,并將[computer_name] [computer_domain]行添加到/ etc / hosts。
為了更好地支持用于遠程測試的RMI通信通道的SSH隧道,因為JMeter 2.6:
- 可以設置一個新的屬性“client.rmi.localport”來控制RemoteSampleListenerImpl使用的RMI端口
- 要使用本地機器上的端口,通過SSH隧道將隧道RMI流量作為遠程端點,現在允許直接使用Java System Property“java.rmi.server.hostname”參數指定環回接口。
13.3使用不同的端口
默認情況下,JMeter使用標準RMI端口1099。可以改變這個。為了成功工作,以下所有需要同意:
- 在服務器上,使用新的端口號啟動rmir??egistry
- 在服務器上,啟動JMeter,并定義屬性server_port
- 在客戶端上,更新remote_hosts屬性以包括新的遠程主機:端口設置
自Jmeter 2.1.1以來,jmeter-server腳本提供了更改端口的支持。例如,假設您要使用端口1664(也許已經使用了1099)。
在Windows上(在DOS框中)
C:\ JMETER> SET SERVER_PORT = 1664C:\ JMETER> JMETER-SERVER [其他選項]
在Unix上:
$ SERVER_PORT = 1664 jmeter-server [其他選項]
[N.B.使用大寫環境變量]
在這兩種情況下,腳本在指定的端口上啟動rmiregistry,然后在服務器模式下啟動JMeter,并定義了“server_port”屬性。
所選端口將被登錄到服務器jmeter.log文件中(rmir??egistry不會創建日志文件)。
13.4使用不同的樣本發送方
測試計劃中的偵聽器將其結果發送回客戶端JMeter,將結果寫入指定的文件默認情況下,樣本將在生成時同步發回。這可能會影響服務器測試的最大吞吐量;必須在線程可以繼續之前發送樣本結果。有一些JMeter屬性可以設置為改變此行為。
-
mode
采樣發送模式 -自2.9以來,默認為StrippedBatch。這應該在客戶端節點上設置。- Standard
一旦產生樣本,就會同步發送樣本 - Hold
保存數組中的樣本,直到運行結束。這可能在服務器上使用大量內存,并且不鼓勵。 - DiskStore
將樣本存儲在磁盤文件(在java.io.temp下),直到運行結束。序列化數據文件在JVM退出時被刪除。 - StrippedDiskStore
從成功的示例中刪除responseData,并使用DiskStore發送方發送它們。 - Batch
當計數(num_sample_threshold)或時間(time_threshold)超過閾值時發送保存的樣本,此時樣本將同步發送。可以使用以下屬性在服務器上配置閾值:- num_sample_threshold
要累積的樣本數,默認為100 - time_threshold
時間閾值,默認60000 ms = 60秒
另見Asynch模式,如下所述。
- num_sample_threshold
- Statistical
當計數或時間超過閾值時,發送摘要樣本。樣本由線程組名稱和樣本標簽匯總。累積以下字段:- elapsed time
- latency
- bytes
- sample count
- error count
其他樣本之間不同的變量將丟失。
- Stripped
從成功的樣本中刪除responseData - StrippedBatch
從成功的樣本中刪除responseData,并使用批生成器發送它們。 - Asynch
樣本臨時存儲在本地隊列中。單獨的工作線程發送樣本。但是,如果樣本的創建速度比可以發送的速度快,則隊列將最終填滿,并且采樣器線程將阻塞,直到某些樣本從隊列中排出。此模式對于平滑樣本生成中的峰值非常有用。可以通過在服務器節點上設置JMeter屬性asynch.batch.queue.size(默認為100)來調整隊列大小。 - StrippedAsynch
從成功的樣本中刪除responseData,并使用Async發送方發送它們。 - Custom implementation
將mode參數設置為您的自定義樣本發送者類名。這必須實現接口SampleSender并具有一個構造函數,該構造函數接受一個類型為RemoteSampleListener的單個參數。
- Standard
Stripped模式去掉responseData,這意味著依賴于以前的responseData可用的一些元素將不起作用。
這不是一個真正的問題,因為總是有更有效的方法來實現這個功能。
以下屬性適用于批處理和統計模式:
num_sample_threshold
批次中的樣品數(默認為100)
time_threshold
要等待的毫秒數(默認60秒)
13.5處理啟動失敗的節點
對于大規模測試,有一部分遠程服務器將不可用或不可用。例如,當您使用自動化腳本分配許多云計算機并將其用作生成器時,由于云的問題,某些請求的計算機可能會啟動失敗。由于JMeter 2.13有新的屬性來控制此行為。
首先,您可能想要的是重試初始化嘗試,希望失敗的節點稍微延遲啟動。要啟用重試,您應該將client.tries
屬性設置為連接嘗試次數。默認情況下只做一次嘗試。要控制重試延遲,請將client.retries_delay
屬性設置為在嘗試之間休眠的毫秒數。
最后,您可能仍然希望使用那些成功初始化并跳過失敗節點的生成器來運行測試。要啟用它,請設置client.continue_on_fail = true
屬性。