1. 程式人生 > >Java效能測試從入門到放棄-詳解篇

Java效能測試從入門到放棄-詳解篇

Jmeter元件分類說明

  • Jmeter的元件可以放在任意位置

  • 執行緒池:用於建立執行緒。每個執行緒會"批次順序"執行任務,因此後面的任務可根據前面的任務決定具體的操作。

          1. 普通執行緒組(主執行緒組):用於建立主要的執行緒任務

          2. setUp執行緒組: 在普通執行緒組之前觸發,用於做測試的前置操作,例如建立測試賬戶

          3. tearDown執行緒組: 在普通執行緒組之後觸發,用於做測試的後置操作,例如清理工作。

  • 取樣器:用來模擬http,tcp請求。取樣器父節點需要包含執行緒組,否則不會執行

  • 前置處理器: 用於定義取樣器前置操作,例如定義使用者生成,JDBC操作。

  • 後置處理器:用於解析取樣器結果,父節點需包含取樣器。

  • 斷言:用來判斷取樣器結果,父節點需包含取樣器。

  • 定時器:用於控制併發請求的頻率。當父節點為取樣器,只對父節點生效。當父節點為執行緒組,對整個執行緒組生效。

  • 配置元件:用於配置公共資料,可被同級節點或同級節點的子節點引用

  • 監聽器:用於統計測試結果,形成圖表。常用的有察看結果樹,彙總報告,聚合報告。可通過安裝Plugins Manager來豐富監聽器的型別。

  • 假如想檢視每個分類的詳細說明,可以檢視:倔強的瀟灑小姐

火焰圖

  • 火焰圖不建議直接在google搜尋,雖然可以得到很多結果,但是年份都在2017以前。但是不知為何都不能使用。Intellj Idea在2018.3之後推出了火焰圖,但是最終我也沒法解決這個問題。所以建議在github搜尋flame graph

  • 假如你是Linux使用者,使用https://github.com/brendangregg/FlameGraph

  • 假如你是Mac使用者,使用https://github.com/kjeremi/java-flame-graph-osx

Java+Jmeter+火焰圖+Macos 舉慄

操作流程

  • 啟動Java後臺專案, 9999埠,api為http://localhost:9999/v1/searchsrv/all/activities?value=1。請使用控制檯啟動。例如
# 記住包名
java -jar mockserver.jar
# api 返回值結構為
#{
#    "error": null,
#    "result": {},
#    "success": true
#}
#在macos上,啟動火焰圖,並追蹤到mockserver
#需要下載上面那個火焰圖工具
./createFlameGraph.sh mockserver
  • 啟動Jmeter,新增執行緒組
  • 執行緒組右鍵->配置原件->http請求預設值,協議http,服務名稱localhost,埠號9999

  • 執行緒組右鍵->配置原件->使用者自定義的變數

  • 執行緒組右鍵->取樣器->http請求。
    • 協議,伺服器名稱,埠號都置空,會自動獲取http請求預設值
    • 引數取了使用者自定義的變數
  • http請求右鍵新增->斷言->json斷言->用於判斷api返回是否正確。不新增預設只有http code 200認為是正確的
  • 執行緒組右鍵新增->監聽器->察看結果樹->用於檢視各個api的詳細執行結果.也可以新增在http取樣器下面,單獨監聽。

  • 執行緒組右鍵新增->監聽器->彙總報告->用於檢視各個api彙總的結果,也可新增在http取樣器下面,單獨監聽。

Jmeter檢視檢視結果

  • 通過察看結果樹檢視請求是否成功,自定義變數是否生效,JSON斷言是否生效
  • 通過彙總報告檢視請求彙總情況

火焰圖檢視呼叫堆疊

  • Jmeter介面迴圈多跑幾次
  • 停止Java專案
  • 在火焰圖工具目錄下找到最新的svg檔案,使用瀏覽器開啟

更豐富多彩的圖形展示

jmeter雖然在視覺化介面執行時能有很多圖形介面,但是開啟了會影響效能。所以建議使用命令列跑,然後生成一個html的頁面

下面提供一個指令碼,每次執行會根據時間生成一個目錄,並將視覺化介面生成到目錄下。使用的時候需要修改resultPath(結果路徑),sciptFile(指令碼路徑)

  • 視覺化 CLI 模式
#設定結果集記錄
time_now=`date "+%Y-%m-%d_%H_%M_%S"`
resultPath=/Users/hehe/performanceTest/localRun/result/${time_now}

logPath=${resultPath}/log
samplePath=${resultPath}/sample
reportPath=${resultPath}/report
mkdir ${resultPath}
mkdir ${logPath}
mkdir ${samplePath}
mkdir ${reportPath}

#設定指令碼路徑
scriptFile=/Users/hehe/performanceTest/localRun/script.jmx
#設定jmeter路徑
jmeterPath=/Users/klook/SoftwareInit/apache-jmeter-5.1.1/bin/jmeter
sh ${jmeterPath} -n -t ${scriptFile} -l ${samplePath}/result.jtl -j ${logPath}/result.log -e -o ${reportPath}
  • 引數說明
-n: 指定 Jmeter 使用 CLI 模式執行
-t: 指定編寫完成的測試計劃指令碼( jmx 檔案)
-l: 指定記錄樣本結果的 JTL 檔案的名稱
-j: 指定 Jmeter 執行日誌輸出檔案
-r: 在指定的伺服器(JMeter property "remote_hosts")上執行測試計劃
-R: 在指定的多個遠端伺服器上執行測試計劃
-g: 僅生成報告儀表盤
-e: 測試完成後生成報告儀表板
-o: 指定測試報告輸出的位置,資料夾不得存在或為空
-H: 指定代理伺服器主機名或IP地址
-P: 指定代理伺服器埠

易踩坑

因為同一個執行緒組的任務是順序執行的,所以同一個執行緒組中,頻率最低的任務是所有任務的瓶頸。例如A->B,A每分鐘60次,B每分鐘120次,實際B為每分鐘60