Locust使用手册--生成分布式负载

9 篇文章 0 订阅
6 篇文章 1 订阅

生成分布式负载

运行Locust单个进程可以模拟相当高的吞吐量。对于一个简单的测试计划它可以做到每秒发送数百个请求,如果使用FastHttpUser类则可以达到每秒数千个请求。
但如果你的测试计划是复杂的或希望运行更多的负载,则需要进行扩展到多进程,乃至多台主机。
要实现这个,使用--master启动一个Locust实例和使用--worker启动多个worker实例。如果workers(辅助进程)和master(主进程)不是同一台机器,则可以使用--master-host将它们指向运行master(主进程)机器的IP/主机名。
master实例运行Locust的web界面,并告诉workers实例何时生成/停止用户。worker实例们运行并发用户且将运行统计结果返回给master实例。master实例本身不运行任何并发用户。
在运行Locust分布式时,master主机和worker主机都必须有locustfile的副本。

批注
由于Python不能完全使用每个进程的多个内核(参考GIL),为了充分利用所有的计算能力,通过应该在worker主机上每个处理器内核运行一个工作实例。

批注
这里对每个worker主机能运行的并发用户数几乎不做限制。只要它们的总请求数率/RPS不是太高的话,Locust/gevent可以在每个进程上运行数千甚至数万个并发用户。

批注
如果Locust即将耗尽CPU资源,它将记录一条警告。

示例

以master模式启动Locust实例:

$locust -f my_locustfile.py --master

然后在每个worker主机上(如将192.168.0.14替换为master主机的IP,或者如果你的worker主机与master主机在同一台机器上,则完全忽略该参数):

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

可选参数

--master
设置Locust为master模式,Web界面在此节点上运行。

--worker
设置Locust为worker模式。

--master-host=X.X.X.X
该参数与--worker一起使用,设置master主机节点的主机名/IP(默认是127.0.0.1)。

--master-port=5557
该参数与--worker一起使用,设置master主机节点的端口号(默认是5557)。

--master-bind-host=X.X.X.X
该参数与--master一起使用,确定master节点将要绑定到哪个网络接口上,默认是*(表示所有可用的接口)。

--master-bind-port=5557
该参数与--master一起使用,确定master节点将要监听的网络端口,默认是5557。

--expect-workers=X
该参数在是--headless启动master节点时使用。master主机在开始测试前需等待X个worker主机已连接成功。

跨节点通信

在分布式模式下运行Locust,可能master节点和worker节点之间需要通讯以便协调数据。这可以通过使用内置消息钩子的自定义消息轻松完成:

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!")

# 当master主机接收到'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源代码的示例目录中找到。

使用Docker分布式运行

参考在Docker运行章节内容。

在非web UI的情况下运行Locust分布式模式

参考在非Web UI情况下运行Locust分布式模式

提升Locust性能

如果你计划执行大规模负载测试,你可能会对使用Locust自带的替代HTTP的客户端感兴趣。你可以从使用更快的HTTP客户端提升性能章节获取更多信息。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值