使用Jmeter進行性能測試及性能監控平臺搭建

轉載:https://blog.csdn.net/qq_36792120/article/details/125265765

一、性能測試基本概念
1、爲什麼要做性能測試?
2、什麼是性能測試?
3、常見性能壓力測試工具
4、JMeter 優點
5、JMeter安裝
二、壓測腳本的錄製與編寫
一、JMeter配置
二、瀏覽器配置
三、錄製與回放
三、虛擬用戶併發模擬
1、Number Of Threads(users)
2、Ramp-up Period(seconds):
3、Loop Count:循環次數
4、Specify Thread Lifttime:
2,其他線程組
四、壓測結果分析
一、Listener View Result Tree
二、AggreGate Report
三、Backend Listener
五、Jmeter進行分佈式壓測
一,分佈式簡介:
二,工作節點(slave)部署
三、控制節點(master)部署
六、性能監控系統
一、簡介
二、部署
1、部署InfluxDB
2、部署Grafana
七、性能監控體系實戰
一、Prometheus簡介
二、部署Prometheus
三,被測機安裝node-exporter
四,在Prometheus裏添加exporter
一、性能測試基本概念
1、爲什麼要做性能測試?
滿足用戶使用需求:網站訪問量大崩潰, 12306 、微博、外賣
最小化成本:新服務上線不知道部署多少臺服務器
評估應用系統性能,給運維做系統容量規劃提供依據、給開發提供應用調優參考
2、什麼是性能測試?
模擬多個用戶的操作對服務器硬件性能的影響
TPS(Transaction Per Second )每秒事物處理能力
RT( Response Time )響應時間
3、常見性能壓力測試工具
Apache ab: HTTP 服務器性能基準工具。
Apache Jmeter:支持很多協議,開源免費,使用 Java 語言開發
LoadRunner :支持很多協議,收費軟件,使用 C 語言開發
Locust:有 Web 界面,支持很多協議,開源免費,使用 Python 語言開發
nGrinder : Naver 公司基於 Grinder 開發的性能測試平臺。 Grinder 是一個能運行jython (在 JVM 上運行的 Python )、 groovy 編寫測試腳本的應用程序。免費軟件,使用 lava 語言開發。 admin ) ‘運行 ngrinder-Controller.war ,默認賬戶與密碼:admin
4、JMeter 優點
入門簡單,有圖形調試界面
使用 Java 語言開發,支持多操作系統平臺
插件機制,可以二次開發定製協議。可以使用三方開發者開發的協議支持
5、JMeter安裝
下載JDK
下載地址: https://www. oracle.com/java/technologies/ oracle-java-archive-downloads.html
添加環境變量
Windows:
*JAVA_HOME: C: \Program Files \Java\jdk1.8.0_144
Path: %JAVA_HOME%\bin
*macOS/Linux
*JAVA_HOME=/usr/local/jdk1.8.0_144
*export PATH=$(JAVA_HOME}/bin: $PATH
下載jmeter
下載地址:https://jmeter.apache.org/download_jmeter.cgi
二、壓測腳本的錄製與編寫
一、JMeter配置
添加 Recording Controller
路徑: Test Plan-> Thread Group->Add-> Logic Controller-> RecordingController

二、瀏覽器配置
在谷歌瀏覽器使用switchOmega設置Charles監聽端口

下載地址:https://proxy-switchyomega.com/

安裝:下載完成以後進入chrome瀏覽器-點擊右上角“…”圖標-點擊更多根據-擴展程序-把剛剛下載的crx文件拖進來

配置:裝上後點擊瀏覽器右上角擴展程序圖標-選擇omega小程序-點擊選項進行配置-可以查看到這個頁面,127.0.0.1默認是本地的,端口輸入8888是因爲我們在上圖配置的默認端口就是8888


這裏記得選擇HTTP,否則會連不上!!

接着,我們點擊右上角的proxy工具,選擇我們配置的代理,即可使用

這個時候去訪問網頁會出現這個提示,是因爲我們jemter代理目前沒啓動,是正常的,大家不要慌


三、錄製與回放
首先我們先來熟悉下jmeter頁面的基礎配置

1、HTTPS Domains:如果想要抓取http協議,這裏可以不用配置,只有抓取https協議才需要配置,支持通配符
2、Target Controller:設置接收請求後要把參數寫入的地方,默認是Use Recording Controller,支持選擇其他配置
3、配置完後我們可以點擊Start按鈕進行啓動,啓動後它會自動的生成一個證書,並放在bin目錄下


我們在沒有導入證書的時候,訪問時候是會報錯的,會提示代理服務器出現問題,我們需要導入證書。需要進入剛剛那個文件夾目錄,雙擊crt後綴的證書,進行如下操作

 

選擇受信任的根證書辦法機構,點擊下一頁,點擊完成,它會彈出導入成功的彈框,至此證書安裝完成!這個時候我們點擊start按鈕,然後運行代理以後,就可以正常的訪問網頁,進行抓包啦!

這裏是我開啓錄製以後抓的包,非常多,很多沒用的數據,我們可以過濾掉!我這邊在url patterns to exclude/include裏的過濾功能啦~這裏支持正則表達式

拿到我們要的數據以後,我們可以點擊點擊上方綠色的運行的圖標,這個時候它會運行線程組裏的請求,爲了方便查看,我們可以添加查看結果樹(Thread Group-Add-Listener-View Results Tree)


三、虛擬用戶併發模擬
我們新建線程組以後,可以對線程組一些參數進行配置:


1、Number Of Threads(users)
默認使用幾個線程去請求頁面
默認是1 user
2、Ramp-up Period(seconds):
啓動進程以後幾秒去把user生成完成
默認是1s
如果設置的線程數是50,設置需要5s內完成,那每秒就執行10次
3、Loop Count:循環次數
默認是1
如果勾選Infinite就可以一直跑
測試時候我們一般是一直運行這個操作或者是慢慢遞增數量)
4、Specify Thread Lifttime:
有兩個選項
Duration(seconds):進程啓動幾秒後停止
Startup delay(seconds):啓動進程以後要等待幾秒再開始

比如我們這邊設置一個線程持續不斷的跑10s


嘗試用單機操作了一下,當內存不夠的時候會報錯。因爲單機的性能是很有限的,我們可以進行分佈式測試。比如一臺機器做jmeter控制端,再配置幾臺負載服務器。在發起幾萬個請求的時候,就可以均勻分佈在這幾臺機器上做併發,可以給服務器造成更大壓力

想要看下服務器有多大內存,我們可以去修改jmeter.sh的配置,這裏默認是512,我們可以把它修改爲4g然後保存


2,其他線程組
除了之前那個Thread Group線程組,jmeter還提供了另外2個線程組,分別是setUp和tearDown線程組

setUp線程組:
路徑:Test Plan-Add-Threads-setUp Thread Group
執行順序:在Thread Group線程組執行前執行
作用:比如某些接口需要帶上登錄獲取token才能請求成功,這個時候我們可以把登錄接口放在setUp線程組
tearDown線程組:
路徑:Test Plan-Add-Threads-tearDown Thread Group
執行順序:在Thread Group線程組執行後執行

這裏可以看到這兩個線程組分別在請求前後執行了
四、壓測結果分析
首先我們先來介紹導入功能:
如果我們在服務器上進行壓測時,想要查看壓測結果,可以把服務器生成的jtl文件導入這裏進行展示


然後我們再來介紹3種監聽器,分別是Listener View Result Tree,
AggreGate Report和Backend Listener

一、Listener View Result Tree
作用:把請求的返回結果在當前界面進行顯示
路徑:Thread Group-Add-Listener-View Results Tree
常用功能:

正則表達式測試:RegExp Tester
Css選擇器測試:
XPath測試:XPath Tester(Use Tidy)
Json Tester:
功能演示:

基於正則:

基於Json path:


二、AggreGate Report
作用:聚合報告,顯示請求的響應時間,tps,傳輸數據大小,百分比等
路徑:Thread Group-Add-Listener-AggreGate Report
參數:

平均值:平均響應時間,所有請求的平均響應時間(單位是毫秒)
中位數:50%的用戶響應時間不超過這個值
99% Line:99%的用戶響應時間不超過這個值
Error%:異常百分比(錯誤請求的數量/請求的總數)
Throughput:吞吐量/tps,默認情況下每秒完成的請求數(單位是秒),吞吐量=1000/平均值*線程數(jmeter顯示的吞吐量跟實際有差距的原因是因爲jmeter每30s去採樣一次)
Received KB/sec:每秒接收的數據
ps:個別極端結果可能會對實際性能數據造成干擾,%Line更能客觀反映實際性能情形

三、Backend Listener
作用:把想要顯示的內容寫入數據庫裏,通過圖形化展示工具從數據庫讀取進行圖形化展示,使之更爲美觀

使用命令行進行壓測
在實際測試過程中我們很少使用圖形化界面,還有查看結果樹之類的選項,因爲會佔用資源,影響測試結果。我們一般把它部署到服務器上。下面我們來介紹如何使用命令行進行壓測。

1、測試環境準備:確保服務器上已經安裝了jdk和jmeter

檢查linux系統上是否安裝JDK,輸入命令:java -version


上傳 apache-jmeter-5.2.1.tgz 至linux服務器(可以使用sftp工具)

使用命令 tar -zxvf apache-jmeter-5.2.1.tgz 解壓文件


將jmeter添加至配置文件中,使用命令 vim /etc/profile 打開配置文件,添加以下內容至配置文件中(環境變量不是必須配置的,如果不配置環境變量,運行腳本的時候要在bin目錄下運行)

#jmeter 環境變量
export JMETER_HOME=/usr/local/jmeter/apache-jmeter-5.3
export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$JMETER_HOME/lib/logkit-2.0.jar:$CLASSPATH
export PATH=$JMETER_HOME/bin:$PATH:$HOME/bin

按下esc,輸入:wq,回到控制檯,使用命令 source /etc/profile 使配置文件生效(這裏如果保存失敗,大概率是權限問題,記得sudo -i)
chmod +x jmeter 賦予權限
./jmeter -v 查看jmeter是否正確安裝,如果顯示下圖就表示安裝成功啦~

操作步驟:
在jmeter新建一個線程組,然後添加一個http請求,接着點擊左上角文件-保存測試計劃爲-xxx.jmx
使用xftp等工具把它傳到服務器上
進入jmeter裏的bin目錄,輸入/jmeter.sh -n -t test.jmx -l result.jtl
參數 含義
-n 使用命令行運行
-t 指定測試計劃
-l 指定結果的存放位置
測試計劃是一個xml格式的文件,我們可以打開看下,我們可以在上傳服務器後,我們也可以在這裏修改文件的配置

壓測界面:


五、Jmeter進行分佈式壓測
一,分佈式簡介:
爲什麼要使用分佈式?

單機性能瓶頸:CPU,內存,IO,網絡等,測試大型項目恐無法滿足需求
二,工作節點(slave)部署
負載機(slaves):端口 tcp 1099(有防火牆的話儘量要開啓該端口)

jmeter properties配置
關閉SSL:找到在jmeter/bin目錄找到jmeter.properties文件,然後編輯,設置server.rmi.ssl.disable=true
system properties配置
設置hostname:找到在jmeter/bin目錄找到system.properties文件,添加一行配置: java.rmi.server.hostname=192.168.31.61(ip地址修改爲自己本機的,如果是window系統,可以cmd然後輸入ipconfig進行查看,linux可以通過ifconfig查看)
運行jmeter-server
運行./jmeter-server

三、控制節點(master)部署
打開另一臺服務器,編輯控制端的jmeter

1、控制端(master):端口 udp 4445

jmeter properties配置:
找到在jmeter/bin目錄找到jmeter.properties文件,然後編輯如下2個字段
1.添加負載機ip:remote_hosts=192.168.31.61,192.168.31.63(支持多個,用逗號隔開)
2.關閉SSL:server.rmi.ssl.disable=true
運行jmeter-server
運行./jmeter-server,這個時候打開GUI,在運行這邊即可查看到控制機器,我們就可以使用這些進行分佈式壓測啦~

當然除了gui,我們也可以使用命令行進行分佈式壓測:/jmeter.sh -n -t test.jmx -l result.jtl -R 192.168.31.61,多個ip可以用逗號隔開
參數 含義
-n 使用命令行運行
-t 指定測試計劃
-l 指定結果的存放位置
-R 指定負載機ip


六、性能監控系統
一、簡介
jmeter運行的時候會產生很多數據,我們可以通過jmeter的組件backend listener,實時的把數據寫入InfluxDB,然後Grafana工具會從InfluxDB讀取數據,然後使用圖形界面進行展示,具體架構如下:

 

二、部署
1、部署InfluxDB
官網:https://github.com/influxdata/influxdb
InfluxDB是一個使用Go語言開發的開源分佈式時序數據庫,特別適合用於處理和分析資源監控數據,用於存儲壓測數據
這裏通過docker的方式進行部署(docker部署方式詳見docker從入門到放棄)
新建容器網絡:docker network create grafana(不同容器想要互相通信必須在一個網絡,所以需要新建容器網絡)
運行容器:docker run -d --name=influxdb --network grafana -p 8086:8086 -v ${PWD}/influxdb/:/var/lib/influxdb/ influxdb:1.7.10
語法 含義
-d 後臺運行
–name 相當於域名,我們可以通過名字找到容器實際的ip地址
–network 指定具體網絡
-p 指定端口號,jmeter通過這個端口寫入數據到influxdb
-v 把容器的數據庫文件掛載在當前目錄的influxdb目錄
創建數據庫
第一種方式: curl -i -XPOST http://localhost:8086/query --data-urlencode "q=CREATE DATABASE jmeter"
第二種方式:docker exec -it influxdb influx,執行語句 create dataase jmeter;
基本語法
show dataases;
use jmeter;
show measurements;
select * from jmeter limit 3;
exit
2、部署Grafana
Grafana是一個可視化面板(Dashboard工具),有非常漂亮的圖表展示功能,齊全的亮度儀表盤和圖形編輯器,可以支持不同種類的數據源,用於將存儲與influxdb中的數據以圖表形式展示出來
運行容器:docker run -d --name grafana --network grafana -p 3001:3000 grafana/grafana:8.8.3
訪問grafana:
啓動成功後,網頁輸入服務器ip地址+之前設置的端口號,即可實現訪問,默認賬號密碼:admin/admin
忘記密碼點這裏

功能簡介:
側邊欄第一個:主要使用的是dashboard,通過這個監控各種服務,進行數據的展示

瀏覽(目前暫時無數據)

告警信息(如果是監控主機,設置規則cpu使用率超過80%要告警,一旦超過了這邊會有告警提示,目前暫時用不到)


側邊欄的設置圖標:這裏可以用來配置數據源

側邊欄最後一個:系統管理(暫時用不到)

閒言少敘,我們進行操作

一、導入數據源配置

1、點擊倒數第二個圖標-Data Sources-Add data source-選擇influxDB

參數如下:

url:寫的容器名+端口號

ip:因爲之前創建容器的時候容器名我們指定是influxdb,所以這裏我們直接寫的influxdb,端口號就填寫之前我們映射的

當然這裏也可以使用ip地址+端口號:172.18.0.2:8086(比較麻煩,不推薦)


Auth:認證方面的因爲我們沒有設置,所以略過

database:這裏我們之前在influxdb創建了jmeter這個表,所以這裏填寫這個

 

Min time interval:提取/刷新時間,jmeter默認寫數據到influxdb是5s一次,grafana去讀取influxdb是10s一次,這裏存在誤差,想要精確讀取數據,我們這裏可以配置5s,這樣就不會出現偏差。寫完可以點擊底下的sava&test按鈕測試下

二、導入dashboard
dashboard支持自定義,但是比較麻煩,推薦使用別的開發者提供的jmeter的展示面板(https://grafana.com/grafana/dashboards/5496)
如果用不了可以看下版本是否符合要求


添加控制面板:進入dashboard-manage-import-輸入上面的網址-點擊load(第一次會提示失敗,等幾秒就好了)然後會進入下面的頁面

name:支持隨意更改
DB name:選擇剛剛配置的InfluxDB
Measurement name:數據庫裏的表,相當於mysql的table,支持自定義
Backend send interval:後端發送間隔

保存成功後,在列表頁點擊名稱可以進入詳情

三、執行jmeter腳本
現在我們去啓動一個jmeter,執行下再來看grafana。這裏注意,我們需要把influxdb和grafana都是要放到服務器裏面的,然後需要公網ip。如果沒有公網ip,可以放在同一個局域網,這樣jmeter才能訪問。
1、新建一個線程組-添加一個http請求-添加一個監聽器-後端監聽器實現選擇influxdb的,見截圖
這裏我們需要修改一些配置,其他就默認先不改了

influxdbUrl:http://10.218.221.24:8086/write?db=jmeter(這裏的ip和端口號要替換成服務器的ip地址和之前配置的influxdb的端口號)
application:這裏關係到grafana圖表裏面application的展示,建議改一下
measurement:和之前在grafana的dashboard裏面填的一致
summary only:錯誤是否dashboard的errors面板是否顯示詳細數據,默認爲true(不展示),我們設置爲false以後就會展示了

接着,我們點擊運行按鈕發起請求

這裏我們注意下右上角的選項,比如我們選擇last 5 mins,那5分鐘後,如果沒有新請求產生,這邊就會顯示空的數據

這邊可以指定刷新頻率,默認是關閉的,我們可以選擇刷新頻率


錯誤面板展示

添加事務面板
1,新建事務請求

2,查看dashboard裏事務面板的展示
在application裏面選擇剛剛新建的

這裏可以看到事務的展示

接着,我們來關注下influxdb


存儲具體的測試結果參數

七、性能監控體系實戰
本節介紹的是如何使用Prometheus監控被測服務器的相關性能指標

一、Prometheus簡介
Prometheus是一款開源的系統監控和警報工具,使用Go語言開發,有各種exporter用來收集服務器性能數據。
我們通過Prometheus來監控壓測時的服務器性能
二、部署Prometheus
編輯配置文件:
啓動前我們需要先去編輯Prometheus配置文件,因爲Prometheus要監控服務前,需要先知道服務器的ip地址,啓動的node exporter的端口。下面是Prometheus官方的一個配置文件範例:https://github.com/prometheus/prometheus/blob/master/documentation/examples/prometheus.yml
global:
scrape_interval: 15s # 抓取間隔
evaluation_interval: 15s # 收集時間間隔,配置報警時候這個值才起作用
# scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: 'prometheus'

# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
# 指定服務器的ip地址和端口號
static_configs:
- targets: ['localhost:9091']

我們先在服務器vim prometheus.yml,然後把它上面的腳本黏貼進去,保存

運行:docker run -d --name prometheus --network grafana -p 9091:9090 -v ${PWD}/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus:v2.16.0 --config.file=/etc/prometheus/prometheus.yml(-v xxx:把當前編輯的yml文件掛載到容器裏的/etc/prometheus/promethues.yml文件裏,後面再跟上Prometheus的鏡像版本,config.file=/etc/prometheus/prometheus.yml:Prometheus運行時去指定容器裏的配置文件)
成功後我們瀏覽器輸入服務器ip:9091端口號(我們自己配置成9091的)實現訪問

我們可以在這個路徑訪問我們剛剛的配置文件,瀏覽器輸入ip+端口號/metrics即可訪問數據。根據配置,Prometheus每隔15s就會來訪問這裏的配置文件,從數據庫讀取數據,最終顯示圖形化界面

三,被測機安裝node-exporter
Prometheus提供多種exporter來監控不同類型數據,比如jmx_exporter,snmp_exporter,mysqld_exporter…本次我們演示使用node exporter來監控主機的性能數據
下面我們進行安裝

下載安裝包:https://github.com/prometheus/node_exporter/releases 選擇對應版本進行下載
把文件傳到服務器,進行解壓縮
我們可以輸入 ./node_exporter --help查看幫助信息

修改默認的監聽端口:node_exporter默認是監聽9100端口的,如果這個端口已經被佔用,我們可以進行修改:./node_exporter --web.listen-address=":9102"。如果服務器下有多個ip,比如內網外網,只想在內網顯示出來,前面還可以加上ip地址./node_exporter --web.listen-address="192.234.2.2:9102",但是這樣就會一直在前臺運行,運行期間我們做不了其他操作,除非退出。我們可以加上nohub參數讓它在後臺運行:nohup ./node_exporter --web.listen-address=":9102" &
安裝成功以後我們可以輸入被測機ip+端口號進行訪問。
點進去時候顯示的內容和Prometheus裏顯示的是一樣的,都是一些性能參數,Prometheus會定期抓取,然後存入數據庫


四,在Prometheus裏添加exporter
編輯prometheus.yml配置文件,在末尾添加上剛剛的exporter:vim prometheus.yml ,保存

- job_name: 'exporter http://10.218.220.218:9100/'
static_configs:
- targets: ['10.218.220.218:9100']
1
2
3
job_name支持自定義,targets裏面填寫exporter那臺機器的ip和配置的端口號

重啓docker,使其生效:docker restart prometheus
我們回到頁面,可以看到此時多了1個我們剛剛配的

因爲這個界面不太好看,我們這邊用grafana進行展示。

進入grafana,在數據源那邊選擇prometheus,其他配置見下圖,點擊保存

然後我們點擊save&test按鈕進行保存。
保存成功後,我們去新增node_exporter的dashboard面板,我們這邊用的還是別人做好的
我們進入grafana的面板這邊,點擊import,然後輸入https://grafana.com/grafana/dashboards/8919,點擊load
(ps:8+的grafana纔可以直接用網址形式導入,6+的grafana是不支持直接用網址導入的,因爲這個的版本太新了,不支持6+的,要用舊版,我們這邊用upload .json file,下載地址:https://grafana.com/grafana/dashboards/8919/revisions,選擇24的那個)

這邊就會有具體內容,我們這邊需要選擇裏面的數據源,然後點擊import

就可以看到這個界面,這樣我們就可以對被測服務器進行監控啦~

————————————————
版權聲明:本文爲CSDN博主「好多可樂」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_36792120/article/details/125265765

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章