JMeter、Locust 和 Gatling 的併發模型對比

現在常見的併發模型有多線程模型,事件循環模型,Actor 模型和 CSP 模型。爲了能測試服務器系統的併發能力,性能測試工具也需要支持與之相應的併發發包能力。充分了解性能測試工具的併發模型,可以更好地幫助你選擇適合自己的性能測試工具。

起因

最近不少公衆號和在線課程都在討論性能測試和性能工程,但是鮮有涉及開源性能測試工具的比較與選擇。幾年前我就寫過一篇介紹 Gatling 的文章《性能測試之新一代服務器性能測試工具 Gatling》,裏面簡單的比較了 JMeter 和 Gatling 自身性能和開發形式。現在最爲常用的三款開源免費性能測試工具 / 框架就是 JMeter,Locust 和 Gatling。

爲了幫助大家更好地理解和選擇它們,我將從併發模型角度來介紹並比較它們。

併發

說到併發,我們首先想到的就是服務端系統的併發模型,現在常見的併發模型有多線程模型,事件循環模型,Actor 模型和 CSP 模型等。爲了能測試服務器系統的併發能力,性能測試工具也需要支持與之相應的併發發包能力。而充分了解性能測試工具的併發模型,可以更好地幫助你選擇適合自己的性能測試工具。

JMeter,Locust 和 Gatling 選擇了三種不同的併發模型,這個應該是和開發者當時的技術背景,業務需求,資源情況等密切相關的。所以沒有必要去探究當時作者爲什麼要選擇這個模型,但是可以嘗試去理解這些不同模型的特點,從而選擇到適合自己的模型。

JMeter 使用的是多線程模型,Locust 使用的是事件循環模型,而 Gatling 使用的是 Actor 模型,最近又有一個後起之秀 K6,它則使用的是 CSP 模型。 

並行和併發是完全不同的兩個概念,簡單說並行是操作系統和 CPU 的一種能力,而併發是應用程序的一種能力。如果性能測試工具支持多線程或者多進程,並且運行的操作系統支持並行以及 CPU 是多核的情況下,其發包能力能大大增強。但是這樣的條件比較苛刻,所以這裏就不做深入探討。

比較

JMeter

JMeter 是三個工具中最早發佈的性能測試工具,由於早期性能測試的需求並不十分複雜,並且對於併發性能的要求也不是很高,所以 JMeter 使用了當時最爲成熟的併發模型——多線程模型(Threads)和 Java 語言來開發。

這種模型的特點就是,重度依賴於開發語言和操作系統對於多線程的支持,如果語言和操作系統層面對於多線程的支持不好,就會導致這種併發模型出現問題。

其次多線程切換的時候資源消耗比較多,所以和另外兩個輕量級的併發模型相比,在同等資源的情況下,產生的有效併發數量會小很多。

最後多線程也相對容易產生錯誤,比如死鎖,共享數據錯亂等,所以 JMeter 使用界面的方式也是儘可能地減少了由於二次開發導致的這類錯誤。

其優勢就是可以在操作系統支持的情況下,使用到多核處理器的多個核。但是隨着性能測試需求的增多,JMeter 爲了能滿足更多的需求,也在不停地更新功能和增加其插件,比如支持分佈式來解決性能不足的問題,支持更多的擴展腳本來滿足自定義需求等等。但是其基礎併發模型一直沿用多線程模型,導致併發性能沒有辦法進一步提升,估計在未來可以預見的很長一段時間之內是不會改變的。

(多線程併發模型圖)

Locust

Locust 爲了避免多線程存在的各種問題,它選擇了消息循環模型(EventLoop)和 Python 語言來開發。

EventLoop 模型最大的優勢就是在一個線程裏面可以完成大量的併發,從而避免了多線程帶來的各種問題。與此同時它帶來的問題就是無法同時使用多核處理器的多個核,從而無法充分使用硬件資源。不過可以通過 Locust 提供了分佈式的方法來使用多核。

其次 Locust 的併發模型裏面併發用戶的數據只能配置一個固定值,並且在 Locust 運行的過程中是不能改變的。這個特性與 JMeter 和 Gatling 都不一樣,因爲 JMeter 和 Gatling 都是可以在運行的過程中改變併發用戶數量。

(消息循環併發模型圖)

Gatling

Gatling 是三個工具中發佈最晚的一款,所以它選擇 Akka(Actor) 模型和 Scala 語言來開發。由於 Actor 模型的輕量和高併發性,再加上 Scala 語言基於 JVM,所以 Gatling 的併發模型結合了 JMeter 和 Locust 的優勢,其儘可能地避免了多線程存在的一些問題,並可以充分使用硬件資源:多核。

其次 Actor 模型核心是基於消息傳遞的,並且使用每個虛擬用戶基於一個 Actor 就可以做到相對獨立,並通過消息傳遞進行通信。

所以它具有和消息循環模型同樣在單線程裏面進行高併發的能力。並且它還可以在運行時輕鬆地動態增加和減少併發虛擬用戶數(Actor)。雖然其併發模型十分優秀,但是需要使用 Scala 語言來進行開發,使得很多測試人員望而卻步,導致 Gatling 的使用量並不是很廣泛。

(Actor 併發模型圖)

總結

JMeter,Locust 和 Gatling 使用了三種典型的併發模型,從而決定了其不同的基礎特性。充分了解這些特性,可以更好地幫助我們選擇適合自己項目的性能測試工具,從而避免一些後期的一些問題。如果不想選擇已有的這些開源測試工具,想自己重新開發,選擇併發模型也是非常重要的一步。 

雖然很多性能測試初級者,也許並不關心性能測試工具的併發模型,但是隨着深入學習和實踐之後,會遇到各種不同的需求或者問題。爲了實現這些需求和解決這些問題,就需要深入瞭解性能測試工具的各種特點,這其中就包括併發模型。 

當前大量的服務器軟件也是使用和性能測試工具相同的併發模型,所以學習並瞭解這些併發模型,可以讓你進一步瞭解被測系統的性能模型,從而更好地設計性能測試方案和模型。所以對於高級的性能測試工程師或者性能工程師,併發模型都是一門必不可少的課程。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Csyxh76MloYzFXU1ZvyNAQ