『動善時』JMeter基礎 — 59、進行JMeter分散式測試遇到的坑

繁華似錦Fighting發表於2021-12-29

自己在使用JMeter進行分散式測試的時候,遇到了很多的坑。下面總結起來,方便以後檢視。

1、控制機端

(1)執行機沒有關閉防火牆

在執行機IP+埠號設定正確的情況下,控制機在啟動測試計劃的時候,出現如下情況:

Windows系統,下的GUI介面:

image

Linux系統下,出現:

[root@localhost ~]# jmeter -n -t /tmp/jmeterscript/CLI_test.jmx -r -l /tmp/result/result.jtl -j /tmp/jmeterlog/test.log -e -o /tmp/resultforHTML/tableresult
Creating summariser <summary>
Created the tree successfully using /tmp/jmeterscript/CLI_test.jmx
Configuring remote engine: 192.168.134.130:9996
Exception creating connection to: 192.168.134.130; nested exception is: 
	java.net.NoRouteToHostException: 沒有到主機的路由 (Host unreachable)
Failed to configure 192.168.134.130:9996
Configuring remote engine: 192.168.134.131:9996
Exception creating connection to: 192.168.134.131; nested exception is: 
	java.net.NoRouteToHostException: 沒有到主機的路由 (Host unreachable)
Failed to configure 192.168.134.131:9996
Stopping remote engines
Remote engines have been stopped
Error in NonGUIDriver java.lang.RuntimeException: Following remote engines could not be configured:[192.168.134.130:9996, 192.168.134.131:9996]
An error occurred: Error in NonGUIDriver Following remote engines could not be configured:[192.168.134.130:9996, 192.168.134.131:9996]

如上情況說明,無法找到執行機與之進行連線,最先應想的就是執行機中的防火牆是不是沒有關閉,我關閉執行機的防火牆後,以上錯誤消失。

CentOS7中關閉防火牆如下:

1)檢視防火牆狀態命令:systemctl status firewalld.service

image

active(running):說明防火牆是開啟狀態。

2)關閉執行的防火牆使用命令:systemctl stop firewalld.service

image

disavtive(dead):說明防火牆已經是關閉狀態。

3)前面的方法,一旦重啟作業系統,防火牆就自動開啟了,該怎麼設定才能永久關閉防火牆呢?

  • systemctl disable firewalld.service,開機禁止防火牆伺服器。
  • systemctl enable firewalld.service ,開機啟動防火牆伺服器。

提示:開啟防火牆命令systemctl statr firewalld.service

(2)記憶體溢位

在執行JMeter命令時,提示如下資訊。

Windows系統,提示如下:

Error occurred during initialization of VM Could not reserve enough space for object heap errorlevel=1

Linux系統,提示如下:

[root@jmeter2 bin]# ./jmeter
Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x00000000c0000000, 1073741824, 0) failed; error='Cannot allocate memory' (errno=12)
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 1073741824 bytes for committing reserved memory.
# An error report file with more information is saved as:
# /usr/local/jmeter/apache-jmeter-5.0/bin/hs_err.log

提示你,虛擬機器初始化期間無法為HotSpot保留足夠的空間。

解決方法:開啟jmeter.bat檔案,查詢set HEAP,把set HEAP=-Xms128m –Xmx512m修改為set HEAP=-Xms512m-Xmx1024m。(看實際需求往大調整)

2、執行機端

(1)啟動jmeter-server服務情況一

出現如下所示:

# 啟動jmeter服務
[root@localhost bin]# ./jmeter-server
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[127.0.0.1:39077](local),objID:[c466f3:179e14425ba:-7fff, -6326112065037884314]]]
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.

伺服器啟動異常:Java遠端方法呼叫丟擲異常:無法啟動服務。localhost.localdomain是一個本地環回地址。

原因

要在遠端物件上呼叫方法,RMI客戶端首先必須從RMI登錄檔中檢索遠端存根物件。 此存根物件包含伺服器地址,該伺服器地址稍後將在呼叫遠端方法時用於連線到遠端物件(與RMI登錄檔的連線和與遠端物件的連線是兩個完全不同的東西)。 預設情況下,伺服器將嘗試檢測自己的地址並將其傳遞給存根物件。 不幸的是,用於檢測伺服器地址的演算法並不總是產生有用的結果(取決於網路配置)。

通過設定RMI伺服器上的系統屬性java.rmi.server.hostname,可以覆蓋傳遞給存根物件的伺服器地址。

預設情況下,RMI登錄檔使用埠1099。

解決方案

方法一

執行JMeter命令啟動jmeter-server服務時,增加如下引數:

./jmeter-server -Djava.rmi.server.hostname=(執行機-本機ip)

方法二

修改jmeter-server檔案:

# 修改RMI_HOST_DEF如下
RMI_HOST_DEF=-Djava.rmi.server.hostname=192.16.*.*(本機ip)

之後執行命令./jmeter-server,來啟動jmeter-server服務即可。(可方法一同理)

補充:

Linux系統中後臺執行,啟用jmeter-server服務:

nohup ./jmeter-server -Djava.rmi.server.hostname=192.168.*.*

檢視jmeter-server服務是否啟動成功,執行命令:ps axu | grep jmeter

方法三

也有可能是hostnamelocalhost不一致導致的。

當在 /etc/hosts 檔案中進行對映時,通過localhost無法對映到一個有效的IP地址,就會出現上述問題。

操作步驟:

獲取機器名稱,增加一條域名與IP的對映。

1)先在/etc/hosts裡新增一行,如下所示:

機器的實際IP地址為:192.168.134.130

[root@JMeter-01 /]# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.134.130 JMeter-01 localhost

2)然後修改/etc/sysconfig/network檔案裡面的HOSTNAME。

