如果你想從頭學習Jmeter,可以看看這個系列的文章哦
https://www.cnblogs.com/poloyy/category/1746599.html
為什麼要做分散式
Jmeter 本身的侷限性
- 一臺壓力機的 Jmeter 預設最大支援 1000 左右的併發使用者數(執行緒數),再大的話,容易造成卡頓、無響應等情況,這是受限於 Jmeter 其本身的機制和硬體配置(記憶體、CPU等)
- 由於 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 堆記憶體來滿足測試的要求
但是單機無法支撐數以萬計大併發,此時,需要多個壓力機進行分散式壓力測試,這樣效能瓶頸就不會是我們的壓力機了
聯想場景
- 測試 5000 併發的場景,但單機只能支援 1000 併發無法達到 5000
- 通過分散式(5 臺機器起)可以模擬 5000 併發
分散式壓測
Jmeter 支援分散式壓測,將需要模擬的大量併發使用者數分發到多臺壓力機,使 Jmeter 擁有更大的負載量,滿足真實業務場景(高併發場景)
分散式的最終目的
- 確保壓力機不會出現效能瓶頸
- 在後面進行效能分析時,不需要考慮壓力機是否會導致效能瓶頸的主要原因之一
分散式原理
把上面的動圖完整看完,就懂了,原理如下:
- Master 是控制機,Slaves 是多個壓力機
- 分散式測試中,Master 通過命令列將測試指令碼分發給所有 Slave
- Slave 不需要啟動 Jmeter GUI,通過 CLI 模式執行測試
- Slave 執行完後,會把結果回傳給 Master
- Master 收集所有 Slave 的結果並彙總成一個結果集
注意
- 壓力機也可以叫:負載機、代理機、執行機、奴隸機、肉雞....各種各樣的名字,但他們都是 Slave
- Master 也可以執行測試指令碼,也可以不執行只負責管理
場景類比
- 一個測試部門有一個部門經理,五個測試小弟
- 有個巨型測試任務由部門經理劃分好模組後分發給五個測試小弟去測試
- 五個小弟測試完,會各自傳送測試報告給部門經理
- 部門經理把所有測試報告彙總成一份,發給公司大佬看
- 而部門經理可以參與測試,也可以不參與測試只負責管理部門
分散式專用術語認知
Master
- 控制機
- 執行JMeter GUI(控制測試)的機器
Slave
- 壓力機
- 執行 jmeter-server 的機器
- 它從 GUI 接收命令並將請求傳送到目標系統
target
需要進行壓力測試的 Web 伺服器
實現分散式的前提條件
控制機和壓力機的 jmeter 要一致
具體體現在
- jmeter 版本要一致
- jdk 主版本要一致(1.7、1.8...)
- jmeter 指令碼中,csv 檔案要一致
- jmeter 的外掛要一致
- 同一區域網,防火牆開放埠
jdk 版本一致
看主版本即可
csv 檔案一致
主要是資料和路徑要一致
如何保持一致可以參考這篇部落格:https://www.cnblogs.com/poloyy/p/13189198.html
保證一致性方法
直接將控制機的 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
檢查防火牆
- 檢查防火牆是否被關閉,防火牆會影響指令碼執行和測試結構收集
- 確認 server_port 的埠沒有被佔用以及需要對外開放,埠占用會導致壓力機報錯
- 關於開放埠和關閉防火牆可以參考這篇部落格:https://www.cnblogs.com/poloyy/p/12213297.html
控制機配置
修改 jmeter.properties(下面三步走)
修改 remote_hosts
- 多個壓力機之間用 , 隔開
- 不同壓力機埠可以不一樣,不需要全部都一致
- 如果控制機也測試則加 127.0.0.1:port ,然後修改 server_port 和 server.rmi.port (和壓力機一樣步驟)
設定 server.rmi.ssl.disable
設定 mode
- 用於檢視分散式測試過程中,每個壓力機的測試結果
- 若不啟用,在執行過程中,控制器是無法實時看到壓力機的結果
控制機執行分散式測試
啟動遠端伺服器
這裡會顯示所有 remote_hosts 新增的壓力機
點選啟動後,檢視壓力機
分散式注意事項
- 如果併發較高,建議將控制機設定為只啟動測試指令碼和收集彙總測試結果
- 分散式測試中,如果 1S 傳送 100 個模擬請求,有 5 個壓力機,那麼需要將指令碼的執行緒數設定為 20,否則模擬請求數會變成 500,和預期結果相差太大
- 只需要修改控制機的指令碼,啟動之後,壓力機執行的就是最新的指令碼
具體栗子
針對注意事項二,我們來看看栗子
設定了 10 個執行緒
啟動兩臺壓力機的測試結果
一共發出了 20 個請求(10*2)
其實這就是分散式的好處,如果需要 1000 個併發使用者數,有 10 臺壓力機,每臺壓力機只需要滿足 100 個併發使用者數即可
分散式已知侷限性
- 若沒有代理,RMI 不能跨子網通訊,因此 JMeter 沒有代理是不行的
- 從 2.9 版本開始,JMeter傳送所有剝離了響應資料的結果到控制檯,這使我們降低了網路IO的影響,確保監控你的網路流量,使得網路不是爭議點
- 在 2-3 GHz 的 CPU 上,單個 JMeter 客戶端根據測試的型別,可以處理 1000-2000的執行緒