jmeter 自帶的線程組控件(Thread Group)中有三個重要的屬性,分別是 Number of Threads, Ramp-Up Period, 和 Loop Count,用於控制線程組的行為。
這三個屬性的重要性與其文檔的豐富程度嚴重不符。不僅變量名簡略抽象,而且官方文檔也含糊不清。
本文嘗試在實驗驗證的基礎上,把這三個變量的含義解釋清楚。
目錄
- 用戶請求模型
- 驗證方法
- 單個用戶的 Loop Count
- Ramp-Up Period
- 用戶數 Number of Threads(users)
- 案例1
- 案例2
- 案例3
- 案例4
- 案例5
- 案例6
- 案例7
- 案例8
- 案例9
- 案例10
- 結論
TL;DR
太長不看版:
Jmeter 將在 Ramp-Up Period 時間范圍內,啟動 Number of Threads 個用戶(線程),並且使每個用戶(線程)重復發出 Loop Count 次請求(采樣)。
用戶請求模型
我們先來看簡單的用戶請求的模型。Jmeter 的每一個模擬用戶,發起的時機和觸發條件由 Jmeter 自己的調度策略指定。Thread Group 三個屬性 No. of Threads, Ramp-Up Period, 和 Loop Count 默認都為1 。
三個 1 表示僅有一個用戶,在整個測試過程中僅發起一次請求,且請求會在1秒鍾內發出。如果把請求在時間軸上展開,將是像下圖一樣。
圖中的藍色方框表示測試腳本執行時間,Jmeter保證了請求在規定時間內發起。
在開始解釋線程組屬性之前,我們先看看如何驗證對概念的理解是否正確。
驗證方法
我們在 Jmeter 里用如下簡單的測試方案能觀察並且驗證我們對概念的理解是否正確。
Test Plan
└─Thread Group
├─ jp@gc - Dummy Sampler
└─ jp@gc - Active Threads Over Time
將 Dummy Sampler 的響應時間默認值改為下圖:
這樣我們就能通過 Active Threads Over Time 插件觀察 Jmeter 發起用戶請求的調度邏輯。
比如上面的三個屬性值都為1的情況,得到的記錄是這樣的:
圖上右下角的紅點的時間坐標是1秒,縱坐標是1,在整幅圖里只出現了1次。這就是體現了三個屬性值都為1的情況。
單個用戶的 Loop Count
在分別講解三個屬性之前,希望您能忘掉先前對這三個屬性的理解,因為錯誤的理解會妨礙您接收新的、正確的概念。
Loop Count 這個屬性名稱過於簡略,無法直觀的理解,容易引起誤會。Loop Count 真正屬性的含義是:
同一個用戶,請求的重復次數
當取 Loop Count = 5
時,屬性值列表如下:
Jmeter 發起請求的過程在時間軸上延伸是下圖的樣子:
通過上述的 驗證方法 ,可以觀察得到
再次發起請求的時機,大概是一次完整的請求結束后。即,響應結束后,發起下一次請求。
Ramp-Up Period
Ramp-Up Period,我認為這個名稱可以翻譯為“建立時間”。Ramp Up 的含義是指“從無到有”的時間,好比飛機從起飛到平飛的的過程。這里的含義指:
確保在此時間內,建立起全部線程
回頭看上面 單個用戶的 Loop Count 一節中,由於整個測試中只有一個線程,所以 Ramp-Up Period 這個屬性其實是沒有發揮作用的,因為任何測試初期至少要建立一個線程。只要建立了一個線程,Ramp-Up Period 就完成任務了。
所以,對於單用戶的情況,無論 Ramp-Up Period 設置或長或短,都不會在 Active Threads Over Time 的圖中體現出來。
比如,當單用戶的 Loop Count = 10
時,屬性列表如下時:
得到的 Active Threads Over Time 圖形如下:
上圖中,盡管 Ramp-Up Period 設置為1秒,但是由於在測試一開始就建立了全部的 1個線程,所以這個線程是可以持續工作到10秒鍾的。和 Ramp-Up Period 設置為1秒沒有關聯。
但是,當多用戶並存時,Ramp-Up Period 和 Loop Count 配合在一起,就能得到不同的線程調度結果,參見后面的 案例 。
用戶數 Number of Threads(users)
Jmeter 使用線程模擬用戶,增加一個線程就是多一個模擬用戶。Number of Threads 表示模擬的並發用戶數。
當取 Number of Threads = 5
時,由於上面 驗證方法 一節中,Dummy Sampler 模擬的響應時間是 500ms
。為了便於觀察結果,我們將 Ramp-Up Period 設置為 5秒
,這樣能將5個線程發起請求的時間在時間軸上完全分開而不重疊。屬性列表如下:
通過上述的 驗證方法 ,可以觀察得到
上圖可以看出,Jmeter 在5秒鍾內發起了5個線程,每個線程各發出1個請求。在時間軸上延伸是下圖的樣子,一條線表示一個用戶:
下面我們嘗試從幾個案例來觀察 Jmeter 在上述三個參數的不同組合下,如何發起請求。
案例1
屬性值列表如下圖:
上面講過 ,單個用戶時,Ramp-Up Period 不起作用。每個重復的請求將於前次請求結束后發起。因為每次響應時間是500ms,所以,上面屬性組合的 Loop 將於30秒結束。得到的圖是這樣:
案例2
屬性值列表如下圖:
按上面講的 ,Jmeter 將在60秒內啟動60個線程,所以,Jmeter 的調度方法將是:
每一秒鍾啟動一個線程,並且在每個線程內發起一個請求。
整個過程將持續60秒,當每一個新的線程發起時,前次線程的響應已經結束,線程被銷毀,所以每時每刻都只有一個線程存在。得到的圖是這樣:
案例3
屬性值列表和 案例2 相同,改變的是 Dummy Sampler 的請求的響應時間,從 500ms
改為 1500ms
和 案例2 相同, Jmeter 的調度方法仍然是:
每一秒鍾啟動一個線程,並且在每個線程內發起一個請求。
但是,當每一個新的線程發起時,前次線程的響應尚未結束,所以每次觀測時,總有兩個線程同時存在,得到的圖是這樣:
(注意上圖中的縱軸,幾乎所有點都在 2 的位置)
案例4
先將 Dummy Sampler 的請求的響應時間,從 1500ms
改回 500ms
,再看線程組的屬性值列表如下圖:
按上面講的 ,Jmeter 將在10秒內啟動60個線程,所以,Jmeter 的調度方法將是:
每一秒鍾內啟動6個線程,並且在每個線程內發起一個請求。
由於每個請求的響應時間設置為 500ms,每一秒內啟動的6個線程將有一半完成后被銷毀,同時,整個過程將持續10秒,得到的圖是這樣:
案例5
線程組屬性值列表如下圖:
按上面講的 ,Jmeter 將在60秒內啟動10個線程,同時每個線程內重復6次請求,所以,Jmeter 的調度方法將是:
每6秒鍾內啟動1個線程,並且在每個線程內重復發起6次請求。
由於每個請求的響應時間設置為 500ms,所以每個線程內重復的6次請求將於3秒鍾完成,每10秒鍾之內,前3秒鍾的觀測結果,都有1個線程存活。得到的圖是這樣:
案例6
屬性值列表和 案例5 相同,改變的是 Dummy Sampler 的請求的響應時間,從 500ms
改為 1500ms
Jmeter 的調度方法仍然是:
每6秒鍾內啟動1個線程,並且在每個線程內重復發起6次請求。
由於每個請求的響應時間設置為 1500ms,所以每個線程內重復的6次請求將於9秒鍾完成,所以當 Jmeter 啟動下一個線程時,仍然有前面線程中的最后2次請求沒有收到響應,觀測結果是這樣:
案例7
屬性值列表和 案例5 相同,改變的是 Dummy Sampler 的請求的響應時間,從 500ms
改為 1500ms
,線程組屬性值列表如下圖:
Jmeter 的調度方法改為:
每6秒鍾內啟動1個線程,並且在每個線程內重復發起60次請求。
由於每個請求的響應時間設置為 1500ms,所以每個線程內重復的60次請求將於90秒鍾完成,所有未完成的線程將累積在一起。從第54秒鍾最后一個線程建立起,到90秒的請求結束,整個過程應該是144秒,即2分24秒。觀測結果證明了這一點:
案例8
Dummy Sampler 的請求的響應時間 500ms
,線程組屬性值列表如下圖:
Jmeter 的調度方法改為:
- 每1秒鍾內啟動6個線程,並且在每個線程內重復發起6次請求。*
每次啟動的線程將和之前的線程疊加,觀測結果證明了這一點:
案例9
Dummy Sampler 的請求的響應時間 500ms
,線程組屬性值列表如下圖:
Jmeter 的調度方法改為:
- 每6秒鍾內啟動1個線程,並且在每個線程內無休止的發起請求。*
因為請求永不結束,所以線程永不銷毀,每次啟動的線程將和之前的線程疊加,觀測結果證明了這一點:
案例10
Dummy Sampler 的請求的響應時間改為 1500ms
,線程組屬性值列表如下圖:
和 案例9 相比,在更短時間內,創建更多的線程,線程的疊加更為明顯,而且斜率增大。
Jmeter 的調度方法改為:
每1秒鍾內啟動6個線程,並且在每個線程內無休止的發起請求。
觀測結果證明了這一點:
上圖中,從第10秒鍾開始,即保持 60 個線程不變。
結論
Jmeter 將在 Ramp-Up Period 時間內,啟動 Number of Threads 個線程
並且利用每個線程重復發出 Loop Count 次請求(或者說,Loop Count 次采樣)
線程收到響應后,即發出 Loop 內的下一次請求
線程的請求 Loop 次數達到后,線程即銷毀。
轉載:https://www.lfhacks.com/tech/jmeter-thread-properties#case1