Locust分布式压测需手动配置master/slave角色、同步脚本、显式指定网络地址,缺一不可;单机模式受GIL和单进程限制,并发用户数常卡在1000–2000,易触发连接耗尽或RPS归零。

Locust 分布式压测不是“开箱即用”的一键模式,必须手动拆分 master/slave 角色、同步脚本、显式指定网络地址——漏掉任意一环,locust 就会卡在连接超时或显示 0 slaves。
为什么单机 locust -f test.py --users=5000 会失败
Python 的 GIL 和 Locust 默认的单进程模型限制了并发上限。即使你设了 5000 用户,实际能发出的并发请求数常卡在 1000–2000 左右(取决于响应时间与 CPU 核心数),且系统资源(尤其是 socket 数量、TIME_WAIT 连接)会迅速耗尽。错误现象包括:ConnectionRefusedError、OSError: [Errno 24] Too many open files、Web UI 中 RPS 突然归零。
- 根本原因不是脚本写错,而是单进程无法调度上万 greenlet 并发 IO
-
--users是逻辑用户数,不等于 TCP 连接数,但高权重@task或短wait_time会快速推高连接压力 - 解决路径只有一条:启用
--master+--slave模式,把负载分散到多个进程(甚至多台机器)
locust --master 启动后 Web UI 显示 0 slaves 怎么办
这是最常卡住的环节。Master 不会自动发现 Slave,Slave 必须主动连入,且双方需满足三个硬性条件:
- 所有机器(含 master)都装有完全一致版本的
locust(建议统一用pip install locust==2.29.1,避免 2.30+ 的 WebSocket 兼容问题) - Slave 启动命令中必须带
--slave --master-host=192.168.x.x(不能用localhost或127.0.0.1,这是跨进程通信,不是本地回环) - 防火墙放行 master 的
--master-port(默认 5557)和 Web UI 端口(默认 8089);Windows 用户尤其要关掉 Windows Defender 防火墙临时规则
验证方式:在 slave 终端看到 Connected to master... 日志才算成功;若一直卡在 Waiting for master...,优先检查 ping 和 telnet 192.168.x.x 5557 是否通。
分布式压测脚本里哪些地方容易被忽略
脚本本身在 master/slave 模式下无需修改,但以下三点直接影响结果可信度:
-
host必须写全协议+域名/IP,比如host = "https://www.php.cn/link/710ba53b0d353329706ee1bedf4b9b39";如果写成host = "/api",slave 会拼出http:///api导致全部 404 - 所有
on_start登录逻辑必须加异常处理,否则某个 slave 登录失败会导致整个进程退出,locust不会重试或降级 - 不要在脚本里用
print()或写本地文件——master 不收集 stdout,slave 的日志默认不输出到终端,调试时改用logging.info()并确保配置了 root logger
示例修正:
import logging
from locust import HttpUser, task, between
<p>logging.basicConfig(level=logging.INFO)</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill11526" title="Python Hardener"><img
src="https://img.php.cn/upload/skill/001/246/273/6adaf20dbae7c507.jpg" alt="Python Hardener" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill11526" title="Python Hardener" class="overflowclass">Python Hardener</a>
<p class="overflowclass">通过完整的安全审查、代码整洁重构、健壮的错误处理、正确的日志记录以及完整的文档字符串覆盖,强化 Python 脚本。</p>
</div>
<a rel="nofollow" href="/xiazai/skill11526" title="Python Hardener" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div><p>class ApiUser(HttpUser):
host = "<a href="https://www.php.cn/link/710ba53b0d353329706ee1bedf4b9b39">https://www.php.cn/link/710ba53b0d353329706ee1bedf4b9b39</a>" # ✅ 必须是完整 URL
wait_time = between(1, 3)</p><pre class="brush:php;toolbar:false;">def on_start(self):
try:
resp = self.client.post("/login", json={"u": "x", "p": "y"})
if resp.status_code != 200:
logging.error(f"Login failed: {resp.status_code}")
except Exception as e:
logging.error(f"Login exception: {e}")
@task
def get_data(self):
self.client.get("/v1/data")
多机部署时 --master-host 填什么才对
填 master 机器上能被 slave 路由到的 IP 地址,不是 127.0.0.1,也不是内网 DNS 名(除非所有 slave 都配了相同 hosts 解析)。最稳妥的是填 master 的局域网 IPv4 地址,例如 192.168.1.100。
- Linux/macOS:用
ip a | grep "inet " | grep -v "127.0.0.1"找活跃网卡 IP - Windows:用
ipconfig | findstr "IPv4",选和 slave 在同一子网的那个 - 云服务器(如腾讯云 TKE):必须填内网 IP,公网 IP 会被安全组拦截,且
locustslave 默认不走 SNAT
启动命令示例:
Master(192.168.1.100):locust -f test_api.py --master --master-bind-host=192.168.1.100 --master-bind-port=5557
Slave(192.168.1.101):locust -f test_api.py --slave --master-host=192.168.1.100 --master-port=5557
注意:--master-bind-host 控制 master 监听哪个网卡,不设则默认 0.0.0.0;但 --master-host 是 slave 用来 connect 的目标地址,二者必须一致或路由可达。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










