分散式壓力測試

前言

上次介紹的 Locust 壓力測試,基本上是建立在單個 process 和單個 ip 上。單點測試的確在模擬多個使用者上很方便,但容易受到單一機器的效能影響,模擬幾百幾千可能還可以,但到了幾萬人或是更多,可能就要換另一種方式了。雖然目前我們的軟體可能不需要測試到萬人或更高人數的壓測。但是目前我們軟體設有 Rate Limit 的設計來防止惡意的 DDoS 攻擊,因此如果用之前的單點測試很容易會被判定為黑名單,為了解決這種問題最快的方式當然是直接把要測試的 ip 位置設為白名單。但其實還有另一種方式,就是進行散是測試,不同於一般的壓力測試,分散式壓力測試採用多點式(多個來源 IP),除了可達到單點式的測試結果,可為客戶測試真實情況下,用戶數目上升時會產生的問題,以及是否易於遭受 DDoS 攻擊。

Locust Distributed load generation

而 Locust 也有提供分散式壓力測試的功能,在分散式壓力測試中,主要有有兩種角色,一個是 master(負責分配)一個是 worker(負責執行壓測),流程是透過 master 來告知底下的 worker 何時生成 user,接著 worker 再將測試到的資聊回傳給 master。(註:master 自身不能產生任何 user)

Example

以下先說明如何設定 process 為 master 或是 worker 指定為 master

locust -f my_locustfile.py --master

指定為 worker 並且將 master 的 ip 告訴 worker

locust -f my_locustfile.py --worker --master-host=192.168.0.14

Communicating across nodes

我們可以使用之前介紹的 event 來自定義要傳送的訊息。

from locust import events
from locust.runners import MasterRunner, WorkerRunner

# Fired when the worker receives a message of type 'test_users'
def setup_test_users(environment, msg, **kwargs):
    for user in msg.data:
        print(f"User {user['name']} received")
    environment.runner.send_message('acknowledge_users', f"Thanks for the {len(msg.data)} users!")

# Fired when the master receives a message of type 'acknowledge_users'
def on_acknowledge(msg, **kwargs):
    print(msg.data)

@events.init.add_listener
def on_locust_init(environment, **_kwargs):
    if not isinstance(environment.runner, MasterRunner):
        environment.runner.register_message('test_users', setup_test_users)
    if not isinstance(environment.runner, WorkerRunner):
        environment.runner.register_message('acknowledge_users', on_acknowledge)

@events.test_start.add_listener
def on_test_start(environment, **_kwargs):
    if not isinstance(environment.runner, MasterRunner):
        users = [
            {"name": "User1"},
            {"name": "User2"},
            {"name": "User3"},
        ]
        environment.runner.send_message('test_users', users)

使用方法

使用方法就如同上一章所題的一樣,要注意的是,在指定生成的 user 時會平均分配給 worker

tags: Locust 壓力測試

AINIMAL人工社群智慧養成

找到與你最契合的人