專案中使用Jmeter進行大併發壓測時,單機受限記憶體、CPU、網路IO,會出現伺服器壓力還沒有上
去,但壓測伺服器由於模擬的壓力太大當機的情況。JMeter的叢集模式可以讓我們將多臺機器聯合起來
一起產生負載,從而彌補單臺機器負載生成能力不足的問題。
分散式壓測原理
1、控制機為Master,負載機為Slave
2、Master啟動後,會拷貝jmx指令碼檔案到所有的Slave上
3、Slave會回傳壓測資料給Master,最後由Master彙總出結果檔案
注意事項
1、指令碼檔案上傳到master即可,不用所有的slave都傳一份
2、所有機器最好在同一個網段
3、由於master需要傳送資訊給slave並接收slave回傳回來的測試資料,自身會有一定的消耗,建議單獨
配置一臺機器作為master
4、所有機器的jmeter版本和外掛版本要一致
5、如果jmeter版本在4.0以上,需在jmeter.properties中設定 server.rmi.ssl.disable=true
分散式環境配置
Slaves機器配置
編輯所有slave機器jmeter/bin目錄下的jmeter.properties檔案,slaves機器上remote_hosts不動,根
據需要修改服務埠。預設埠為1099,可以修改為任意未被佔用的埠。我這裡預設埠沒有被佔用,
就不做修改。
# Remote Hosts - comma delimited remote_hosts=127.0.0.1 #remote_hosts=localhost:1099,localhost:2010 # RMI port to be used by the server (must start rmiregistry with same port) #server_port=1099
Master機器配置
編輯master機器jmeter/bin目錄下的jmeter.properties檔案,將所有slave機器的地址配置到檔案中,
server_port不用修改。
# Remote Hosts - comma delimited remote_hosts=166.188.20.86,166.188.21.75(slave機器的ip和埠) #remote_hosts=localhost:1099,localhost:2010 # RMI port to be used by the server (must start rmiregistry with same port) #server_port=1099
master機器也可以作為負載機,在remote_hosts中加上127.0.0.1即可,但考慮到自身消耗,這裡
不使用。如果修改了負載機的埠號,則需帶上修改後的埠號,我這裡使用的預設值,不用再單獨
標註。修改了埠號使用如下配置:
# Remote Hosts - comma delimited remote_hosts=166.188.20.86:2099,166.188.21.75:2099 #remote_hosts=localhost:1099,localhost:2010 # RMI port to be used by the server (must start rmiregistry with same port) server_port=2099
引數化檔案配置
引數化檔案的路徑要保持一致,我這裡配置在jmeter/bin目錄下。注意:所有的slave機器都要上傳一
份引數化檔案。
分散式壓測執行
Slave機器執行
在所有的slave機器上執行 ./jmeter-server 命令,出現以下介面為執行成功。
Master機器執行
確認好所有slave機器都正確啟動後,在master機器上執行命令
jmeter -n -t stress0804.jmx -r -l testResult.jtl
命令解析:
- n 非GUI模式執行
- t 要執行的jmx檔案
- r 將遠端所有的agent啟動
- l 生成結果檔案
執行結果:
指令碼中設定了5個執行緒,有2臺負載機,所有Active為5*2=10個,執行時間2分鐘。
常見問題處理
問題一
[test@localhost bin]$ ./jmeter-server Writing log file to: /home/test/jmeter/apache-jmeter-3.1/bin/jmeter-server.log Created remote object: UnicastServerRef [liveRef: [endpoint:[127.0.0.1:37863](local),objID:[-3217392f:17b104e6552:-7fff, 742049333908920389]]] Server failed to start: java.rmi.RemoteException: Cannot start. localhost.localdomain is a loopback address. An error occurred: Cannot start. localhost.localdomain is a loopback address.
解決方法:執行命令中指定本地IP ./jmeter-server -Djava.rmi.server.hostname=xxx.xxx.xxx.xxx
問題二
[root@iZwz95j86y235aroi85ht0Z bin]# ./jmeter-server Created remote object: UnicastServerRef2 [liveRef: [endpoint:[:39308](local),objID:[24e78a63:16243c70661:-7fff, 7492480871343944173]]] Server failed to start: java.rmi.RemoteException: Cannot start. Unable to get local host IP address.; nested exception is: java.net.UnknownHostException: iZwz95j86y235aroi85ht0Z: iZwz95j86y235aroi85ht0Z: Name or service not known An error occurred: Cannot start. Unable to get local host IP address.; nested exception is: java.net.UnknownHostException: iZwz95j86y235aroi85ht0Z: iZwz95j86y235aroi85ht0Z: Name or service not known
解決方法:使用hostname命令獲取機器名稱,追加一個對映iZwz95j86y235aroi85ht0Z
[root@iZwz95j86y235aroi85ht0Z bin]# vi /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 120.79.160.143 iZwz95j86y235aroi85ht0Z
windows中修改c:\windows\system32\drivers\etc\hosts檔案,增加一條域名與IP的對映
問題三
[root@iZwz95j86y235aroi85ht0Z bin]# ./jmeter-server Server failed to start: java.rmi.server.ExportException: Listen failed on port: 0; nested exception is: java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory) An error occurred: Listen failed on port: 0; nested exception is: java.io.FileNotFoundException: rmi_keystore.jks (No such file or directory)
解決方法:編輯jmeter.properties檔案,將server.rmi.ssl.disable的值改為true
問題四
slave機器無法啟動或者沒有返回執行資料
解決方法:
1、檢查master機器和slave機器能否ping通
2、檢查防火牆
3、檢查master機器和slave機器的伺服器時間是否一致