Locust分布式压测必须显式启用--master/--worker模式,单机多终端运行无效果;master仅调度不发请求,需确保脚本无误、端口可用、版本一致;worker须指定--master-host且网络连通;RPS由users、spawn_rate和wait_time共同决定;gevent monkey patch须置于所有import之前。

Locust 分布式压测不是“开了多个进程就自动分布式”,它依赖明确的主从角色划分和网络通信。单机跑 locust -f locustfile.py 永远只是单节点测试,哪怕你开了10个终端窗口都无效——必须用 --master 和 --worker(旧版叫 --slave)显式启动。
启动 master 节点前必须确认三件事
master 不发请求,只管调度和聚合数据,但它对环境和配置很敏感:
-
locustfile.py必须在当前工作目录下,且不能有语法错误(否则 master 启动失败但日志可能只报ImportError,不提示具体哪行) - 如果脚本里用了
host属性,而命令行又传了--host,后者会覆盖前者;但若两者都缺,self.client.get("/api")会直接报Missing scheme in URL - master 默认监听
0.0.0.0:5557(WebSocket)和0.0.0.0:8089(Web UI),确保端口没被占用,防火墙没拦截(尤其跨机器时)
worker 节点常见连接失败原因
worker 启动后卡在 Waiting for master to start 或报 Connection refused,基本就是网络或参数问题:
- worker 命令必须带
--worker且指定--master-host,例如:locust -f locustfile.py --worker --master-host=192.168.1.100(不能写成http://192.168.1.100) - master 主机名或 IP 必须能被 worker 主机 DNS 解析或 ping 通;Windows 上有时需用计算机名而非
localhost,Linux 则更认 IP - worker 和 master 的
locust版本必须一致(比如都是2.15.1),版本 mismatch 会导致 WebSocket 握手失败,日志里只显示空连接断开
权重、思考时间和并发数的真实关系
很多人以为 @task(10) 就是“执行10次”,其实它是相对概率权重。最终每秒请求数(RPS)由三者共同决定:
-
spawn_rate:每秒启动多少虚拟用户(VU),不是总 VU 数 -
users:目标总并发用户数,master 会逐步拉到这个值,不是瞬间达到 -
wait_time:直接影响单个 VU 的请求频率。例如between(1, 3)意味着每个 VU 平均每 2 秒发一次请求,1000 个 VU 理论峰值 RPS ≈ 500,而不是 1000
所以压不出预期 RPS 时,先检查 wait_time 是否设得太小(导致单 VU 过载),再看 users 和 spawn_rate 是否匹配——比如设 users=1000 但 spawn_rate=1,要等 1000 秒才拉满。
立即学习“Python免费学习笔记(深入)”;
结果导出和 no-web 模式的关键细节
CI/CD 中常用 --no-web 自动化压测,但容易忽略两点:
-
--csv=report生成的是report_stats.csv、report_failures.csv、report_exceptions.csv三个文件,不是单个 CSV;路径是相对于当前工作目录,不是脚本所在目录 - 分布式下只有 master 节点输出 CSV,worker 不写任何文件;若用
--master --no-web启动,必须加-c(users)和-t(run time),否则 master 会挂起等待 Web UI 输入 - 想保存实时指标快照,得用
--html=report.html,它只在测试结束时生成,过程中无法查看
真正容易被忽略的是:gevent 的 monkey patch 必须在所有 import 之前执行。如果 locustfile.py 里先 import 了 requests 或其他标准库模块,再调 monkey.patch_all(),网络请求仍会阻塞,导致 worker 实际并发远低于预期——这个 bug 没报错,只表现为 RPS 上不去、CPU 占用低、大量 VU “卡住”。


















