运行 Locust 在命令行上传递参数和加载配置文件之间的行为不一致

Inconsistent behavior between running Locust passing args on command line and load config file

如果我在终端上传递以下参数 window:

locust --headless --master --expect-workers 5 -H http://localhost -u 100 -r 30 -t 20s -T "Test" -L DEBUG 

Locust 按预期进行了初始化,我可以使用 locust --worker & 在另一个终端 window 上启动工作程序。但是如果我创建一个 locust.conf 文件,如下所示:

headless = true
master = true
expect-workers = 5
host = http://localhost
users = 100
spawn-rate = 30
run-time = 20s
tags = Test
loglevel = DEBUG

正如我们在 Locust Documentation for configuration file 中看到的那样,我可以在终端上仅使用 locust 来启动 Locust 主实例。正如预期的那样,Locust 作为 master 启动,等待 worker 连接,但是当尝试启动 worker 时,他们没有连接到 master 并退出并显示以下消息:

The Locust master port (5557) was busy. Close any applications using that port - perhaps an old
instance of Locust master is still running? (Socket bind failure: Address already in use)

即使 locust.conf 文件只有一个 master = true 行,worker 也无法连接到之前启动的 Locust 主实例。我知道两种将 Locust 启动为 master 的方法都是有效的,但它们的行为不同,因为它们不应该。

是否有任何我没有看到的东西可以提供使 Locust 使用配置文件的方法,或者这是预期的行为?

一旦你在配置中指定了 master,你就不能用命令行覆盖它,所以你的进程都以 master 启动,即使是你想成为 worker 的进程也是如此。

这是我们使用的底层 ConfigArgParse 库的一个限制。在 1.4 中,我什至添加了一个单独的 --headful 参数,以便可以覆盖 --headless,因为它也遇到同样的问题。

我想我们可以让 --slave 自动覆盖 --master,但这也可能有点令人困惑。不过,该组合至少应该会出错。

我建议的解决方法是从配置中删除 master 并仅在命令行中指定它。如果您想要一个用于所有仅主设置的文件,您还可以使用 --config 指定其他配置文件。

我最终得到了以下设置:

  • main.conf 文件上,删除 host 属性并将其放在 User class;
  • Locust 主实例以 locust --config=main.conf
  • 启动
  • 掌握实例所需的尽可能多的工作人员开始分发测试(以防万一):locust --worker &