[root@JMeter-01 /]# vim /etc/sysconfig/network

# Created by anaconda
HOSTNAME=JMeter-01

則可以訪問成功。

(以上三種方式都可以試試,其實是一類問題)

(2)啟動jmeter-server服務情況二

出現如下所示:

[root@jmeter2 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 (沒有那個檔案或目錄)
An error occurred: Listen failed on port: 0; nested exception is: 
	java.io.FileNotFoundException: rmi_keystore.jks (沒有那個檔案或目錄)

提示你,找不到系統指定的檔案。

原因:要麼擁有RMI over SSL的有效金鑰庫,要麼禁用掉SSL。

解決方案禁用掉SSL:修改bin/jmeter.properties配置檔案,server.rmi.ssl.disable=true即可解決。

提示:master和slave機器上jmeter.properties配置檔案中,server.rmi.ssl.disable都改為true

(3)啟動jmeter-server服務情況三

執行機啟動jmeter-server服務,提示“Could notfind ApacheJmeter_core.jar”

原因:是因為JMeter沒有配置環境變數。

看之前的文章【Linux系統中執行JMeter指令碼】,裡面有詳細的配置環境變數說明。

3、分散式測試控制機接收不到返回結果

即:也就是關於控制機的多網路卡問題。

如果控制機(master)只有一個網路卡,不需要關注這個問題。

如果我們在練習的時候,只有一臺電腦,需要啟動虛擬機器完成演示的時候,就需要注意這裡的問題了。

(1)多網路卡出現的問題說明

JMeter採用了rmi進行遠端呼叫,如果控制機(master)有多個網路卡,它只是使用其中任意一個網路卡。

預設情況下,他會使用無線區域網介面卡這塊網路卡,而虛擬機器使用的網路卡是乙太網介面卡VIware Network Adapter VMnet8

如下圖所示:

image

這就導致JMeter的控制機(master)和執行機(slave)不在同一個網段內,會導致無法互通,出現的情況可能是控制機無法連線執行機,或者是執行機中的測試結果無法回傳給控制機。

(2)多網路卡出現的問題解決方式

我的測試機情況如下:

一臺Windows系統主機作為控制機,IP地址如上圖中所示。

在該主機上啟動了三臺虛擬機器,IP地址分別為192.168.134.129192.168.134.130192.168.134.131

1)執行機中的配置

修改jmeter-server檔案:

RMI_HOST_DEF=-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx(執行機的IP)

當然也可以不配置,在執行機啟動jmeter-server服務的時候,執行如下命令,也是一樣的。

./jmeter-server -Djava.rmi.server.hostname=xxx.xxx.xxx.xxx

2)控制機中的配置

修改jmeter.bat啟動檔案(我是Windows系統主機作為控制機)

在檔案中新增如下內容:

set rmi_host=-Djava.rmi.server.hostname=192.168.134.100
# 可新增,可修改
set ARGS=%DUMP% %HEAP% %NEW% %SURVIVOR% %TENURING% %PERM% %DDRAW% %rmi_host%

如下圖所示:

image

這樣就把控制機的IP網段從192.168.1.101換成了192.168.134.100

提示:

  • 設定網段的IP不要和虛擬機器中的IP衝突。
  • 這裡的配置是基於上一篇文章【JMeter分散式測試】中的配置。
  • 如果不需要進行分散式了,不要忘記把jmeter.bat啟動檔案修改回來,防止做其他工作時有影響。

這樣就設定後,Windows系統主機就可以控制三個Linux虛擬機器分散式執行指令碼了。

4、引數化問題

(1)引數化問題說明

  • 通常,我們編寫、除錯指令碼都是在 Window 機器上,而真正效能測試時,指令碼幾乎都在 Linux 下執行。
  • 使用 CSV 資料檔案做引數化時,是需要指定檔案路徑的。
  • 這裡就有個問題:Window 下寫的檔案路徑到了 Linux 下是不正確的,導致無法正常讀取 CSV 檔案。
  • 為了解決這個問題,下面將要講解一個簡單的萬能解決方法。

(2)兩個前提

  • 我們的 CSV 檔案必須在 JMeter的bin目錄下建立,然後再新增自己要的資料。
  • JMeter命令必須從bin目錄下啟動。

(3)操作方式

CSV 資料檔案設定元件中,直接按下面的格式寫:

image

這樣就可以了,只要把CSV檔案上傳到Linux系統 JMeter下的bin目錄,這個指令碼就可以跨平臺執行了。

(4)總結

  • ${__P(user.dir,)}${__P(file.separator,)}test.txt可以根據不同的系統,不同的JMeter安裝路。徑,自動獲取 Jmeter 路徑,然後再獲取不同系統下的檔案路徑分隔符,最後加上檔名稱拼成檔案路徑。
  • 這樣就可以解決使用CSV資料檔案做引數化時,跨平臺導致路徑不一致的問題。
  • 重點前提:CSV 檔案放在JMeter的bin目錄下,且到 bin 目錄中執行Jmeter命令。

5、其他補充

(1)修改埠號

JMeter分散式測試的預設埠號是1099,我們可以自定義修改埠號。

jmeter.properties配置檔案中修改:

  • server_port=10086:表示master機器要遠端連線的埠,即:remote_hosts=xxxx:10086
  • server.rmi.localport=10086:表示slave server啟動顯示的埠。

其實上面兩者一樣,修改改server_port即可。

(2)檢視分散式測試過程中

jmeter.properties配置檔案中修改mode=Standard

  • 用於檢視分散式測試過程中,每個壓力機的測試結果。
  • 若不啟用,在執行過程中,控制器是無法實時看到壓力機的結果。

提示:一般不需要開啟。

參考:

相關文章