Jmeter分布式測試的注意事項和常見問題
Jmeter是一款開源的性能測試工具,使用Jmeter進行分布式測試時,也需要注意一些細節(jié)和問題,否則可能會影響測試結(jié)果的準確性和可靠性。
一、Jmeter分布式測試時需要特別注意的幾個方面
1. 參數(shù)化文件的位置和內(nèi)容
如果使用csv文件進行參數(shù)化,即通過讀取csv文件中的數(shù)據(jù)來為測試腳本提供不同的輸入值,那么需要注意以下兩點:
- 需要把參數(shù)文件在每臺slave上拷貝一份,最好都放置在bin目錄下,因為Jmeter會直接從bin目錄下查找;
- 參數(shù)文件的內(nèi)容要保持一致,即每臺slave上的參數(shù)文件的行數(shù)、列數(shù)、數(shù)據(jù)類型等都要相同,否則可能會導(dǎo)致數(shù)據(jù)不匹配或缺失。
2. slave機器的響應(yīng)數(shù)據(jù)
slave機器執(zhí)行腳本時,若斷言執(zhí)行成功,則在master機器上是看不到請求響應(yīng)數(shù)據(jù)的,只有在斷言出錯時才可見slave的返回。這是為了節(jié)省網(wǎng)絡(luò)帶寬和提高測試效率,因為在分布式測試中,通常只關(guān)心測試結(jié)果的統(tǒng)計和分析,而不需要查看每個請求的詳細數(shù)據(jù)。如果需要查看slave的響應(yīng)數(shù)據(jù),可以在slave機器上打開jmeter.log文件,或者在master機器上設(shè)置Jmeter屬性mode=Standard,但這樣會增加網(wǎng)絡(luò)開銷和測試時間。
3. TCP取樣器的配置
若要使用Jmeter分布式進行TCP協(xié)議的測試,需要注意以下兩點:
- TCP取樣器中“TCPClient classname”該欄必須填寫對應(yīng)的協(xié)議,例如,如果要發(fā)送二進制數(shù)據(jù),就要填寫org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl,如果要發(fā)送文本數(shù)據(jù),就要填寫org.apache.jmeter.protocol.tcp.sampler.TCPClientImpl,否則可能會出現(xiàn)數(shù)據(jù)格式錯誤或無法發(fā)送的問題;
- 以十六進制發(fā)送tcp數(shù)據(jù)包時,TCP取樣器中“End of line(EOL) byte value”必須填寫數(shù)據(jù)包的結(jié)束符,例如,如果數(shù)據(jù)包以0D 0A結(jié)尾,就要填寫13,否則jmeter會一直等待,無響應(yīng)。
4. Linux下配置jmeter環(huán)境變量
如果在Linux系統(tǒng)下使用Jmeter,需要配置jmeter環(huán)境變量,以便于在命令行中直接啟動jmeter。具體步驟如下:
編輯/etc/profile文件,添加如下變量:
export JMETER_HOME=/usr/local/jmeter-5.0
export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$CLASSPATH
export PATH=$JMETER_HOME/bin:$PATH
使配置文件立即生效,執(zhí)行命令:
source /etc/profile
查看是否安裝成功,執(zhí)行命令:
jmeter -v
二、Jmeter分布式測試的常見問題和解決方法
問題1:在master上運行jmeter-server.bat時,出現(xiàn)“Exception creating connection to:192.16..;nested exception is:java.io.FileNotFoundException:rmi_keystore.jks(系統(tǒng)找不到指定的文件)”錯誤
原因:Jmeter4.0以上的版本,默認啟用RMI連接的安全通信,需要創(chuàng)建密鑰庫。所以如果沒有創(chuàng)建密鑰庫,就會出現(xiàn)這個錯誤。
解決方法:
- 方法一:修改apache-jmeter/bin/jmeter.properties 參數(shù):server.rmi.ssl.disable=true
備注:將master和slave機器上的jmeter.properties文件 參數(shù)server.rmi.ssl.disable均改為true
其中l(wèi)inux上是用以下命令:vi jmeter.properties 使用/server.rmi.ssl.disable/進行查找
- 方法二:手動生成秘鑰和證書。執(zhí)行create-rmi-keystore.bat(Windows適用)或create-rmi-keystore.sh(Linux適用) 生成server.rmi.ssl.keystore.file的key文件,然后將key文件復(fù)制到所有的負載機的bin目錄下 修改jmeter.properties中
問題2:在slave上(linux系統(tǒng))運行jmeter-server時,出現(xiàn)“An error occurred: Cannot start. localhost is a loopback address”錯誤
原因:Jmeter默認使用localhost作為RMI的主機名,但是localhost是一個回環(huán)地址,不能用于遠程連接。
解決方法:
- 方法一:運行以下命令:./jmeter-server -Djava.rmi.server.hostname=192.16.*.*(本機ip)
- 方法二:修改jmeter-server文件
# vi jmeter-server 將jmeter-server中的RMI_HOST_DEF=-Djava.rmi.server.hostname=192.16.*.*(本機ip)
運行./jmeter-server即可。
備注:Linux下后臺執(zhí)行,啟用server:nohup ./jmeter-server -Djava.rmi.server.hostname=192.16.. &
查看確定jmeter是否啟動成功:ps axu | grep jmeter
問題3:遠程啟動slave機器時,如出現(xiàn)“Jmeter nested exception is:java.net.ConnectException connection timed out:connect ”錯誤
原因:可能是由于以下幾種情況導(dǎo)致的:
- slave上的ip與master配置文件中的ip不一致;
- slave機器上有虛擬網(wǎng)卡,導(dǎo)致ip地址不正確;
- 防火墻或者安全軟件阻止了RMI的通信。
解決方法:
- 查看slave上的ip與master配置文件中的ip是否一致;
- 如果不一致,查看slave機器上是否有虛擬網(wǎng)卡,將網(wǎng)卡關(guān)閉,在此啟動Jmeter-server.bat,查看是否正確
- 查看防火墻是否關(guān)閉
注:centos7上關(guān)閉防火墻: firewall-cmd --state //查看防火墻狀態(tài):
systemctl stop firewalld.service //關(guān)閉防火墻
問題4:當設(shè)置csv文件路徑時,如果路徑不對,無響應(yīng)
原因:Jmeter在讀取csv文件時,如果找不到文件,會一直等待,而不會報錯。
解決方法:將csv文件以“相對路徑”命名,即將csv文件直接放入bin目錄下,在Jmeter路徑中直接寫入文件名
問題5:(Linux)默認端看1099被占用,如何關(guān)閉某個被占用端口的方法
原因:Jmeter使用RMI進行分布式測試時,需要使用1099端口作為注冊端口,如果該端口被其他程序占用,就會導(dǎo)致無法啟動jmeter-server或者無法連接slave。
解決方法:
查看當前所有tcp端口,執(zhí)行命令:
netstat -ntlp
查看所有1099端口使用情況,執(zhí)行命令:
nestat -ntulp |grep 1099
查看占用1099端口的程序pid,執(zhí)行命令:
lsof -i:1099
kill掉該進程,執(zhí)行命令:
kill -9 1109 //kill掉該進程
問題6:如果使用slave發(fā)送數(shù)據(jù)后,長時間無響應(yīng)
原因:可能是由于以下幾種情況導(dǎo)致的:
- 發(fā)送的數(shù)據(jù)中存在csv參數(shù)文件,但是slave機器的bin目錄下沒有該文件;
- 建立的tcp采樣器中屬性“TCPClient classname”處沒有添加協(xié)議:org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl
解決方法:
- 查看發(fā)送的數(shù)據(jù)中是否存在csv參數(shù)文件,查看slave機器的bin目錄下是否有該文件;
- 查看建立的tcp采樣器中屬性“TCPClient classname”處是否添加協(xié)議:org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl
問題7:如果你的JMeter返回數(shù)據(jù)是亂碼
原因:可能是由于JMeter的默認編碼和服務(wù)器的編碼不一致,導(dǎo)致數(shù)據(jù)轉(zhuǎn)換出錯。
解決方法:在JMeter安裝路徑的bin目錄下,打開文件jmeter.properties,把Sampleresult.default.encoding的值改為 utf-8 即可。
問題8:啟動jmeter時,報錯:Error occurred during initialization of VM Could not reserve enough space for object heap errorlevel=1
原因:可能是由于JMeter的默認堆內(nèi)存大小不足以支持測試的負載,導(dǎo)致內(nèi)存溢出。
解決方法:
- bin目錄下打開jmeter.bat文件,查找set HEAP,將set HEAP=-Xms128m -Xmx512m修改為set HEAP=-Xms512m -Xmx512m;
- 重新啟動jmeter.bat即可
問題9:當jmeter用作數(shù)據(jù)庫API測試時,如果數(shù)據(jù)庫接口中參數(shù)中傳遞一個數(shù)組,如getApps(int nu, int appID[ ]),實際使用過程中報語法錯誤
原因:可能是由于JMeter的默認參數(shù)分隔符是逗號,而數(shù)組參數(shù)需要用分號分隔,導(dǎo)致語法錯誤。
解決方法:在JMeter的數(shù)據(jù)庫連接配置中,將參數(shù)分隔符改為分號即可。
問題10:當jmeter在windows控制機中添加cvs文件參數(shù)化的時候,負載機沒有沒有文件的時候,遠程啟動后會執(zhí)行失敗。(即使cvs文件中的變量沒有被引用)
原因:可能是由于JMeter在遠程啟動時,會先檢查參數(shù)文件的存在性,如果不存在,就會報錯。
解決方法:在負載機上添加相同的參數(shù)文件,或者在控制機上刪除參數(shù)文件的引用。