1. 程式人生 > 實用技巧 >Jmeter系列- Jmeter 分散式測試

Jmeter系列- Jmeter 分散式測試

為什麼要做分散式

Jmeter 本身的侷限性

1、一臺壓力機的 Jmeter 預設 最大支援 1000 左右的併發使用者數(執行緒數) ,再大的話,容易造成卡頓、無響應等情況,這是受限於 Jmeter 其本身的機制和硬體配置(記憶體、CPU等)
2、由於 Jmeter 是 Java 應用, 對 CPU 和記憶體的消耗較大 ,在需要模擬大量併發使用者數時,單機很 容易出現 JAVA 記憶體溢位的錯誤 ,導致測試指令碼本身就有瓶頸

JVM 堆記憶體的侷限性

Java 應用的 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 堆記憶體來滿足測試的要求

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

聯想場景

1、測試 5000 併發的場景,但單機只能支援 1000 併發無法達到 5000
2、通過分散式(5 臺機器起)可以模擬 5000 併發

分散式壓測

Jmeter 支援分散式壓測,將需要模擬的大量併發使用者數分發到多臺壓力機,使 Jmeter 擁有更大的負載量,滿足真實業務場景(高併發場景)

分散式的最終目的

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

分散式原理

把上面的圖完整看完,就懂了,原理如下:

1、Master 是控制機,Slaves 是多個壓力機
2、分散式測試中,Master 通過命令列將測試指令碼分發給所有 Slave
3、Slave 不需要啟動 Jmeter GUI,通過 CLI 模式執行測試
4、Slave 執行完後,會把結果回傳給 Master
5、Master 收集所有 Slave 的結果並彙總成一個結果集

注意

1、壓力機也可以叫:負載機、代理機、執行機、奴隸機、肉雞....各種各樣的名字,但他們都是 Slave
2、Master 也 可以 執行 測試指令碼, 也 可 以 不執行 只負責管理

場景類比

1、一個測試部門有一個部門經理,五個測試小弟
2、有個巨型測試任務由部門經理劃分好模組後 分發 給五個測試小弟去測試


3、五個小弟測試完,會 各自發送 測試報告給部門經理
4、部門經理把所有測試報告 彙總 成一份,發給公司大佬看
5、而部門經理可以參與測試,也可以不參與測試只負責管理部門

分散式專用術語認知

Master
1、控制機
2、執行JMeter GUI(控制測試)的機器
Slave
1、壓力機
2、執行 jmeter-server 的機器
3、它從 GUI 接收命令並將請求傳送到目標系統
target
需要進行壓力測試的 Web 伺服器

實現分散式的前提條件

控制機和壓力機的 jmeter 要一致
具體體現在

1、jmeter 版本要一致
2、jdk 主版本要一致(1.7、1.8...)
3、jmeter 指令碼中,csv 檔案要一致
5、jmeter 的外掛要一致
6、同一區域網,防火牆開放埠

jdk 版本一致

看主版本即可

csv 檔案一致

主要是資料和路徑要一致

保證一致性方法

直接將控制機的 jmeter 壓縮包移到每個壓力機上解壓使用

壓力機配置

注意: 壓力機系統不限,可以是win、mac、linux

前置步驟

將控制機的 jmeter 壓縮包傳送到壓力機,解壓

修改 jmeter.properties(下面三步走)

進入 bin 目錄

修改 server_port 埠

預設1009

可修改任意埠,但不能已被佔用的哦

修改 server.rmi.port 埠

和 server_port 保持一致即可, 預設是會幫你保持一致的

設定 server.rmi.ssl.disable

預設 false,代表需要認證

設定為 true,減少不必要的麻煩

啟動 jmeter-server 服務

仍然在 bin 目錄下哦

如果壓力機是 linux 或 mac

./jmeter-server -Djava.rmi.server.hostname=壓力機ip
如果是window
jmeter-server.bat -Djava.rmi.server.hostname=壓力機ip

 

檢查防火牆

1、檢查防火牆是否被關閉,防火牆會影響指令碼執行和測試結構收集
2、確認 server_port 的埠 沒有被佔用以及需要對外開放 ,端口占用會導致壓力機報錯

控制機配置

修改 jmeter.properties(下面三步走)
修改 remote_hosts

1、多個壓力機之間用 , 隔開
2、不同壓力機 埠可以不一樣 ,不需要全部都一致
3、如果控制機也測試則加 127.0 . 0.1 :port ,然後修改 server_port 和 server.rmi.port (和壓力機一樣步驟)

設定 server.rmi.ssl.disable

設定 mode

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

控制機執行分散式測試

啟動遠端伺服器

這裡會顯示所有 remote_hosts 新增的壓力機

點選啟動後,檢視壓力機

分散式注意事項

1、如果併發較高,建議將控制機設定為只啟動測試指令碼和收集彙總測試結果
2、分散式測試中,如果 1S 傳送 100 個模擬請求,有 5 個壓力機,那麼需要將指令碼的執行緒數設定為 20,否則模擬請求數會變成 500,和預期結果相差太大
4、只需要修改控制機的指令碼,啟動之後,壓力機執行的就是最新的指令碼

具體栗子

針對注意事項二,我們來看看栗子

設定了 10 個執行緒

啟動兩臺壓力機的測試結果

一共發出了 20 個請求(10*2)

其實這就是分散式的好處,如果需要 1000 個併發使用者數,有 10 臺壓力機,每臺壓力機只需要滿足 100 個併發使用者數即可

分散式已知侷限性

1、若沒有代理,RMI 不能跨子網通訊,因此 JMeter 沒有代理是不行的
2、從 2.9 版本開始,JMeter傳送所有剝離了響應資料的結果到控制檯,這使我們降低了網路IO的影響,確保監控你的網路流量,使得網路不是爭議點
3、在 2-3 GHz 的 CPU 上,單個 JMeter 客戶端根據測試的型別,可以處理 1000-2000的執行緒

瞭解更多,加入我們,642830685,領取最新軟體測試大廠面試資料和Python自動化、介面、框架搭建學習資料!技術大牛解惑答疑,同行一起交流