若是你想從頭學習Jmeter,能夠看看這個系列的文章哦html
https://www.cnblogs.com/poloyy/category/1746599.htmljava
爲何要作分佈式
Jmeter 自己的侷限性
- 一臺壓力機的 Jmeter 默認最大支持 1000 左右的併發用戶數(線程數),再大的話,容易形成卡頓、無響應等狀況,這是受限於 Jmeter 其自己的機制和硬件配置(內存、CPU等)
- 因爲 Jmeter 是 Java 應用,對 CPU 和內存的消耗較大,在須要模擬大量併發用戶數時,單機很容易出現 JAVA 內存溢出的錯誤,致使測試腳本自己就有瓶頸
JVM 堆內存的侷限性
Java 應用的 jvm 堆內存 heap 受壓力機硬件限制,雖然咱們能夠調整堆內存大小linux
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 堆內存來知足測試的要求併發
可是單機沒法支撐數以萬計大併發,此時,須要多個壓力機進行分佈式壓力測試,這樣性能瓶頸就不會是咱們的壓力機了jvm
聯想場景
- 測試 5000 併發的場景,但單機只能支持 1000 併發沒法達到 5000
- 經過分佈式(5 臺機器起)能夠模擬 5000 併發
分佈式壓測
Jmeter 支持分佈式壓測,將須要模擬的大量併發用戶數分發到多臺壓力機,使 Jmeter 擁有更大的負載量,知足真實業務場景(高併發場景)分佈式
分佈式的最終目的
- 確保壓力機不會出現性能瓶頸
- 在後面進行性能分析時,不須要考慮壓力機是否會致使性能瓶頸的主要緣由之一
分佈式原理
把上面的動圖完整看完,就懂了,原理以下:ide
- Master 是控制機,Slaves 是多個壓力機,Target 是被測系統
- 分佈式測試中,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.七、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的線程