自己在使用JMeter進行分散式測試的時候,遇到了很多的坑。下面總結起來,方便以後檢視。
1、控制機端
(1)執行機沒有關閉防火牆
在執行機IP+埠號
設定正確的情況下,控制機在啟動測試計劃的時候,出現如下情況:
Windows系統,下的GUI介面:
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
active(running)
:說明防火牆是開啟狀態。
2)關閉執行的防火牆使用命令:systemctl stop firewalld.service
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
。
方法三:
也有可能是hostname
與localhost
不一致導致的。
當在 /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
。
如下圖所示:
這就導致JMeter的控制機(master
)和執行機(slave
)不在同一個網段內,會導致無法互通,出現的情況可能是控制機無法連線執行機,或者是執行機中的測試結果無法回傳給控制機。
(2)多網路卡出現的問題解決方式
我的測試機情況如下:
一臺Windows系統主機作為控制機,IP地址如上圖中所示。
在該主機上啟動了三臺虛擬機器,IP地址分別為192.168.134.129
、192.168.134.130
、192.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%
如下圖所示:
這樣就把控制機的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 資料檔案設定元件中,直接按下面的格式寫:
這樣就可以了,只要把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
。
- 用於檢視分散式測試過程中,每個壓力機的測試結果。
- 若不啟用,在執行過程中,控制器是無法實時看到壓力機的結果。
提示:一般不需要開啟。
參考: