单机已达上限?PerfTest 分布式压测登场,轻松模拟百万用户洪峰

前言

在前一篇文章中,我们详细介绍了 perftest 的单机压测能力,展示了它如何通过极简的命令行实现对 HTTP/1.1、HTTP/2、HTTP/3 与 WebSocket 的高性能测试。然而,当业务系统庞大、服务部署分布式、网络链路复杂时,单机的压测能力显然无法满足真实生产环境的模拟需求。

幸运的是,perftest 不止于单机。它同样支持 分布式集群压测 ,通过 Collector + Agent 的架构,让你轻松在多台机器上同时发起测试,实现百万乃至千万级并发的性能评估。

为什么选择分布式集群压测?

1. 还原真实流量场景 单机压测无法模拟用户从不同地域、网络环境、延迟条件下的访问行为。而分布式集群压测可以让请求从多个地理节点同时发出,更贴近真实生产环境。

2. 突破性能瓶颈 当单机 CPU、内存或网络带宽达到极限时,测试结果已经不再准确。perftest 通过多机分流请求,避免了单节点成为瓶颈。

3. 验证系统的水平扩展能力 当应用运行在 Kubernetes、Service Mesh 或微服务集群中,分布式压测可以帮助你验证系统在高并发场景下的负载均衡策略与弹性伸缩效果。

4. 提供更全面的数据观察 集群模式下的实时监控让你不仅能看到整体的 QPS、延迟曲线,还能细分到每个 Agent 节点的性能分布,精准定位性能瓶颈所在。

架构设计:Collector 与 Agent

perftest 的分布式压测系统采用了极简、稳定的 Master-Agent(Collector-Agent)架构,框架图如下:

  • Collector(主控节点) 负责创建测试会话、调度所有 Agent、聚合性能指标,并在 Web UI 实时展示整体数据。

  • Agent(执行节点) 实际执行压测任务,定期将性能指标推送给 Collector。Agent 具备自动注册、配置热加载、断线重连等机制,确保在大规模分布式场景下稳定运行。

你可以想象成一个"指挥官(Collector)"指挥一支由多个"士兵(Agent)"组成的压测军团------只需一声令下,所有节点同时开火。

工作原理:从注册到汇总

整个压测流程非常清晰:

  1. 启动 Collector: Collector 服务启动并提供一个 Web 管理界面。
  2. 创建测试会话: 在 Web 界面中,指定期望参与测试的 agent 节点数量,然后开始一个新的会话。
  3. 启动 Agent: 每个 agent 启动后,会读取其配置文件并自动向 Collector 注册。
  4. 开始测试: 一旦达到预设数量的 agent 完成注册,Collector 会通知所有 agent 同时开始压测。
  5. 汇聚结果: Agents 将性能数据(吞吐量、延迟等)实时推送到 Collector,由 Collector 在仪表盘上实时展示。
  6. 测试结束与报告导出: 压测结束后,Collector 会自动生成完整的 Markdown 格式报告,可一键下载保存。

提示: Agent 会主动监听其 agent.yml 配置文件。任何更改都会被自动热加载,无需重启 agent 进程,这使得调整测试参数非常便捷。

快速开始:一个简单的集群示例

以下是一个包含 1 个 Collector 与 3 个 Agent 的基础集群示例:

角色 IP 地址 说明
Collector 192.168.1.20 管理节点
Agent 1 192.168.1.101 执行节点
Agent 2 192.168.1.102 执行节点
Agent 3 192.168.1.103 执行节点

Step 1. 启动 Collector

在机器 1 (192.168.1.20) 上,启动 Collector 服务:

bash 复制代码
sponge perftest collector

浏览器访问 http://192.168.1.20:8888,创建一个新的测试会话并设置 Agent 数量为 3。

Step 2. 启动 Agents

每个 Agent 的配置文件 agent.yml 示例:

yaml 复制代码
# 1. 协议配置 (支持: http | http2 | http3)
protocol: http

# 2. 目标 API 配置
testURL: "http://localhost:8080/get"
method: "GET"        # 支持的方法: GET | POST | PUT | PATCH | DELETE
body: ""             # 支持的数据类型: JSON, Form-data, Text. 例如: "{\"key\": \"value\"}"
headers:
  - "Authorization: Bearer <token>"
  #- "Content-Type: application/json"

# 3. 压测策略 (二选一: 固定时长或固定请求数)
duration: 10s             # 例如: 10s, 1m, 2h
# total: 500000           # 总请求数

# 4. 服务发现,确保 collector 服务和 agent 服务能互相通信
collectorHost: "http://192.168.1.20:8888"     # Collector 服务的地址
agentHost: "http://<agent-host-ip>:6601"      # 当前 agent 可被访问的 IP 和端口
agentPushInterval: 1s                         # 指标推送频率

重要提示:

  • 请将 agentHost 中的 <agent-host-ip> 替换为每台 agent 机器的实际 IP
  • 对于同一次测试会话,所有 agent 配置文件中的 testURLmethod 必须完全一致。

分别在机器 2、3、4 上启动 agent 进程:

bash 复制代码
sponge perftest agent -c agent.yml

当 3 个 Agent 均注册成功后,Collector 会自动同步启动压测并实时展示曲线图表,如图所示:

测试结束后,还可以点击 "下载测试报告",获取详细的 Markdown 报告,包括所有统计指标与图表数据,用于后续分析或性能回归对比。

Kubernetes 场景下的自动化部署

对于大规模测试,手动管理节点是不现实的。perftest 可以轻松部署在 Kubernetes 上,让您能够毫不费力地扩展您的 agent 数量。

提供了一个完整的 yaml 部署清单和具体操作示例,请看文档 在 Kubernetes 上部署 perftest

横向对比:分布式压测的"玩家们"

perftest 的分布式能力同样独树一帜。让我们看看它与业内主流的分布式压测工具相比如何。

特性 / 工具 JMeter Locust k6 (Distributed) perftest (Distributed)
核心架构 GUI Master + Agents Code-based Master/Worker k6 Operator / CRD Web-UI Collector + Agents
测试定义 GUI (XML) Python 脚本 JavaScript 脚本 YAML 配置
资源消耗 高 (Java/GUI) 中 (Python/gevent) 中 (Go) 低 (Go)
K8s/云原生 复杂 (需自行容器化) 良好 (提供 Helm Chart) 优秀 (原生 Operator) 原生友好 (提供部署清单)
上手难度 极低
动态配置 需重启 需重启 需重启 (热加载)
  • JMeter (The Veteran):功能最强大、最全面的压测工具,拥有庞大的插件生态。但其基于 Java 和 GUI 的架构使其资源消耗巨大,在云原生环境中的部署和自动化也相对笨重。
  • Locust (The Coder's Choice):用 Python 定义用户行为,对程序员非常友好,能够轻松编写复杂的业务逻辑。其 Master/Worker 架构清晰,但大规模部署时仍需一定的 DevOps 经验。
  • k6 (The Modern Contender):k6 在分布式测试方面与 Kubernetes 深度集成,通过 Operator 和 CRD (自定义资源) 的方式管理测试,是云原生场景下的强大选择。但它依然依赖于编写 JavaScript 脚本来定义负载。
  • perftest (The Pragmatist)perftest 在分布式场景下延续了其"简单纯粹"的哲学。它以配置取代了脚本 ,极大地降低了分布式压测的门槛。其 Collector + Agent 架构清晰易懂,通过 Web UI 即可发起和监控测试,并提供了开箱即用的 Kubernetes 部署文件。配置热加载的特性更是让调整测试参数变得异常高效,无需重新构建和部署,完美契合敏捷迭代的需求。

总结:从单点到集群,简约而不简单

perftest 并非意图取代 k6JMeter 这类功能全面的"瑞士军刀",而是为开发者和 SRE 工程师提供了一个更现代、更聚焦、更贴近云原生生态的选择。

它巧妙地覆盖了性能测试的两个核心场景:

  1. 对于单机压测 ,它是一把锋利的"手术刀",让你能以最低的学习成本,快速验证和对比包括 HTTP/3WebSocket 在内的最新网络协议,并通过与 Prometheus 的无缝集成,将性能数据融入可观测性体系。

  2. 对于分布式压测 ,它是一个轻量级的"指挥中心",通过简洁的 Collector-Agent 架构和配置驱动的模式,将大规模压测的复杂性降至最低。其对 Kubernetes 的原生友好性,使其能轻松扩展至成百上千个负载节点,模拟海量并发。

当你的需求是:

  • 单机或集群压测 http1/2/3 协议的服务或系统。
  • 快速验证最新网络协议(HTTP/3、WebSocket)的性能表现。
  • 将性能测试与 Prometheus 监控系统无缝打通,实现压测过程的可视化。
  • 在 CI/CD 中进行轻量级的性能回归测试。
  • 无需编写复杂脚本,就能快速搭建并执行大规模分布式压测。
  • 在 Kubernetes 环境中轻松实现压测能力的弹性伸缩。

那么,perftest 绝对值得你一试。在工具日趋复杂的今天,这样一款能平滑地从"小而美"的单机工具扩展为"广而强"的分布式平台的利器,或许正是你一直在寻找的、应对现代 Web 性能挑战的最佳答案。


perftestSponge 生态中的一个组件,Sponge 是一个功能强大且易于使用的 Go 开发框架,秉承"定义即代码"(Definition is Code)的核心理念,通过低代码方式轻松构建稳定、可靠的高性能后端服务,支持包括 RESTful API、gRPC、HTTP+gRPC 和 gRPC Gateway 等多种服务类型。Sponge 内置的 AI 助手能够感知服务代码文件及其上下文,在精准的 AI 约束下,智能生成更符合需求的业务逻辑代码,显著提升开发效率。

Sponge Github 地址: github.com/go-dev-fram...

相关推荐
勇哥java实战分享2 小时前
sensitive-word:一个简单易用的敏感词过滤框架
后端
popoxf2 小时前
spring容器启动流程(反射视角)
java·后端·spring
Funcy3 小时前
XxlJob 源码08:任务执行流程(三)之执行器揭秘
后端
AAA修煤气灶刘哥3 小时前
监控摄像头?不,我们管这个叫优雅的埋点艺术!
java·后端·spring cloud
2301_772093563 小时前
tuchuang_后端_前端_注册登录
数据库·后端·网络协议·mysql·wireshark
间彧3 小时前
列式存储实现方案与关键技术框架
后端
间彧3 小时前
主流OLAP工具对比分析:Kylin、Druid与ClickHouse的适用场景
后端
hui函数3 小时前
python全栈(基础篇)——day03:后端内容(字符串格式化+简单数据类型转换+进制的转换+运算符+实战演示+每日一题)
开发语言·后端·python·全栈
间彧3 小时前
SpringBoot项目实现分布式事务实战指南
后端