性能测试:Locust使用介绍(四)

分布式负载生成

运行Locust的单个进程可以模拟相当高的吞吐量。对于一个简单的测试计划和较小的有效载荷,它每秒可以发出一千多个请求,如果你使用FastHttpUser,可能会超过一万个。

但是,如果你的测试计划很复杂,或者你想运行更多的负载,你需要扩展到多个进程,甚至可能是多台机器。幸运的是,Locust支持开箱即用的分布式运行。

为此,您可以使用-master标志启动Locust的一个实例,并使用–worker标志启动一个或多个实例。主实例运行Locust的web界面,并告诉worker何时生成/停止用户。工作实例运行您的Users并将统计信息发送回主实例。主实例本身不运行任何用户。

为了简化启动,您可以使用–processs标志。它将启动一个主进程和指定数量的工作进程。它也可以与–worker结合使用,这样它只会启动worker。此功能依赖于fork(),因此它在Windows上不起作用。

单机

启动一个主进程和4个工作进程非常简单:

locust --processes 4

您甚至可以自动检测计算机中逻辑核的数量,并为每个逻辑核启动一个worker:

locust --processes -1

多台机器

在一台机器上以主模式启动locust:

locust -f my_locustfile.py --master

然后在每台工人机器上:

locust -f - --worker --master-host <your master> --processes 4
# -f参数告诉Locust从master而不是从其本地文件系统获取子文件。Locust 2.23.0中引入了此功能。

多台机器,使用locust集群

当您对locustfile进行更改时,您需要重新启动所有Locust进程。locust集群为您自动执行此操作。它还解决了使用SSH隧道从工作程序到主程序的防火墙/网络访问问题(如果主程序在您的工作站上运行,而工作程序在某些数据中心运行,这通常是一个问题)。

pip install locust-swarm

swarm -f my_locustfile.py --loadgen-list worker-server1,worker-server2 <any other regular locust parameters>

locust-swarm

Swarm是一个使用rsync和ssh自动运行分布式Locust的脚本。

它可以在您的本地Linux/MacOS计算机上运行,并使用SSH隧道来帮助解决任何网络/防火墙问题,否则这些问题可能会阻止worker向主机发送数据。

它还实现了一个锁定系统,可以防止多个用户同时对同一个load Generator启动负载测试,如果您有一组共享的load Generator,这很有用。

locust-swarm使用说明

usage: swarm [-h] [-f LOCUSTFILE] --loadgen-list LOADGEN_LIST [--loadgens LOADGENS] [--processes PROCESSES] [--selenium] [--playwright] [--test-env TEST_ENV] [--loglevel LOGLEVEL]
             [--port PORT] [--remote-master REMOTE_MASTER] [--extra-files EXTRA_FILES [EXTRA_FILES ...]] [--upload-plugins] [--version]

一个使用ssh自动运行分布式locust的工具。
示例:swarm -f test.py --loadgen-list loadgen1.domain.com,loadgen2.domain.com --users 50

选项:
  -h, --help            显示此帮助消息并退出
  -f LOCUSTFILE, --locustfile LOCUSTFILE
  --loadgen-list LOADGEN_LIST
                        以逗号分隔的ssh服务器列表,用于在其上启动locust workers
  --loadgens LOADGENS, -l LOADGENS
                        运行locust workers的服务器数量。默认值为-1,表示所有服务器。
  --processes PROCESSES
                        这会原封不动地传递给locust,并决定每个load generator的工作进程数。
  --selenium            在load-gens上启动selenium服务器,以便与locust插件的WebdriverUser一起使用
  --playwright          为workers设置LOCUST_PLAYWRIGHT环境变量
  --test-env TEST_ENV   将LOCUST_TEST_ENV传递给workers(以防您的脚本在*参数解析之前需要它)
  --loglevel LOGLEVEL, -L LOGLEVEL
                        使用DEBUG跟踪负载源等问题
  --port PORT
  --remote-master REMOTE_MASTER
                        用作locust主服务器的ssh服务器(默认情况下在本地运行主服务器)。如果您的工作站出现以下情况,这有助于防止中断负载测试
						断开连接/进入休眠状态。
  --extra-files EXTRA_FILES [EXTRA_FILES ...]
                        要上传的额外文件或目录列表。空格分隔,例如--额外文件testdata.sv*.py my-directory/
  --upload-plugins      上传locust插件以加载gens(如果您正在开发locust插件,这很有用)
  --version, -V         显示程序的版本号并退出

