第 10 章 · 分布式压测
本章目标:掌握 Locust 的 master/worker 分布式架构,学会跨多台机器发起大规模并发压力。
10.1 为什么需要分布式
单台机器的 CPU、内存和网络带宽有限。当需要模拟数万甚至数十万虚拟用户时,单进程 Locust 无法提供足够的吞吐量。Locust 的分布式模式通过一个 master 节点 + 多个 worker 节点解决此问题:
text
┌──────────┐ ┌──────────┐
│ Master │────▶│ Worker 1 │──▶ 目标系统
│(统计汇总) │ └──────────┘
│ │ ┌──────────┐
│ │────▶│ Worker 2 │──▶ 目标系统
└──────────┘ └──────────┘Master 不产生任何请求——它仅负责向 worker 分发用户数和任务定义,并汇总所有 worker 的统计数据。每个 worker 是独立的 Python 进程,运行相同的 locustfile。
10.2 启动 Master
bash
locust -f locustfile.py --master --host https://api.example.com
# 默认监听 8089 端口(Web UI)
# worker 通信端口为 5557(TCP)和 5558(UDP)关键参数:
| 参数 | 说明 |
|---|---|
--master | 以 master 模式启动 |
--master-bind-host | 监听地址(默认 *) |
--master-bind-port | 通信端口(默认 5557) |
--expect-workers | 等待指定数量 worker 就绪后再开始 |
使用 --expect-workers 可以防止 master 在所有 worker 连接之前就启动测试:
bash
locust -f locustfile.py --master --expect-workers 410.3 启动 Worker
在每台压测机上执行:
bash
locust -f locustfile.py --worker --master-host=192.168.1.100
# --worker 声明为 worker 节点
# --master-host 指向 master 的 IP(默认 localhost)同一 locustfile
所有 worker 必须能访问到与 master 相同版本的 locustfile.py。推荐做法:
- 将 locustfile 放在共享文件系统或 git 仓库中;
- 或用 Docker 镜像统一分发。
10.4 容量规划
每个 worker 能模拟的并发用户数取决于硬件和脚本复杂度。经验值:
- 简单 HTTP GET:每 worker 约 2000–5000 并发用户;
- 复杂 POST + JSON 解析:约 500–1500 并发用户;
- CPU 密集型断言或加密:更低。
估算所需 worker 数量:
python
workers_needed = target_users / per_worker_capacity
# 示例:目标 50,000 用户,每 worker 承载 2,500
workers_needed = 50_000 / 2_500 # = 20 台 worker10.5 Docker Compose 编排
yaml
version: "3"
services:
master:
image: locustio/locust
ports: ["8089:8089"]
volumes: [./locustfile.py:/mnt/locust/locustfile.py]
command: -f /mnt/locust/locustfile.py --master
worker:
image: locustio/locust
volumes: [./locustfile.py:/mnt/locust/locustfile.py]
command: -f /mnt/locust/locustfile.py --worker --master-host master
deploy:
replicas: 5bash
docker compose up --scale worker=10本章小结
- Master 只做调度与统计汇总,不产生请求;Worker 才是实际发压节点;
- 所有 worker 需访问相同 locustfile;
--expect-workers防止过早启动; - 每 worker 并发容量取决于脚本复杂度,需实测校准。
🧪 随堂测验
点击你认为正确的选项。答错时会展示正确答案与原因解析。
1. Locust 分布式模式中,Master 节点的职责是什么?
2. 启动 worker 时,哪个参数用于指定 master 的 IP?
3. `--expect-workers 4` 参数的作用是?
4. 如果目标需要模拟 20,000 并发用户,每个 worker 实测可稳定承载 1,000 用户,最少需要几台 worker?
🛠️ 动手实践
- 本机启动 1 个 master + 3 个 worker(同机多终端),对 httpbin.org 发起 3000 用户压测。
- 使用 Docker Compose 编排 master + 5 workers,对比单机模式的 RPS 差异。
- 测试你的 worker 单机最大并发承载量(逐步增加 users 直到响应时间飙升)。