Jmeter-分布式壓測配置及常見問題(一文全)


Jmeter-分布式壓測傻瓜式配置及常見問題的解決

參考Jmeter官網內容 http://jmeter.apache.org/usermanual/jmeter_distributed_testing_step_by_step.html

一、為什么要做分布式??

1、Jmeter 本身的局限性

  • 一台壓力機的 Jmeter 默認最大支持 1000 左右的並發用戶數(線程數),再大的話,容易造成卡頓、無響應等情況,這是受限於
    Jmeter 其本身的機制和硬件配置(內存、CPU等)
  • 由於 Jmeter 是 Java 應用,對 CPU 和內存的消耗較大,在需要模擬大量並發用戶數時,單機很容易出現 JAVA
    內存溢出的錯誤,導致測試腳本本身就有瓶頸

2、JVM 堆內存的局限性
ava 應用的 jvm 堆內存 heap 受壓力機硬件限制,雖然我們可以調整堆內存大小

cmd 啟用 Jmeter GUI 時,也會有提示

increase Java Heap to meet your test requirements: Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file

翻譯:增加 Java 堆內存來滿足測試的要求

但是單機無法支撐數以萬計大並發,此時,需要多個壓力機進行分布式壓力測試,這樣性能瓶頸就不會是我們的壓力機了

3、聯想場景

  • 測試 5000 並發的場景,但單機只能支持 1000 並發無法達到 5000
  • 通過分布式(5 台機器起)可以模擬 5000 並發

但是單機無法支撐數以萬計大並發,此時,需要多個壓力機進行分布式壓力測試,這樣性能瓶頸就不會是我們的壓力機了

4、分布式壓測
Jmeter 支持分布式壓測,將需要模擬的大量並發用戶數分發到多台壓力機,使 Jmeter 擁有更大的負載量,滿足真實業務場景(高並發場景)

5、分布式的最終目的

  • 確保壓力機不會出現性能瓶頸
  • 在后面進行性能分析時,不需要考慮壓力機是否會導致性能瓶頸的主要原因之一

二、Jmeter分布壓測的原理

1、Jmeter分布式測試時,選擇其中一台作為控制機(Controller),其它機器做為代理機(Agent)。
2、執行時,Controller會把腳本發送到每台Agent上,Agent 拿到腳本后開始執行,Agent執行時不需要啟動Jmeter,只需要把jmeter-server.bat文件打開,它應該是通過命令行模式來執行的。
3、執行后,Agent會把結果回傳給Controller,Controller會收集所有Agent的信息並匯總。

先殺個原理圖:
在這里插入圖片描述
這個圖說明的是要一台控制機,然后由這台控制機發壓測腳本到每台遠程執行機,然后由控制機收集執行機結果

首先,在我們開始之前,有幾件事要檢查
1.系統上的防火牆已關閉或打開了正確的端口。
2.所有客戶端都在同一子網中。
3.如果使用192.xxx或10.xxx IP地址,則服務器位於同一子網中。如果服務器不使用192.xx或10.xx IP地址,則應該沒有任何問題。
4.確保JMeter可以訪問服務器。
5.確保在所有系統上使用相同版本的JMeter和Java。混合版本將無法正常工作。
6.您已經為RMI設置了SSL或將其禁用。


三、環境准備

Jmeter安裝包和JAVA jdk 安裝包自行下載:

Jmeter官網鏈接:https://jmeter.apache.org/download_jmeter.cgi
Java_jdk官網鏈接:https://www.oracle.com/technetwork/java/javase/downloads/index.html

客戶端 IP地址 主從 配置環境
Mac 用ifconfig查看/網絡偏好設置-高級-TCP/IP Master(控制機) Jmeter 4.0,JAVA jdk
Ubuntu 16.04 10.211.55.9 Slave(執行機) Jmeter 4.0,JAVA jdk
CentOS 7 10.211.55.6 Slave(執行機) Jmeter 4.0,JAVA jdk

(環境方面的配置就不做介紹了,不懂的話問度娘吧!)

這里簡單介紹一下Jmeter的bin目錄下的文件:

# bin:是核心可執行文件,目錄下常用文件配置有:
	 jmeter.bat: windows啟動文件:
	 jmeter: mac或者linux啟動文件:
	 jmeter-server:mac或者Liunx分布式壓測使用的啟動文件
	 jmeter-server.bat:mac或者Liunx分布式壓測使用的啟動文件
	 jmeter.properties: 核心配置文件
	 examples:壓測腳本文件JMX和動態讀取csv參數文件案例
	 result—template:可視化HTML
	 template:JMX的模板文件

四、執行機slave配置

在本地slave機器的Jmeter的bin目錄下,找到一個為jmeter.properties的文件,在文件內容中找到remote_hosts字段,添加一個遠程負載機的IP地址,負載機查詢本機IP並填入,端口默認是1099。
在這里插入圖片描述
在這里插入圖片描述
這里要特別注意端口后,有些資料說明端口1644為jmeter的controller 和agent 之間進行通信的默認RMI端口號,但是在測試時發現,設置為1644運行不成功,改成1099后運行通過。另外還要留意agent的機子是否開啟了防火牆等。

配置完了啟動jmeter-sever.bat
在這里插入圖片描述
啟動以后看到這個就基本👌了
在這里插入圖片描述

五、調度機master配置

master機與slave機器的配置相似,同樣在Jmeter的bin目錄下,找到一個為jmeter.properties的文件,在文件內容中找到remote_hosts字段,添加本機的IP以及slave機IP。如果有多台代理機,這里需要把所有的代理機的IP地址和端口號都加入進來。

在這里插入圖片描述
配置完了啟動master機的jmeter-sever.bat服務,設置完成了

六、master運行分布式測試

