了解 JMeter 中的 Ramp-up
1. 概述
JMeter 是一種非常受歡迎的測試 JVM 應用程式效能的解決方案。我們在 JMeter 中經常遇到的一個問題是如何控制在給定時間內發出的請求數量。這在應用程式剛剛啟動並啟動線程的預熱階段尤其重要。
JMeter 測試計劃有一個稱為啟動週期的屬性,它提供了一種配置使用者向被測系統發出請求的頻率的方法。此外,我們可以使用此屬性來調整每秒的請求數。
在本教程中,我們將簡要介紹 JMeter 的一些主要概念,並重點了解 JMeter 中 Ramp-up 的使用。然後,我們將嘗試清楚地了解它並學習如何正確計算/配置它。
2.JMeter的概念
JMeter是一個開源軟體,用Java編寫,用於效能測試JVM應用程式。最初,它是為了測試 Web 應用程式的效能而創建的,但現在它支援其他類型,例如 FTP、JDBC、Java 物件等。
JMeter 的一些主要功能包括:
- 命令列模式,建議使用該模式以獲得更準確的負載測試
- 支援分散式效能測試
- 豐富的報告,包括儀表板報告
- 使用線程組同時多線程採樣
使用 JMeter 運行負載測試涉及三個主要階段。首先,我們需要建立一個測試計劃,其中包含我們要模擬的場景的配置。例如,測試執行週期、每秒操作數、並發操作數等。
2.1.測試計劃的線程組
為了理解 JMeter 中的 Ramp-up,我們需要先了解測試計劃的執行緒組。線程組控制測試計劃的線程數量,其主要元素是:
- 線程數,這是我們要執行當前測試計劃的不同用戶的數量
- 啟動週期(以秒為單位)是 JMeter 讓所有使用者啟動並運行所需的時間
- 循環計數是重複的次數。換句話說,它會設定使用者(執行緒)執行目前測試計劃的次數
3. JMeter 的提升
如前所述, JMeter 中的 Ramp-Up 屬性用於配置 JMeter 啟動所有執行緒所需的時間段。這也意味著啟動每個執行緒之間的延遲是多少。例如,如果我們有兩個線程,並且啟動週期為一秒,那麼 JMeter 需要一秒來啟動所有用戶,並且每個用戶啟動大約延遲半秒(1 秒 / 2 個線程 = 0.5 秒) 。
如果我們將該值設為零秒,那麼 JMeter 會立即一起啟動所有使用者。
需要注意的一件事是,線程數指的是使用者。因此,我們使用 JMeter 中的 Ramp-up 來調整每秒的使用者數,這與每秒的操作數不同。後者是效能測試中的關鍵概念,也是我們在設定效能測試場景時的目標。斜坡上升週期與其他一些屬性結合,還可以幫助我們設定每秒操作數值。
3.1.在 JMeter 中使用 Ramp-up 來配置每秒使用者數
在以下範例中,我們將針對 Spring Boot 應用程式執行測試。我們正在測試的端點是 UUID 產生器。它只是創建一個 UUID 並回傳回應:
@RestController
public class RetrieveUuidController {
@GetMapping("/api/uuid")
public Response uuid() {
return new Response(format("Test message... %s.", UUID.randomUUID()));
}
}
現在,假設我們想要以每秒 30 個使用者的速度測試我們的服務。透過將執行緒數設為 30 並將啟動週期設為1
,我們可以輕鬆實現這一點。但這對於效能測試來說並沒有多大價值,所以假設我們需要每秒 30 個用戶,持續一分鐘:
我們將線程總數設為1800
,這意味著一分鐘內每秒有30
用戶(每秒30
用戶 * 60
秒 = 1800
個用戶) 。由於每位使用者執行一次測試計劃(循環計數設定為1
),因此吞吐量或每秒操作數也是每秒 30 次操作,如摘要報告中所示:
此外,我們從 JMeter 圖表中可以看到,測試確實執行了 1 分鐘(~ 21:58:42
到21:59:42
):
3.2.在 JMeter 中使用 Ramp-up 設定每秒請求數
在以下範例中,我們將使用上一段中介紹的 Spring Boot 應用程式的相同端點。
在效能測試中,我們更關心系統的吞吐量,而不是一段時間內的使用者數量。這是因為同一用戶可以在給定時間內發出多個請求,例如在購物時多次點擊「加入購物車」按鈕。 JMeter 中的 Ramp-up 可以與循環計數結合使用,來配置我們想要實現的吞吐量,而與使用者數量無關。
讓我們考慮一個場景,我們想要以每秒 60 次操作、持續一分鐘的速度來測試我們的服務。我們可以透過兩種方式實現這一目標:
- 我們可以將總線程數設定為目標操作 * 執行總秒數,並將循環計數設為
1
。這與之前的方法相同,這樣我們的每個操作都有不同的使用者。 - 我們將執行緒總數設定為目標操作 * 執行總秒數 / 循環計數,並設定一些循環計數,以便每個使用者執行多個操作。
讓我們輸入一些數字。在第一種情況下,與前面的範例類似,我們將總線程數設定為3600
,這使得我們在一分鐘內每秒有60
用戶(每秒60
操作 * 60
秒 = 3600
個用戶):
這為我們提供了每秒約60
操作的吞吐量,如摘要報告所示:
從該圖中,我們還可以看到樣本總數(對端點的請求),這是我們預期的數字3600
。總執行時間(~ 21:58:42
到21:59:42
)和回應延遲可以在回應時間圖中看到:
在第二種情況下,我們的目標是一分鐘每秒60
操作,但我們希望每個使用者在系統上執行兩次操作。因此,我們將總線程數設定為1800
,加速時間設定為60
秒,循環計數設定為2
,(每秒60
操作 * 60
秒 / 2
循環計數 = 1800
使用者) :
從總結結果我們可以看到,樣本總數再次達到了3600
,符合預期。吞吐量也是預期的每秒60
左右:
最後,我們在回應時間圖中驗證執行時間為一分鐘(~ 21:58:45
到21:59:45
):
4. 結論
在本文中,我們研究了 JMeter 中的 Ramp-up 屬性。我們了解了啟動週期的作用以及如何使用它來調整效能測試的兩個主要方面:每秒使用者數和每秒請求數。最後,我們使用 REST 服務來示範如何在 JMeter 中使用 Ramp-up 並展示了一些測試執行的結果。
與往常一樣,所有原始程式碼都可以在 GitHub 上取得。