如何閱讀與分析 JMeter 測試報表
本篇將介紹如何有效閱讀與分析 Apache JMeter 所產生的測試報表,協助你判斷系統效能瓶頸、穩定性問題與使用者體驗指標。
產出 Jmeter 報表的指令
- 我已經先使用 Jmeter 的 GUI 把測試腳本設定好了
- 在正式進行測試時,不要使用 GUI 來進行測試,因為使用 GUI 會消耗太多其他不必要的資源,進而影響測試結果
- 我編寫了以下的 bat 腳本來執行測試並產出報表
@echo off chcp 65001 > nul REM 設定環境變數 set JMETER_BIN=<path/to/jmeter/bin> set SCRIPT_DIR=<path/to/your/script/directory> set TEST_PLAN=%SCRIPT_DIR%\<your_test_plan>.jmx set RESULT_FILE=%SCRIPT_DIR%\<your_result_file>.jtl set REPORT_DIR=%SCRIPT_DIR%\<your_report_directory> echo 執行 JMeter 測試: %TEST_PLAN% REM 清理舊檔案 if exist "%RESULT_FILE%" ( echo 刪除舊的 JTL 檔案... del "%RESULT_FILE%" ) if exist "%REPORT_DIR%" ( echo 刪除舊的報表資料夾... rmdir /s /q "%REPORT_DIR%" 2>nul ) REM 執行測試 call "%JMETER_BIN%\jmeter.bat" -n -t "%TEST_PLAN%" -l "%RESULT_FILE%" if %ERRORLEVEL% neq 0 ( echo ❌ 測試執行失敗 pause exit /b ) REM 檢查結果檔案 if not exist "%RESULT_FILE%" ( echo ❌ JTL 檔案未產生 pause exit /b ) REM 產生報表 mkdir "%REPORT_DIR%" 2>nul call "%JMETER_BIN%\jmeter.bat" -g "%RESULT_FILE%" -o "%REPORT_DIR%" if %ERRORLEVEL% neq 0 ( echo ❌ 報表產生失敗 pause exit /b ) REM 開啟報表 if exist "%REPORT_DIR%\index.html" ( echo ✅ 完成!開啟報表... start "" "%REPORT_DIR%\index.html" ) else ( echo ❌ 報表檔案未找到 ) pause
報表範例
我用 Java 先寫了一個測試專案,
並用 Jmeter 產出了報表。
我們先來看一下 JMeter 測試報表的範例。
我們希先來看一下 JMeter 測試報表的範例。
其實產出的報表有很多詳細內容可以看,但主要會先閱讀這兩個部分
APDEX 指標:評估使用者對 API 回應時間的滿意度。
Statistics(統計數據):提供每個測試項目的整體效能指標。
一、APDEX 指標(使用者體感)
APDEX (Application Performance Index) 是一個介於 0~1 的數值,代表使用者對 API 回應時間的滿意度。
判讀依據:
- APDEX 值:
- 計算公式:
Apdex = (滿意次數 + 可忍受次數 ÷ 2) / 總請求次數 - 1.000:完美體驗,皆在滿意時間內完成
- 0.8 ~ 0.9:大部分可接受,少部分延遲
- < 0.7:使用者體驗差,應優化
- 當然以上的數值區間界定,可以依照專案類型,自行調整。
- 計算公式:
Apdex 深入解析與設定方式
Apdex 指標的核心是兩個時間閾值:T 與 F
| 名稱 | 全名 | 意思 | 預設值 |
|---|---|---|---|
| T | Toleration Threshold | 使用者「滿意」的最大回應時間 | 500ms |
| F | Frustration Threshold | 超過此值即視為「失望」 | 1500ms |
- Toleration Threshold(T):
- 使用者對回應時間的滿意上限。
- 若沒有特別設定,預設此值為 500ms,但我們可以依據專案性質,自行調整。
- 若專案是一個社群網站,則 T 或許可以設定為 800ms。
- 若專愛是一個金融交易系統,則 T 可能需要設定為 200ms。
- 以上是比較假設的設定,我個人是還沒有該如何設定會更符合需舊的體感啦....
- Frustration Threshold (F):
- 超過此值即視為「失望」
- 若沒有設別這定,預設此值為 1500ms
- 通常設定為 T 的 2~4 倍,預設為 1500ms。
- T 值與 F 值得設定
- 在啟動 JMeter 時,可以透過
jmeter.properties檔案來設定 T 與 F 的值。 - 在 JMeter 的安裝目錄下,通常在
bin資料夾中,可以找到jmeter.properties檔案。其中包含以下片段,你可以自行修改,再重新測試後,就會看到你修改的數字成現在報表中
# Change this parameter if you want to override the APDEX satisfaction threshold. jmeter.reportgenerator.apdex_satisfied_threshold=600 # Change this parameter if you want to override the APDEX tolerance threshold. jmeter.reportgenerator.apdex_tolerated_threshold=1500 - 在啟動 JMeter 時,可以透過
Apdex 計算公式
Apdex = (滿意次數 + 可忍受次數 ÷ 2) / 總請求次數| 狀態 | 判斷依據 |
|---|---|
| 滿意 | 回應時間 ≤ T |
| 可忍受 | T < 回應時間 ≤ F |
| 失望 | 回應時間 > F |
範例計算
以 T = 500ms 為例,假設有 100 次請求:
| 狀態 | 次數 |
|---|---|
| 滿意 | 60 |
| 可忍受 | 30 |
| 失望 | 10 |
計算:
Apdex = (60 + 30/2) / 100 = 0.75網路上看到的建議值參考(依不同 API 性質 > 僅供參考,我也沒啥概念~)
| 類型 | T 值(滿意) | F 值(可忍受) |
|---|---|---|
| 快速查詢 API | 300~500ms | 1200~2000ms |
| 表單送出 / 一般互動 | 800~1000ms | 3000~4000ms |
| 報表下載 / 大量查詢 | 2000~3000ms | 6000~8000ms |
二、Statistics(統計數據)區塊說明
JMeter 報表中的 Statistics 表格呈現每個測試項目的整體效能指標。
| 欄位名稱 | 說明 | 判讀建議 |
|---|---|---|
| Label | 測試項目名稱 | 與測試腳本中的 HTTP Sampler 名稱一致 |
| # Samples | 請求次數 | 次數越多,統計越具參考性 |
| # Errors / Error % | 錯誤數量與比率 | 任何 >0 都應進一步追查 log |
| Average | 平均回應時間(ms) | >800ms 建議關注,>2000ms 表現不佳 |
| Min / Max | 最小 / 最大回應時間 | Max 過高可能是尖峰、GC 或 DB 問題 |
| 90% / 95% / 99% Line | 百分位回應時間 | 大於 1s 表示有顯著延遲,應進一步分析 |
| Throughput | 每秒完成請求數 | 越高表示效能越好,可用來評估容量 |
| Received / Sent KB/sec | 網路頻寬(接收 / 傳送) | 可反映 API 輸出入資料大小與 I/O 壓力 |
- Samples
- 要測多少次才有參考價值呢?要看我們想要測試的 API 性質
- 快速 API 測試:500 ~ 1000 次,足以砍出平均與百分為趨勢
- 中等複雜度任務:2000 ~ 5000 次。降低偶發尖峰影響
- 重要核心流程 / SLA驗收:10000 次以上。減少極端值誤差,分佈穩定,結果比較可靠
- 要有足夠多的 Samples,才能讓百分位的數值有足夠的可靠性,也才能測出是否有某些區塊反應變慢、可能有種資料可能會有影響、或是在持續工作的狀況下,會不會有記憶體洩漏、資源耗盡的情形。
- 要測多少次才有參考價值呢?要看我們想要測試的 API 性質
- Min / Max
- Min:
- 最小回應時間
- 若與 Average 差異不大,表示系統穩定。
- 若與 Average 差異過大,可能有偶發尖峰、回應不穩定。也可能是 Samples 數量不足,導致統計不準確。
- Max:
- 最大回應時間
- 若 Max 遠高於 Average,表示有極端延遲事件。
- 可能原因:GC、DB 查詢慢、網路問題等。
- 應進一步分析 log 與系統資源使用情況。
- 若是 Max 明顯大於 95% Line -> 可能是極少數請求出現異常,應排查。
- 若是 Max 與 95% Line 都很大 -> 可能是系統整體效能瓶頸,應優化。
- Min:
- Average
- 平均回應時間
- 反映整體效能,若大於 800ms 建議關注。
- 若大於 2000ms,表示系統效能不佳,應優化。
- 注意:平均值可能受極端值影響,需結合 Min/Max 與百分位數分析。
- Error %
- 錯誤數量與比率
- 這沒什麼好多的,有錯誤就是最嚴重的問題,應該安排於第一個優先處理。
- 90% / 95% / 99% Line
- 百分位回應時間
- 90% Line:90% 請求在此時間內完成,通常應小於 800ms(看 API 性質)。
- 95% Line:95% 請求在此時間內完成,通常應小於 1000ms(看 API 性質)。
- 99% Line:99% 請求在此時間內完成,通常應小於 1500ms(看 API 性質)。
- 若任何百分位數大於 1 秒,表示有顯著延遲,應進一步分析。
- 可以將 min 與 max 的值與百分位數做比較
- 若 min 與 90% Line 差異不大,表示系統穩定。
- 若 min 與 90% Line 差異過大,可能有偶發尖峰或回應不穩定。
- 若 max 與 99% Line 差不多,表示系統整體效能瓶頸。
- 若 max 遠高於 99% Line,表示有極端延遲事件。
- Throughput
- 每秒完成請求數(requests/second)
- 反映系統併發能力,越高表示效能越好。
- 可用來評估系統容量極限。
- 若是光看數值沒辦法進一步分析,可以使用報告中的其他圖形來看看出什麼問題
- Throughput Over Time -> 是否穩定持平,是否出現吞吐驟降
- Active Threads -> 系統是否能有效支撐更多併發
- Response Time vs Threads -> 測試系統在不同併發數下的 Throughput 與延遲變化曲線
- 若 Throughput 過低,
- 有可能是腳本設計不良,Thread 產稱的速路太低、Ramp-up 太低。
- 後端硬體資源可能不足。
- 服務效能可能有瓶頸。
- DB 或 其他依賴服務可能成為瓶頸。
- 同步處理太多,如 鎖、同步 I/O 等。
- 網路品質不佳或限流導致。
- 舉幾個範例
- Throughput 低 + Avg 高 + 無 Error
- 系統忙不過來,但沒有錯誤。可能是 DB 查詢慢、同步邏輯造成處理速度慢
- Throughput 高 + Error Rate 高
- 系統表面處理很多請求,但其中大量回錯,常見於超過最大連線數、隊列滿等情況(可配合 Active Threads Over Time 分析)
- 併發數提升,但 Throughput 不變
- 系統已經達到極限,增加 Thread 數無法再提升處理速率,需進行瓶頸分析(如 thread dump、DB profiling)
- Throughput 低 + Avg 高 + 無 Error
分析建議流程
- 先看 Error % 是否 > 0 → 確認系統穩定性
- 檢查 Average / Max / 99% 回應時間 → 找出潛在瓶頸
- 查看 APDEX 分數 → 評估使用者實際體感
- 分析 Throughput → 評估系統併發能力與容量極限
- 針對異常項目比對 JMeter 測試場景與 log 訊息
通常一個實際的專案,在規劃前期產出的 SOW(Statement of work) 工作說明書中,就會對一些數值訂好驗收標準,最常見的包撼
- 響應時間指標 (Response Time)
- 吞吐量指標 (Throughput)
- 容量規劃指標
- 可用性指標 (Availability)
- 錯誤率指標 (Error Rate)
常見問題與可能原因
| 現象 | 可能原因 | 解法建議 |
|---|---|---|
| Error 500 / 404 | 系統錯誤或路徑錯誤 | 檢查 API、參數與驗證邏輯 |
| 回應時間高 / 波動大 | DB 查詢慢、GC、鎖、轉換慢 | Profiling + DB trace + async 設計 |
| Max 時間遠高於 Avg | 偶發尖峰、記憶體不足 | 排程分流、排除 GC、調整 JVM 設定 |
| Throughput 偏低 | 單線程效能低或限流 | 增加 worker / 多執行緒 / 承載優化 |
| APDEX < 0.7 | 體感延遲過高 | 優化關鍵路徑、資料快取、改背景處理 |
掌握以上欄位意義與分析流程,或許我們就可以從 JMeter 報表中找出效能瓶頸、驗證優化成效,提升系統可用性與使用者體驗。
老實說這個分析好像很多體感跟通靈的成分。
總歸的來需,還是需要大量的累積經驗才有辦法在不同需求的狀況下,好好閱讀這張報表,並得出合宜的判斷。