天天看點

個人收藏用-Jmeter-分布式壓測傻瓜式配置及常見問題的解決

一、為什麼要做分布式?

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的資訊并彙總。

先殺個原理圖:

個人收藏用-Jmeter-分布式壓測傻瓜式配置及常見問題的解決

這個圖說明的是要一台控制機,然後由這台控制機發壓測腳本到每台遠端執行機,然後由控制機收集執行機結果

首先,在我們開始之前,有幾件事要檢查:

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域名解析配置

個人收藏用-Jmeter-分布式壓測傻瓜式配置及常見問題的解決

配置完成後使用source使配置生效

在本地slave機器的Jmeter的bin目錄下,找到一個為jmeter.properties的檔案,在檔案内容中找到remote_hosts字段,添加遠端控制機的IP位址,端口預設是1099(可以根據需要改成其他可用的端口)。

個人收藏用-Jmeter-分布式壓測傻瓜式配置及常見問題的解決
個人收藏用-Jmeter-分布式壓測傻瓜式配置及常見問題的解決
個人收藏用-Jmeter-分布式壓測傻瓜式配置及常見問題的解決

注意:如果執行機的性能特别好,隻起一台jmeter服務完全不會對執行機的性能造成壓力,那可以在一台執行機上安裝多個jmter(版本是同一個,複制多個,修改為不同的名稱),啟用不同的端口。因為單台jmeter服務的性能上限為1000左右。

個人收藏用-Jmeter-分布式壓測傻瓜式配置及常見問題的解決

對應指令:

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位址和端口号都加入進來。

個人收藏用-Jmeter-分布式壓測傻瓜式配置及常見問題的解決

配置完了啟動master機的jmeter.bat服務,打開jmeter。

注意:每次修改配置後需要重新開機jmeter加載最新最新的配置資訊。

六、master運作分布式測試

1、添加線程組,編輯線程數,設定1個線程數,循環1次,這裡隻做示例

2、添加http請求

個人收藏用-Jmeter-分布式壓測傻瓜式配置及常見問題的解決

3、添加察看結果數和聚合報告,點選運作,可以選擇遠端啟動或者遠端全部啟動,如果是點選遠端啟動,可以選擇任意一台電腦來運作,如果是點選遠端全部啟動就會運作所有的代理機

個人收藏用-Jmeter-分布式壓測傻瓜式配置及常見問題的解決

4、這裡以點選遠端全部啟動為例。運作結束後,檢視聚合報告,每台電腦設定的線程數為1,這裡一共是4個jmeter服務,是以是4個線程數。

個人收藏用-Jmeter-分布式壓測傻瓜式配置及常見問題的解決

5.jmeter分布式測試中master機的測試結果響應資料為空,原因是:

分布式測試中,通過遠端啟動代理伺服器,注重的而是高并發,預設檢視結果樹中的響應資料為空,隻有錯誤資訊會被報回。

如果想要結果傳回,直接把bin\jmeter.properties檔案中的 mode=Standard 之前的 # 号去掉,重新開機jmeter即可

個人收藏用-Jmeter-分布式壓測傻瓜式配置及常見問題的解決
個人收藏用-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-分布式壓測傻瓜式配置及常見問題的解決
個人收藏用-Jmeter-分布式壓測傻瓜式配置及常見問題的解決

生成的報告是以檔案夾的方式,檔案夾内包含相應的資料

個人收藏用-Jmeter-分布式壓測傻瓜式配置及常見問題的解決

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

繼續閱讀