集群压测使用指南

May 30, 2026 · View on GitHub

本文面向使用者,说明如何把 GUI 中配置好的性能测试计划分发到多台服务器执行。底层行为类似 JMeter 的 master/worker:master 只负责分发、轮询、停止和汇总,真正的请求压力由各 worker 进程产生。

核心概念

  • plan.json:从 GUI 导出的可执行压测计划。它包含环境变量、全局变量、执行设置、线程组、请求、脚本、断言、CSV inline 数据和外部资产引用。
  • master:GUI 远程模式或 performance master run 命令。master 不直接压目标服务,只把计划和分片 assignment 发给 worker。
  • worker:服务器上的 performance worker 进程。worker 只在收到 master 分配的 assignment 后执行,避免多台机器各自完整跑一份计划导致总并发放大。
  • 总并发:GUI 中每个 Thread Group 配置的用户数是全局总并发,不是每台 worker 的并发。比如 100 用户、2 台 worker,默认分成 50/50;101 用户、2 台 worker,默认分成 51/50。
  • CSV 分片:CSV Data Set 会跟随虚拟用户全局区间分片,避免所有 worker 都从第 0 行开始读。CSV 行数少于虚拟用户数时,会按全局用户编号循环复用。

什么时候使用集群压测

适合:

  • 单机 CPU、网络、文件描述符或目标连接数不足,需要多台机器共同施压。
  • 需要在无桌面服务器上长期跑压测。
  • GUI 负责编辑、观察和停止,worker 在专用压测机上执行。

不适合:

  • 只需要几百并发的快速验证,单机 GUI 或 CLI 更简单。
  • 需要严格的跨 worker 全局 P99 原始样本合并。目前 master 聚合的是各 worker 的报告结果,失败/慢请求明细按 worker 有界保留后拉回。

准备工作

  1. 所有机器使用相同版本的 EasyPostman JAR 或安装包。
  2. 每台 worker 机器能访问目标 API。
  3. master 能访问每台 worker 的监听端口。
  4. 如果计划引用本地文件,例如 file-source CSV、multipart 文件,请把文件提前放到每台 worker 的相同路径。GUI 不会自动上传本地文件。
  5. 如果 CSV 是在 GUI 中手工创建或导入并内嵌到计划里的,不需要额外上传文件。

启动 worker

在每台压测机上启动 worker:

java -jar easy-postman-5.5.28.jar \
  performance worker \
  --host 0.0.0.0 \
  --port 19090

--progress-interval <seconds> 只控制 worker 控制台多久打印一次进度,例如 users、total、success、failed、qps。它不影响 master 轮询频率,也不影响压测请求执行。默认就是 1 秒,因此一般可以不写。

关闭控制台进度输出:

java -jar easy-postman-5.5.28.jar \
  performance worker \
  --host 0.0.0.0 \
  --port 19090 \
  --no-progress

本机验证两个 worker:

java -jar easy-postman-5.5.28.jar performance worker --host 127.0.0.1 --port 19090
java -jar easy-postman-5.5.28.jar performance worker --host 127.0.0.1 --port 19091

GUI 远程执行

  1. 在性能测试页面配置一个或多个 Thread Group。
  2. 顶部勾选 远程
  3. Workers 输入框填写 worker 列表,支持逗号或空白分隔:
10.0.0.11:19090,10.0.0.12:19090
  1. 点击开始。GUI 会作为 master 生成分片 assignment,并把当前计划发送给各 worker。
  2. 点击停止时,GUI 会向所有 worker 发送 stop。
  3. 结束后,GUI 会拉取每个 worker 的最终 report 并聚合到“报表”;失败/慢请求明细会在合适的收尾阶段拉回到“结果表”。

CLI master 执行

先从 GUI 导出 plan.json,再运行:

java -jar easy-postman-5.5.28.jar \
  performance master run \
  --plan /path/to/plan.json \
  --workers 10.0.0.11:19090,10.0.0.12:19090 \
  --out /tmp/easy-postman-master-result.json

单机无 GUI 执行同一份计划:

java -jar easy-postman-5.5.28.jar \
  performance run \
  --plan /path/to/plan.json \
  --out /tmp/easy-postman-result.json

实时刷新如何工作

GUI 远程模式运行时,每 1 秒向每个 worker 查询一次状态:

  • 关闭“实时刷新”且关闭“启用趋势”时:请求 /api/performance/v1/runs/{runId}?report=false,只拉轻量状态,包含活跃用户数、总用户数、请求数、失败数、QPS 和运行状态。
  • 开启“实时刷新”或“启用趋势”时:请求 /api/performance/v1/runs/{runId},worker 会构建当前聚合 report 快照返回。实时报表用它刷新“报表”页;趋势图用它读取 HTTP/WS/SSE 的协议级累计计数。
  • “启用趋势”使用同一轮状态数据做趋势采样,不额外增加 worker 请求次数;趋势采样间隔取用户设置,最低 1 秒。WS/SSE 的发送消息/秒、接收消息/秒必须依赖聚合 report,否则轻量 status 只能得到总请求数,无法区分协议消息计数。
  • 运行结束后:master 拉取 /result 获取最终报告,再拉取 /details 获取失败/慢请求明细。

因此,worker 数越多,master 每秒控制面请求数约为 worker 数量。开启实时报表或趋势时,每个响应体更大、worker 需要构建聚合 report 快照,但不会返回失败明细或响应体列表;短压测或极限吞吐压测建议按需关闭实时报表,只看趋势和最终报表。

worker 内存和性能边界

worker 不保存所有请求明细,避免高 QPS 时内存无限增长:

  • 聚合统计使用按 API / 协议维度的统计对象,不按请求数线性保存完整响应。
  • efficient mode 开启时,结果明细只保留失败请求和慢请求,最多保留 1000 条。
  • efficient mode 关闭时,结果明细按“性能结果表行数限制”保留,超过后丢弃最旧明细。
  • 响应体会按预览策略裁剪,结果表渲染不需要的字段会被简化。
  • worker 完成后的 run 状态默认保留 30 分钟,过期后会自动清理,避免 /result/details 长期占用内存。

建议:

  • 大流量或长时间压测开启 efficient mode。
  • 不需要运行中报表时关闭“实时刷新”。
  • 结果表行数不要设置过大,失败排查通常看最近失败和慢请求即可。
  • 每台 worker 使用独立压测机,避免 GUI、目标服务和 worker 抢同一台机器资源。

控制面接口

MethodPath说明
GET/api/performance/v1/healthworker 探活。
POST/api/performance/v1/runs提交一次运行,body 包含完整 plan 和该 worker 的 assignment
GET/api/performance/v1/runs/{runId}?report=false轻量状态轮询,关闭实时报表和趋势时使用。
GET/api/performance/v1/runs/{runId}带运行中聚合 report 的状态轮询,开启实时报表或趋势时使用。
POST/api/performance/v1/runs/{runId}/stop停止指定运行。
GET/api/performance/v1/runs/{runId}/result拉取最终 JSON report。
GET/api/performance/v1/runs/{runId}/details拉取失败/慢请求明细,用于 GUI 结果表。

控制面请求不计入压测 report 的请求数和 QPS。

常见问题

为什么两个 worker 不一定比一个 worker 快?

分布式压测只解决“施压端瓶颈”。如果瓶颈在目标服务、网络回环、master/worker 同机竞争 CPU、短压测初始化开销、脚本执行或 HTTP 连接设置上,多 worker 不一定更快。建议至少跑 30 秒以上,并把 worker 放到独立机器上测试。

plan.json 上传时间算不算压测时间?

不算。master 发送 plan + assignment 属于控制面分发,不计入最终 report 的 elapsedTimeMs 和 QPS。worker 控制台的运行耗时从 worker 异步执行开始计算,可能包含 worker 内部 plan 编译、脚本池初始化和分片应用。

worker 是否需要打开 GUI?

不需要。performance workerperformance runperformance master run 都会走 headless 启动路径,不创建 Swing 主窗口。