事實上,你的JMeter客戶端機器是不能表現出完美的壓力請求,來模擬足夠多的用戶或由于網絡限制去向服務施加壓力,一種解決方法是通過一個JMeter去控制多個/遠程JMeter。通過運行JMeter的遠程模式,你可以通過多個低配制的電腦復制測試計劃用于模擬一個大數據量的壓力并發在服務器上。一個JMeter客戶端實例可以控制多個遠程JMeter實例,并收集所有數據信息。特點如下:
· 保存測試樣例在本機電腦
· 通過一臺機器來管理多臺JMeter測試機
· 不需要復制測試計劃到每一臺JMeter測試機-JMeter客戶端會發送至所有的服務器
提示: 相同的測試計劃將會被運行在所有的服務器中。JMeter不會在服務器間分發壓力,每一個均會完整執行測試計劃。因此,如果你設置了1000個線程并有6個JMeter服務,你將會完成6000線程注入。
然而,遠程模式比獨立運行相同數量的無UI測試使用更多的資源。如果許多服務實例被使用,JMeter客戶端會超負載,直到達到網絡鏈接的上限。通過使用 剝離模式 可以得到提升(見下文),但你可以一直查看是否你的JMeter是否超負載。
請注意,當你可以在你的應用程序服務器上執行JMeter測試時,你需要知道有一件事實將有會額外的消耗在你的應用服務器中并會影響你的測試結果。推薦的方式時,將JMeter與你的應用服務配制在同一網斷。這將小化由于網絡引起影響的性能測試結果。
Step 0: 配制節點
確保所有的節點(客戶端和服務):
· 運行相同的JMeter版本
· 在所有系統中使用相同的Java版本。使用不同的Java版本也可正常工作,但不鼓勵這樣做。
如果在測試過程中使用任何數據文件, 注意這些將不會被通過客戶端發送給服務器,因此請確保這些信息可被所有的服務所獲取 。如果需要,你可以通過在每個服務中的 user.properties 或 system.properties 來定義不同的屬性。當服務啟啟動時,這些屬性將會被使用并可以應用到測試計劃中來影響測試操作(如,鏈接不同的遠程服務)。或者,在測試的數據文件中使用不同的數據(如,每個服務使用的id,把這些數據分到不同的數據文件中)
Step 1: 啟動服務
使用遠程模式運行JMeter,在所有的機器中啟動JMeter服務組件通過運行 JMETER_HOME/bin/jmeter-server (unix) 或 JMETER_HOME/bin/jmeter-server.bat (windows)腳本。
注意,在每一個節點中僅應該有一個JMeter服務,除非有不同的 RMI 在使用。
自JMeter2.3.1后,JMeter應用服務自行啟動 RMI 的服務注冊;不需要再單獨啟 RMI 。為了改變上面的方式,可以定義JMeter的屬性
server.rmi.create=false
在服務的系統中。
通常, RMI 為JMeter服務引擎使用動態端口。這樣會引起防火墻問題,找到屬性名 server.rmi.localport 來控制你的端口號。如果這個是非0,服務器將會使用它來做為本地的端口號。
Step 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 標記的使用(下文有說明)。
Step 3a: 使用JMeter GUI客戶端檢查配制
現在你已經準備控制JMeter客戶端。在Windows電腦中,開啟客戶端通過 bin/jmeter.bat 。在UNIX電腦中,使用腳本 bin/jmeter 。你將注意到 Run 菜單包括兩個字菜單: Remote Start 和 Remote Stop (查看下圖)。這些菜單包括你發送屬性配制文件。使用 Remote Start 和 Remote Stop 代替正常JMeter的 Start 和 Stop 。
Step 3b: 通過非GUI啟動JMeter
GUI模式應該僅用來在調試模式,作為一種更好的改變,你應該通過非GUI(命令行)模式啟動遠程測試。命令行如下:
jmeter -n-tscript.jmx -r
或
jmeter -n-tscript.jmx -R server1,server2,...
其它有用的參數:
-Gproperty=value
在所有服務器中定義一個屬性(可以出現多次)
-X
測試結束后,退出遠程模式
第一個例子將會啟動遠程測試無論在JMeter屬性 remote_hosts 是否定義;第二個例子從服務列表定義 remote_hosts 并在遠程服務中啟動測試。當所有的遠程服務停止后,命令行客戶端將會退出。
手工操作
在一些場景下,JMeter服務腳本將無法工作(你所使用的操作系統平臺不支持JMeter運行開發)。下面是怎樣開始JMeter服務通過一種手機的方法:
Step 1a: 啟動RMI注冊
自JMeter2.3.1版本后,RMI注冊通過JMeter服務啟動,因此在平常場景下這部分不會生效。為了解決上面的方法,定義JMeter屬性 server.rmi.create=false 在服務存放系統中并按下面的操作繼續。
JMeter使用 Remote Method Invocation(RMI) 當作遠程通訊工具。因此,你需要運行 JDK 自帶的RMI注冊應用程序(被命名為, rmiregistry ),位置在 bin 目錄中。在運行 rmiregistry 之前,確保下面的 jar 包在你的 系統環境變量 中:
· JMETER_HOME/lib/ext/ApacheJMeter_core.jar
· JMETER_HOME/lib/jorphan.jar
· JMETER_HOME/lib/logkit-2.0.jar
rmiregistry 應用程序需要讀取一些JMeter類。運行 rmiregistry 不需要參數。默認監聽的端口號是 1099 .
Step 1b: 啟動JMeter服務
一旦 RMI 注冊應用程序已經運行,啟動JMeter服務。使用 -s 參數作為JMeter的啟動參數。
第2/3步還是保持一致。
提示
JMeter/RMI需要從客戶端至服務器的連接。將會使用你選擇的端口號,默認是 1099 .
JMeter/RMI也需要一個回傳的鏈接,用于返回樣例結果從服務器端到客戶端。這個會使用一個較大數字的端口號。
通過JMeter的 jmeter.properties 的屬性 client.rmi.localport 來控制端口號。如果沒有防火墻和其它網絡過濾在JMeter的客戶端和服務器端,你需要確保他們創建的鏈接是可通的。如果有必要,使用監聽軟件查看通信被生成。
如果你使用 Suse Linux 系統,這些信息將會有幫助。默認的安裝將會啟動防火墻。如果這樣的話,遠程測試將無法工作。下面的方法是 Sergey Ten 提供的。
如果你看到鏈接被拒絕,通過下面的選項打開調試:
rmiregistry -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
在JMeter2.3.1版本之后,RMI注冊被服務啟動;但選項仍可在命令行中工作。如: jmeter -s -Dsun.rmi.loader.logLevel=verbose (如,刪除 -J 前綴)。改變屬性可以在 system.properties 屬性文件中定義。
解決問題的方案是刪除回調 127.0.0.1 和 127.0.0.2 從 /etc/hosts 。發生了什么引起, jmeter-server 不能鏈接 rmiregistry 如果 127.0.0.2 回調不可用。使用下面的設置修復:
替換
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 "$@"
同時創建協議文件,并添加 電腦名 電腦域 行在 /etc/hosts 。
為了更好的支持RMI通訊通道的 SSH 協議在遠程測試中,自JMeter2.6版本后:
· 一個新的屬性 client.rmi.localport 可以設置來控制RMI端口通過使用 RemoteSampleListenerImpl
· 為了支持RMI使用SSH通信協議作為一個遠程終端,在本機使用一個端口,可在Java的系統屬性 java.rmi.server.hostname 參數中說明出來的回調接口現在允許調用。