Jmeter分散式壓測實戰及踩坑處理(含引數化)

EdisonYao發表於2021-08-06

  專案中使用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機器的伺服器時間是否一致

相關文章