此处未列出的任何参数都会原封不动地转发给locust主控器,因此请继续使用以下内容 --users, --host, --run-time, ...

Swarm配置也可以使用配置文件(~/.locat.conf、locost.conf、pyproject.toml、~/.Swarm.conf或Swarm.conf)进行设置。
命令行上指定的参数会覆盖env-vars,进而覆盖配置文件。
示例运行
~ swarm --loadgen-list perftest03 -t 10 -c 10 -f examples/locustfile.py -H https://example.com
[2019-09-20 13:46:09,885] lafp-mac-JG5J/INFO/root: Waiting for workers to be ready, 0 of 2 connected
[2019-09-20 13:46:10,889] lafp-mac-JG5J/INFO/root: Waiting for workers to be ready, 0 of 2 connected
[2019-09-20 13:46:11,891] lafp-mac-JG5J/INFO/root: Waiting for workers to be ready, 0 of 2 connected
[2019-09-20 13:46:12,195] perftest03/INFO/locust.main: Starting Locust 0.11.1
[2019-09-20 13:46:12,195] perftest03/INFO/locust.main: Starting Locust 0.11.1
[2019-09-20 13:46:12,322] lafp-mac-JG5J/INFO/locust.runners: Client 'perftest03_5ac395b244f3497796a6928e218da7ea' reported as ready. Currently 1 clients ready to swarm.
[2019-09-20 13:46:12,323] lafp-mac-JG5J/INFO/locust.runners: Client 'perftest03_09770e3ada2c47138ffabc5b7af1a25f' reported as ready. Currently 2 clients ready to swarm.
[2019-09-20 13:46:12,896] lafp-mac-JG5J/INFO/locust.runners: Sending hatch jobs to 2 ready clients
[2019-09-20 13:46:12,897] lafp-mac-JG5J/INFO/locust.main: Run time limit set to 10 seconds
[2019-09-20 13:46:12,897] lafp-mac-JG5J/INFO/locust.main: Starting Locust 0.11.1
 Name                                                          # reqs      # fails     Avg     Min     Max  |  Median   req/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
 Total                                                              0     0(0.00%)                                       0.00

[2019-09-20 13:46:12,916] perftest03/INFO/locust.runners: Hatching and swarming 5 clients at the rate 0.5 clients/s...
[2019-09-20 13:46:12,916] perftest03/INFO/locust.runners: Hatching and swarming 5 clients at the rate 0.5 clients/s...
 Name                                                          # reqs      # fails     Avg     Min     Max  |  Median   req/s
--------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------
 Total                                                              0     0(0.00%)                                       0.00

 Name                                                          # reqs      # fails     Avg     Min     Max  |  Median   req/s
--------------------------------------------------------------------------------------------------------------------------------------------
 POST /authentication/1.0/getResults                                4     0(0.00%)      69      65      76  |      65    0.00
--------------------------------------------------------------------------------------------------------------------------------------------
 Total                                                              4     0(0.00%)                                       0.00

...

[2019-09-20 13:46:22,901] lafp-mac-JG5J/INFO/locust.main: Time limit reached. Stopping Locust.
 Name                                                          # reqs      # fails     Avg     Min     Max  |  Median   req/s
--------------------------------------------------------------------------------------------------------------------------------------------
 POST /authentication/1.0/getResults                               16     0(0.00%)      67      65      76  |      66    1.60
--------------------------------------------------------------------------------------------------------------------------------------------
 Total                                                             16     0(0.00%)                                       1.60