1、添加線程組,編輯線程數,設置1個線程數,循環1次,這里只做示例

2、添加http請求,這里以訪問www.baidu.com為例。

在這里插入圖片描述
3、添加察看結果數和聚合報告,點擊運行,可以選擇遠程啟動或者遠程全部啟動,如果是點擊遠程啟動,可以選擇任意一台電腦來運行,如果是點擊遠程全部啟動就會運行控制機和所有的代理機

在這里插入圖片描述
出現這個說明數據接收成功
在這里插入圖片描述

4、這里以點擊遠程全部啟動為例。運行結束后,查看聚合報告,每台電腦設置的線程數為1,這里一共是兩台電腦,所以是2個線程數。

在這里插入圖片描述
5.jmeter分布式測試中master機的測試結果響應數據為空,原因是:
分布式測試中,通過遠程啟動代理服務器,注重的而是高並發,默認查看結果樹中的響應數據為空,只有錯誤信息會被報回。

如果想要結果返回,直接把bin\jmeter.properties文件中的 mode=Standard 之前的 # 號去掉,重啟jmeter即可
在這里插入圖片描述

6.命令行啟動遠程分布式
jmeter -n -t xxx.jmx -r -l results.jtl -e -o /path

n:以非GUI形式運行Jmeter
t:表示要運行的jmx腳本路徑
l:result.jtl 運行結果保存路徑(.jtl),此文件必須不存在
r:指遠程將所有agent啟動
e:在腳本運行結束后生成html報告
o:用於存放html報告的目錄

Jmeter進行分布式測試時需要特別注意的

1)如果使用csv進行參數化,需要把參數文件在每台slave上拷貝一份,最好都放置在bin目錄下,因為Jmeter會直接從bin目錄下查找;

2)slave機器執行腳本時,若斷言執行成功則在master機器上是看不到請求響應數據的,只有在斷言出錯時才可鍵slave的返回;

3)若要使用Jmeter分布式進行測試,TCP取樣器中“TCPClient classname”該欄必須填寫對應的協議;

4)以十六進發送tcp數據包時,TCP取樣器中“End of line(EOL) byte value”必須填寫數據包的結束符,否則jmeter會一直等待,無響應。

七、Jmeter分布式測試常見問題

問題1
在master上運行jmeter-server.bat時,出現“Exception creating connection to:192.16..;nested exception is:java.io.FileNotFoundException:rmi_keystore.jks(系統找不到指定的文件)”錯誤

解決方案
修改apache-jmeter/bin/jmeter.properties 參數:server.rmi.ssl.disable=true

備注:將master和slave機器上的jmeter.properties文件 參數server.rmi.ssl.disable均改為true

其中linux上是用以下命令:vi jmeter.properties 使用/server.rmi.ssl.disable/進行查找

問題2
在slave上(linux系統)運行jmeter-server時,出現“An error occurred: Cannot start. localhost is a loopback address”錯誤

解決方案
方法一:運行以下命令:./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下后台執行,啟用server:nohup ./jmeter-server -Djava.rmi.server.hostname=192.16.. &

查看確定jmeter是否啟動成功:ps axu | grep jmeter

問題3
遠程啟動slave機器時,如出現“Jmeter nested exception is:java.net.ConnectException connection timed out:connect ”錯誤

解決方案

1)查看slave上的ip與master配置文件中的ip是否一致;

如果不一致,查看slave機器上是否有虛擬網卡,將網卡關閉,在此啟動Jmeter-server.bat,查看是否正確

2)查看防火牆是否關閉

注:centos7上關閉防火牆: firewall-cmd --state //查看防火牆狀態

                       systemctl stop firewalld.service //關閉防火牆

問題4
當設置csv文件路徑時,如果路徑不對,無響應

解決方法
將csv文件以“相對路徑”命名,即將csv文件直接放入bin目錄下,在Jmeter路徑中直接寫入文件名

問題5:
(Linux)默認端看1099被占用,如何關閉某個被占用端口的方法

1)netstat -ntlp //查看當前所以tcp端口

nestat -ntulp |grep 1109 //查看所有1109端口使用情況

2)lsof -i:1109 //查看占用1109端口的程序pid

3)kill -9 1109 //kill掉該進程

(windows)上關閉已被占用的端口

http://www.jb51.net/os/windows/203315.html

如1099端口被占用:1)在cmd命令行下輸入以下命令:netstat -aon|findstr "1099",回車之后就可以看見列表中的PID,然后根據PID在電腦的任務管理器中查看對應的占用程序,然后將其關閉即可;2)然后根據查詢的PID找到對應的進程,我們可以看到占有1099這個程序的進程ID,如:5264,繼續輸入命令【tasklist|findstr "5264"】,5264就是進程ID,現在知道是哪個進程占用的我們的端口,即可在任務管理器中殺掉該進程。

問題6
如果使用slave發送數據后,長時間無響應

問題排查

1)查看發送的數據中是否存在csv參數文件,查看slave機器的bin目錄下是否有該文件;

2)查看建立的tcp采樣器中屬性“TCPClient classname”處是否添加協議:org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl

問題7
如果你的JMeter返回數據是亂碼

解決方法
在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

解決方法
1)bin目錄下打開jmeter.bat文件,查找set HEAP,將set HEAP=-Xms128m -Xmx512m修改為set HEAP=-Xms512m -Xmx512m;2)重新啟動jmeter.bat即可

問題9
當jmeter用作數據庫API測試時,如果數據庫接口中參數中傳遞一個數組,如getApps(int nu, int appID[ ]),實際使用過程中報語法錯誤

解決方法
可嘗試在調用該接口傳參中加入關鍵字“ARRAY”,如getApps(3, ARRAY[7,8])

更新中....


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM