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

作者:Go有引力日期:2025/10/9

前言

在前一篇文章中,我们详细介绍了 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)架构,框架图如下:

perftest-architecture.png

  • **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 地址说明
Collector192.168.1.20管理节点
Agent 1192.168.1.101执行节点
Agent 2192.168.1.102执行节点
Agent 3192.168.1.103执行节点

Step 1. 启动 Collector

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

1sponge perftest collector
2

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

Step 2. 启动 Agents

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

1# 1. 协议配置 (支持: http | http2 | http3)
2protocol: http
3
4# 2. 目标 API 配置
5testURL: "http://localhost:8080/get"
6method: "GET"        # 支持的方法: GET | POST | PUT | PATCH | DELETE
7body: ""             # 支持的数据类型: JSON, Form-data, Text. 例如: "{\"key\": \"value\"}"
8headers:
9  - "Authorization: Bearer <token>"
10  #- "Content-Type: application/json"
11
12# 3. 压测策略 (二选一: 固定时长或固定请求数)
13duration: 10s             # 例如: 10s, 1m, 2h
14# total: 500000           # 总请求数
15
16# 4. 服务发现,确保 collector 服务和 agent 服务能互相通信
17collectorHost: "http://192.168.1.20:8888"     # Collector 服务的地址
18agentHost: "http://<agent-host-ip>:6601"      # 当前 agent 可被访问的 IP 和端口
19agentPushInterval: 1s                         # 指标推送频率
20

重要提示:

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

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

1sponge perftest agent -c agent.yml
2

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

perftest-ui.png

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

Kubernetes 场景下的自动化部署

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

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

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

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

特性 / 工具JMeterLocustk6 (Distributed)perftest (Distributed)
核心架构GUI Master + AgentsCode-based Master/Workerk6 Operator / CRDWeb-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…


单机已达上限?PerfTest 分布式压测登场,轻松模拟百万用户洪峰》 是转载文章,点击查看原文


相关推荐


Webpack实战笔记:从自动构建到本地服务器搭建的完整流程
XiangCoder2025/10/7

作为前端开发者,Webpack 是绕不开的构建工具。最近系统学习了 Webpack 的自动构建和服务器搭建,整理了一套从基础到实战的操作笔记,包含具体案例和踩坑经验,适合新手跟着实操。 前言:为什么需要 Webpack 构建工具? 刚开始写前端项目时,我们习惯在 index.html 里手动引入各种 js、css 文件。但随着项目变大,会遇到两个核心问题: 资源越来越多,手动管理引入路径容易出错(尤其是加哈希值优化缓存时); 开发时需要频繁刷新页面看效果,效率太低。 Web


Android系统模块编译调试与Ninja使用指南
龙之叶2025/10/6

模块编译调试方法 (此处举例framework、installd、SystemUI等模块的编译调试,其他类似) 1. Framework模块编译 Android系统代码的framework目录内,一共有3个模块单独编译:framework、services、framework-res.apk。 注意:偶尔会有改了代码但没检测到,编译结束后产物并未更新的情况,所以可以考虑先剪切掉原先的产物或者检查产物更新时间确保已经重新编译。 步骤: 完成根目录下 source build/envsetup.sh


精选 4 款开源免费、美观实用的 MAUI UI 组件库,助力轻松构建美观且功能丰富的应用程序!
追逐时光者2025/10/5

前言 一套优秀的 UI 组件库不仅能大幅提升开发效率,还能显著增强应用的视觉体验与交互质感。今天大姚给大家分享 4 款开源免费、美观实用的 MAUI UI 组件库,助你轻松打造专业级的跨平台应用程序。 .NET MAUI介绍 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。使用 .NET MAUI,可从单个共享代码库开发可在 Android、iOS、macOS 和 Windows 上运行的应用。 .NET开源免费的跨平


医院病人信息管理系统 Web 版开发实战(一)
FPGA+护理+人工智能2025/10/3

医院病人信息管理系统Web版开发实战 文章目录 医院病人信息管理系统Web版开发实战一、概述二、项目结构搭建2.1 Flask 项目结构原理2.2 创建项目文件夹2.3 初始化 Flask 应用 三、路由设计3.1 Flask 路由机制原理3.2 定义核心路由3.3 数据存储函数 四、模板开发4.1 Jinja2 模板引擎原理4.2 基础模板设计4.3 首页模板(index.html)4.4 添加病人模板(add.html)4.5 详情和编辑模板 未完待续


Java-Spring入门指南(十一)代理模式与Spring AOP实战
珹洺2025/10/2

Java-Spring入门指南(十一)代理模式与Spring AOP实战 前言一、代理模式1.1 静态代理步骤1:定义租房接口(抽象行为)步骤2:实现房东类(真实对象)步骤3:编写中介类(代理对象)步骤4:测试静态代理静态代理的优缺点 1.2 动态代理 二、AOP是什么?2.1 AOP是什么?2.2 AOP有什么用?2.3 AOP的使用场景是什么?2.4 AOP的核心特点是什么? 三、AOP在Spring中的应用3.1 准备依赖3.2 配置Spring的AOP命名空间3.3 定义


(14)ASP.NET Core2.2 中的日志记录
老葱头蒸鸡2025/10/2

1.前言 ASP.NET Core支持适用于各种内置和第三方日志记录提供应用程序的日志记录API。本文介绍了如何将日志记录API与内置提供应用程序一起使用。 2.添加日志提供程序 日志记录提供应用程序显示或存储日志。例如,控制台提供应用程序在控制台上显示日志,Azure Application Insights提供应用程序将这些日志存储在Azure Application Insights中。要添加提供应用程序,请在Program.cs中调用提供程序的Add{provider name}扩


Python 的内置函数 abs
IMPYLH2025/10/2

Python 内建函数列表 > Python 的内置函数 abs 无论是在数学计算、数据分析,还是日常编程中,我们经常需要获取一个数的绝对值。Python 提供的 abs() 函数,可以让我们轻松地计算数字的绝对值,而无需手动判断正负。 abs 函数的参数和返回值如下: def abs(x): ''' 计算参数的绝对值 :param x: 要计算的值 :return: x 的绝对值 ''' 示例 在线运行 print(abs(-50)) p


[论文阅读] 人工智能 + 软件工程 | 从“人工扒日志”到“AI自动诊断”:LogCoT框架的3大核心创新
张较瘦_10/1/2025

随着软件服务系统日益庞大、复杂,基于日志的故障诊断对保证软件服务的可靠性至关重要。已有的日志故障诊断方法虽能确定故障类型,但无法为推理过程提供解释,导致难以在生产环境部署。为此,本文提出LogCoT框架,通过Auto-FSC算法利用超大规模闭源LLM提取日志语义,生成可解释根因分析报告;结合无类别标注指令优化与有类别标注参数微调,优化Mistral基座模型;再用LLMf-IPO算法纠正错误结果,对齐用户意图。在两大生产日志数据集上的实验表明,LogCoT在Accuracy、Macro-F1、Weighted


WPS文字如何合并多个文档:两种方法
揭老师高效办公9/30/2025

要合并多个Word文档,使用WPS文字有两种方法,一种是插入附件,引用附件中的文字,会把所有文档中的文字依次合并。第二种方式需要会员,使用WPS的“文档合并拆分”应用,每个文档都会从新的一页开始插入。


老题新解|十进制转二进制
程序员莫小特2025/10/10

《信息学奥赛一本通》第160题:十进制转二进制 题目描述 给定一个十进制整数 n n n,请将其转换为对应的二进制表示,并输出。 输入格式 输入包含一行,一个整数 n

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0