[2019-09-20 13:46:22,919] perftest03/INFO/locust.runners: All locusts hatched: WebsiteUser: 5
[2019-09-20 13:46:22,919] perftest03/INFO/locust.runners: Got quit message from master, shutting down...
[2019-09-20 13:46:22,919] perftest03/INFO/locust.runners: Got quit message from master, shutting down...
[2019-09-20 13:46:22,920] perftest03/INFO/locust.main: Shutting down (exit code 0), bye.
[2019-09-20 13:46:22,920] perftest03/INFO/locust.main: Shutting down (exit code 0), bye.
[2019-09-20 13:46:22,920] perftest03/INFO/locust.main: Cleaning up runner...
[2019-09-20 13:46:22,921] perftest03/INFO/locust.main: Running teardowns...
[2019-09-20 13:46:22,920] perftest03/INFO/locust.main: Cleaning up runner...
[2019-09-20 13:46:22,920] perftest03/INFO/locust.main: Running teardowns...
[2019-09-20 13:46:22,955] lafp-mac-JG5J/INFO/locust.runners: Client 'perftest03_5ac395b244f3497796a6928e218da7ea' quit. Currently 0 clients connected.
[2019-09-20 13:46:22,955] lafp-mac-JG5J/INFO/locust.runners: Client 'perftest03_09770e3ada2c47138ffabc5b7af1a25f' quit. Currently 0 clients connected.

...

[2019-09-20 13:46:23,406] lafp-mac-JG5J/INFO/locust.main: Shutting down (exit code 0), bye.
[2019-09-20 13:46:23,407] lafp-mac-JG5J/INFO/locust.main: Cleaning up runner...
[2019-09-20 13:46:23,911] lafp-mac-JG5J/INFO/locust.main: Running teardowns...

 Name                                                          # reqs      # fails     Avg     Min     Max  |  Median   req/s
--------------------------------------------------------------------------------------------------------------------------------------------
 POST /authentication/1.0/getResults                               20     0(0.00%)      67      65      76  |      66    1.71
--------------------------------------------------------------------------------------------------------------------------------------------
 Total                                                             20     0(0.00%)                                       1.71

Percentage of the requests completed within given times
 Name                                                           # reqs    50%    66%    75%    80%    90%    95%    98%    99%   100%
--------------------------------------------------------------------------------------------------------------------------------------------
 POST /authentication/1.0/getResults                                20     66     67     68     68     70     76     76     76     76
--------------------------------------------------------------------------------------------------------------------------------------------
 Total                                                              20     66     67     68     68     70     76     76     76     76

2019-09-20:13:46:25,184 INFO [swarm:201] Load gen master process finished (return code 0)

分布式负载生成选项

–master-host

可选地与–worker一起使用,以设置主节点的主机名/IP(默认为localhost)

–master-port

可选地与–worker一起使用,以设置主节点的端口号(默认为5557)。

–master-bind-host

可选地与–master一起使用。确定主节点将绑定到哪个网络接口。默认为*(所有可用接口)。

–master-bind-port

可选地与–master一起使用。确定主节点将侦听哪些网络端口。默认为5557。

–expect-workers

使用–headless启动主节点时使用。然后,主节点将等待X个工作节点连接,然后再开始测试。

跨节点通信

在分布式模式下运行Locust时,您可能希望在主节点和工作节点之间进行通信,以协调测试。这可以使用内置的消息钩子通过自定义消息轻松实现:

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

# 当worker收到“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!")

# 当主服务器收到“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, WorkerRunner):
        users = [
            {"name": "User1"},
            {"name": "User2"},
            {"name": "User3"},
        ]
        environment.runner.send_message('test_users', users)

请注意,在本地(即非分布式)运行时,此功能将保留;消息将由发送它们的运行者简单地处理。

在注册消息处理程序时使用默认选项将以阻塞方式运行侦听器函数,导致心跳和其他消息的执行量延迟。如果你认为你的消息处理程序需要运行一秒钟以上,那么你可以将其注册为并发。然后,locust会已自己的方式运行。请注意,这些greenlets永远不会被join()

environment.runner.register_message('test_users', setup_test_users, concurrent=True)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值