一、為什麼要做分布式?
1、Jmeter 本身的局限性
· 一個 Jmeter服務預設最大支援 1000 左右的并發使用者數(線程數),再大的話,容易造成卡頓、無響應等情況,這是受限于Jmeter 其本身的機制和硬體配置(記憶體、CPU等)
· 由于 Jmeter 是 Java 應用,對 CPU 和記憶體的消耗較大,在需要模拟大量并發使用者數時,單機很容易出現 JAVA記憶體溢出的錯誤,導緻測試腳本本身就有瓶頸
2、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 堆記憶體來滿足測試的要求
3、聯想場景
· 測試 5000 并發的場景,但單機隻能支援 1000 并發無法達到 5000
· 通過分布式(5 台機器起)可以模拟 5000 并發
但是單機無法支撐數以萬計大并發,此時,需要多個壓力機進行分布式壓力測試,這樣性能瓶頸就不會是我們的壓力機了
4、分布式壓測
Jmeter 支援分布式壓測,将需要模拟的大量并發使用者數分發到多台壓力機,使 Jmeter 擁有更大的負載量,滿足真實業務場景(高并發場景)
5、分布式的最終目的
· 確定壓力機不會出現性能瓶頸
· 在後面進行性能分析時,不需要考慮壓力機是否會導緻性能瓶頸的主要原因之一
二、Jmeter分布壓測的原理
1、Jmeter分布式測試時,選擇其中一台作為控制機(Controller),其它機器做為代理機(Agent)。
2、執行時,Controller會把腳本發送到每台Agent上,Agent 拿到腳本後開始執行,Agent執行時不需要啟動Jmeter,隻需要把jmeter服務啟動(Windows:jmeter-server.bat/Linux:jmeter.sh),是通過指令行模式來執行的。
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官網連結:
Java_jdk官網連結:
(下面以CMP消費更新性能測試環境配置為例進行說明)
用戶端 | IP位址 | 主從 | 配置環境 |
Windows server | xx.xx.xx.187 | Master(控制機) | 4CPU,8G、Jmeter 5.1.1、java version "11.0.4" 2019-07-16 LTS |
Centos7 | xx.xx.xx.89 | Slave(執行機) | 24CPU,32G、Jmeter 5.1.1、java version "11.0.4" 2019-07-16 LTS |
Centos7 | xx.xx.xx.89 | Slave(執行機) | 24CPU,32G、Jmeter 5.1.1、java version "11.0.4" 2019-07-16 LTS |
Centos7 | xx.xx.xx.71 | Slave(執行機) | 4CPU,8G、Jmeter 5.1.1、java version "11.0.4" 2019-07-16 LTS |
Centos7 | xx.xx.xx.71 | Slave(執行機) | 4CPU,8G、Jmeter 5.1.1、java version "11.0.4" 2019-07-16 LTS |
這裡簡單介紹一下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機器的根路徑下的etc目錄下,找到一個為hosts的檔案,在檔案中添加DNS域名解析配置
配置完成後使用source使配置生效
在本地slave機器的Jmeter的bin目錄下,找到一個為jmeter.properties的檔案,在檔案内容中找到remote_hosts字段,添加遠端控制機的IP位址,端口預設是1099(可以根據需要改成其他可用的端口)。
注意:如果執行機的性能特别好,隻起一台jmeter服務完全不會對執行機的性能造成壓力,那可以在一台執行機上安裝多個jmter(版本是同一個,複制多個,修改為不同的名稱),啟用不同的端口。因為單台jmeter服務的性能上限為1000左右。
對應指令:
1、輸入Sudo su ,進入root權限
2、輸入 cd /app/install/jmeter/apache-jmeter-5.1.1/bin/ ,進入jmeter的bin目錄
3、輸入vim jmeter.properties,編輯jmeter.properties配置檔案(hosts檔案類似),點選鍵盤上的“insert”鍵進入編輯模式,修改遠端機IP和端口(執行機的遠端機對應的是排程機),編輯完成後點選鍵盤上“esc”鍵退出編輯模式
4、輸入 :!wq 儲存并退出。
5、輸入nohup ./jmeter-server -Djava.rmi.server.hostname=10.201.22.93 &,啟動jmeter服務。
如果要啟動多個jmeter服務,則分别進入到不同的jmeter檔案夾下的bin目錄,運作啟動指令。
6、輸入ps -ef|grep jmeter-server,檢視已經啟動的jmeter服務。
7、輸入kill -9 `ps aux | grep jmeter | grep -v grep | awk '{print $2}'`,殺掉所有的jmeter程序
五、排程機master配置
master機與slave機器的配置相似,同樣在Jmeter的bin目錄下,找到一個為jmeter.properties的檔案,在檔案内容中找到remote_hosts字段,添加slave機IP和端口。如果有多台執行機或者1台執行機上有多個jmeter服務(使用不同的端口啟動jmter服務),這裡需要把所有的執行機的IP位址和端口号都加入進來。
配置完了啟動master機的jmeter.bat服務,打開jmeter。
注意:每次修改配置後需要重新開機jmeter加載最新最新的配置資訊。
六、master運作分布式測試
1、添加線程組,編輯線程數,設定1個線程數,循環1次,這裡隻做示例
2、添加http請求
3、添加察看結果數和聚合報告,點選運作,可以選擇遠端啟動或者遠端全部啟動,如果是點選遠端啟動,可以選擇任意一台電腦來運作,如果是點選遠端全部啟動就會運作所有的代理機
4、這裡以點選遠端全部啟動為例。運作結束後,檢視聚合報告,每台電腦設定的線程數為1,這裡一共是4個jmeter服務,是以是4個線程數。
5.jmeter分布式測試中master機的測試結果響應資料為空,原因是:
分布式測試中,通過遠端啟動代理伺服器,注重的而是高并發,預設檢視結果樹中的響應資料為空,隻有錯誤資訊會被報回。
如果想要結果傳回,直接把bin\jmeter.properties檔案中的 mode=Standard 之前的 # 号去掉,重新開機jmeter即可
6、Dos指令視窗使用指令行運作jmeter
指令樣式:jmeter -n -t 【jmeter腳本路徑】 -r -l 【日志路徑】 -e -o 【生成報告的路徑】
指令示例:
jmeter -n -t C:\Users\hwu\Desktop\PerformanceScript\CMP\PerformanceScriptOfConsumptionUpgrade.jmx -r -l C:\Users\hwu\Desktop\PerformanceScript\CMP\report\JTL\hunhe-10000-120s-16.jtl -e -o C:\Users\hwu\Desktop\PerformanceScript\CMP\report\ReportOfNoGUI\hunhe-10000-120s-16
執行結果:
生成的報告是以檔案夾的方式,檔案夾内包含相應的資料
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:
遠端啟動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 //關閉防火牆
問題2:
當設定csv檔案路徑時,如果路徑不對,無響應
解決方法:
将csv檔案以“相對路徑”命名,即将csv檔案直接放入bin目錄下,在Jmeter路徑中直接寫入檔案名
問題3:
(Linux)預設端看1099被占用,如何關閉某個被占用端口的方法
1)netstat -ntlp //檢視目前是以tcp端口
nestat -ntulp |grep 1109 //檢視所有1109端口使用情況
2)lsof -i:1109 //檢視占用1109端口的程式pid
3)kill -9 1109 //kill掉該程序
(windows)上關閉已被占用的端口
如1099端口被占用:1)在cmd指令行下輸入以下指令:netstat -aon|findstr "1099",回車之後就可以看見清單中的PID,然後根據PID在電腦的任務管理器中檢視對應的占用程式,然後将其關閉即可;2)然後根據查詢的PID找到對應的程序,我們可以看到占有1099這個程式的程序ID,如:5264,繼續輸入指令【tasklist|findstr "5264"】,5264就是程序ID,現在知道是哪個程序占用的我們的端口,即可在任務管理器中殺掉該程序。
問題4:
如果使用slave發送資料後,長時間無響應
問題排查:
1)檢視發送的資料中是否存在csv參數檔案,檢視slave機器的bin目錄下是否有該檔案;
2)檢視建立的tcp采樣器中屬性“TCPClient classname”處是否添加協定:org.apache.jmeter.protocol.tcp.sampler.BinaryTCPClientImpl