本文目录导读:

Locust 进行分布式压测的核心思想是 一个 Master(主节点)控制多个 Worker(工作节点),Master 负责协调、发送指令和收集统计结果,Worker 负责实际模拟用户并发送请求。
以下是实现分布式压测的详细步骤和配置方法:
核心原则与架构
- Master(主节点): 运行
--master模式,无 Web UI 或命令行 UI,负责接收 Worker 的 Heartbeat 并聚合统计数据。它不发送任何实际的 HTTP 请求。 - Worker(工作节点): 运行
--worker模式,连接到 Master,它独立执行测试脚本,并向目标服务器发送请求。 - 通信: Master 和 Worker 之间通过 ZMQ 协议进行通信,这需要所有机器之间网络互通,且 Master 必须开放特定端口。
环境准备
所有节点(Master 和 Worker)需要满足以下条件:
- 安装 Locust: 所有机器上都必须安装相同版本的 Locust 及其依赖。
pip install locust
- 测试脚本同步: 所有机器上的测试脚本(
locustfile.py)必须完全一致,建议使用 Git 或共享文件系统同步。 - 网络可达:
- Worker 节点必须能访问 Master 节点的 IP 和端口(默认 5557 和 5558)。
- Master 节点必须能接收 Worker 的连接。
启动步骤
假设你的测试脚本是 locustfile.py,Master 机器的 IP 是 168.1.100。
第一步:启动 Master 节点
在 Master 机器上运行以下命令:
locust -f locustfile.py --master --web-host=0.0.0.0 --host=https://example.com
--master:指定当前节点为 Master。--web-host=0.0.0.0:允许所有 IP 访问 Web UI(如果是本地测试可以省略,但分布式通常需要远程访问)。--host:目标服务器的 URL。- 可选参数:
--master-bind-port=5557:指定 Master 监听 Worker 连接的端口(默认 5557)。--expect-workers=3:指定期望连接的 Worker 数量,当达到该数量后,Master 自动开始测试(无需手动点击)。
第二步:启动 Worker 节点
在每台 Worker 机器上运行以下命令:
locust -f locustfile.py --worker --master-host=192.168.1.100 --master-port=5557
--worker:指定当前节点为 Worker。--master-host:Master 机器的 IP 地址。--master-port:Master 监听的端口(默认 5557)。- 注意:Worker 节点没有
--host参数,目标服务器的地址由 Master 通过 Web UI 指定,或者由 Master 命令行的--host决定。
第三步:开始压测
- 打开浏览器,访问 Master 的 Web UI:
http://192.168.1.100:8089。 - 你会在界面右上角看到已连接的 Worker 数量(
Workers: 3)。 - 设置用户数(总用户数会均匀分配给所有 Worker,例如设置 1000 用户,3 个 Worker 则每个 Worker 运行约 333 个用户)。
- 点击 Start swarming 开始压测。
无 Web UI 模式(命令行/自动化)
如果不想使用 Web UI,可以通过命令行控制压测的执行。
启动 Master(不带 Web UI):
locust -f locustfile.py --master --headless --host=https://example.com --expect-workers=3 --users=100 --spawn-rate=10 --run-time=30s
--headless:不启动 Web UI。--expect-workers=3:Master 会等待 3 个 Worker 连接后自动开始。--users、--spawn-rate、--run-time:直接在 Master 命令行中指定。- 关键点:Master 会等待 Worker 连接,直到数量达到
--expect-workers值,或者直到--worker-timeout(默认 120 秒)超时。
启动 Worker(与之前相同):
locust -f locustfile.py --worker --master-host=192.168.1.100
结果输出:
- Master 启动时带上
--csv=results参数,所有 Worker 的数据会汇总到 Master 并写入 CSV 文件。
常见问题与解决方法
-
Worker 连接不上 Master?
- 检查防火墙:确保 Master 机器的端口
5557(Worker 连接端口)和5558(Web UI 端口)已开放,如果使用了--web-port修改了 UI 端口,对应调整。 - 检查 IP 地址:Worker 必须使用 Master 的实际 IP(而非
localhost或0.0.1)。 - 网络隔离:检查 Worker 和 Master 是否在同一 VPC 或子网内。
- 检查防火墙:确保 Master 机器的端口
-
脚本不同步导致报错?
- Master 和 Worker 的
locustfile.py必须完全相同,Worker 脚本中引用了 Master 不存在的类或函数,会报错。最佳实践:使用 Git 拉取,或共享同一文件系统。
- Master 和 Worker 的
-
性能瓶颈在哪里?
- Master 是瓶颈:Master 负责聚合所有 Worker 的报告,当有大量 Worker(100+)时,Master 可能成为瓶颈,此时可以考虑限制 Master 的 Web UI 更新频率(
--web-stat-interval)。 - Worker 是瓶颈:Worker 本身是普通机器,如果脚本中有复杂的逻辑或大量的数据处理,可能 Worker 先被 CPU 或内存打满。
- Master 是瓶颈:Master 负责聚合所有 Worker 的报告,当有大量 Worker(100+)时,Master 可能成为瓶颈,此时可以考虑限制 Master 的 Web UI 更新频率(
-
端口冲突?
- 如果默认的 5557/5558 被占用,可以在 Master 启动时指定其他端口:
locust -f locustfile.py --master --master-bind-port=6000
- 对应的 Worker 也要指定:
locust -f locustfile.py --worker --master-host=192.168.1.100 --master-port=6000
- 如果默认的 5557/5558 被占用,可以在 Master 启动时指定其他端口:
实战示例部署架构
场景:需要 5000 并发用户压测一个 API 服务。
- 1 台 Master 节点(4C8G 云服务器):运行 Master 和 Web UI。
- 5 台 Worker 节点(4C8G 云服务器):每台运行 1000 个虚拟用户。
命令示例:
Master 机器:
locust -f bot.py --master --web-host=0.0.0.0 --host=https://api.target.com --expect-workers=5 --users=5000 --spawn-rate=500 --run-time=5m --stop-timeout=10 --csv=distributed_report
Worker 机器 1-5:
locust -f bot.py --worker --master-host=MASTER_PUBLIC_IP --master-port=5557
| 节点角色 | 命令参数 | 作用 | 端口 |
|---|---|---|---|
| Master | --master |
控制协调、聚合数据、提供 Web 界面 | 5557 (Worker 连接) 5558 (Web UI,可配置) |
| Worker | --worker |
执行压测脚本、发送真实请求 | 无需开放入站端口 (主动连 Master) |
核心要点:脚本一致、网络互通、Master 只协调不执行。
标签: 压测
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。