PerfTest: 压测工具界的“瑞士军刀”,原生支持HTTP/1/2/3、Websocket,同时支持实时监控

前言

在每一位后端工程师的工具箱里,总有那么几款压测工具常年"上岗"。当我们想快速验证一个接口性能时,可能会随手敲下 ab;当追求极致的单机 QPS 时,wrk 往往是我们的不二之选;而当需要编写复杂的测试场景时,k6 以其强大的脚本能力和开发者友好的生态,成为了越来越多团队的选择。

这些工具都很出色,但技术的浪潮总在向前。HTTP/3 协议逐渐从"未来"变为"现在",WebSocket 的应用场景也愈发广泛。同时,在 DevOps 理念深入人心的今天,一次性的、孤立的压测报告已经不够了,我们更渴望能将性能数据实时地融入到整个可观测性体系中。

这时,我们不禁会想:有没有一款工具,既能像 ab 一样简单直接,又能覆盖 HTTP/3 和 WebSocket 等现代协议,还能像 k6 那样轻松地与监控系统(如 Prometheus)联动?

答案是肯定的。今天,我们就来聊聊一款潜力新星------perftest

PerfTest 是什么?

perftest 是一个集成在 Go开发框架Sponge 中的轻量级、高性能压测工具。你可以把它理解成一个为现代网络协议和云原生监控而生的"特种兵"。

它的核心亮点,说起来很简单直接:

  • 协议全能:原生支持 HTTP/1.1、HTTP/2、HTTP/3 和 WebSocket。
  • 模式灵活 :无论是想打满固定的请求数(--total),还是想在规定时间内持续施压(--duration),它都能满足。
  • 监控无缝集成 :这是它的"杀手锏"。perftest 可以将压测过程中的实时指标(QPS、延迟等)直接推送到 Prometheus 或任何自定义的 HTTP 端点,让你的 Grafana 大盘能立刻"动起来"。
  • 简单纯粹:所有功能都通过清晰的命令行参数实现,学习成本极低。

什么场景下应该用 PerfTest?

perftest 在某些特定场景下,它可能是你最高效的选择:

  1. 拥抱未来,测试前沿协议 :当你的服务已经支持 HTTP/3 或者正在使用 gRPC-Web (其底层依赖 HTTP/2 或更高版本),perftest 可以让你轻松验证新技术带来的性能收益。
  2. 实时通信服务压测 :你的应用有聊天室、实时行情、协同编辑等 WebSocket 场景吗?perftest 可以模拟大量客户端连接和高频消息轰炸,真实检验你的后端承载能力。
  3. CI/CD 里的"性能哨兵" :在你的自动化部署流水线中加入 perftest 的一个步骤。每次代码合并后,自动对核心接口进行一轮基准测试,并将数据推送到 Prometheus。通过设定告警,就能在性能发生衰退时第一时间发现问题。
  4. 快速、简单的性能验证 :不想为了一个简单的接口测试而去写一整个 k6 脚本?perftest 的命令行模式让你可以在几十秒内完成一次标准的并发测试,并拿到一份详尽的报告。

上手体验

perftest 基于 Go 开发,安装过程就是一行命令的事(前提是你已安装 Go 环境):

bash 复制代码
go install github.com/go-dev-frame/sponge/cmd/sponge@latest

安装后,我们来几个实际的例子感受一下。

HTTP 压测示例

压测一个 HTTP/1.1 接口,模拟 50 个并发,共发送 100 万个请求:

bash 复制代码
sponge perftest http \
    --worker=50 \
    --total=1000000 \
    --url=http://localhost:8080/user/1

如果想进行一个持续 1 分钟的压测,可以这样做:

Bash 复制代码
sponge perftest http \
    --worker=50 \
    --duration=1m \
    --url=http://localhost:8080/user/1

切换到 HTTP/2 或 HTTP/3 压测,只需将子命令 http 替换为 http2http3 即可,其他参数保持不变,简单直观。

如果想实时推送统计数据给 Prometheus,需要添加 2 个参数 --prometheus-job-namepush-url

压测结束后,你会得到一份类似这样的详细报告:

yaml 复制代码
========== HTTP/1.1 Performance Test Report ==========

[Requests]
  • Total Requests:       1000000
  • Successful:             1000000 (100%)
  • Failed:                    0
  • Total Duration:        8.55 s
  • Throughput (QPS):  116914.5 req/sec

[Latency]
  • Average:               0.42 ms
  • Minimum:             0 ms
  • Maximum:            22.41 ms
  • P25:                     0 ms
  • P50:                     0.51 ms
  • P95:                     1.18 ms

[Data Transfer]
  • Sent:                   25000000 Bytes
  • Received:             49000000 Bytes

[Status Codes]
  • 200:                    1000000

[Push Statistics]
  • ok

如果认为命令行测试较为繁琐,我们还提供一种更简便的测试方式:您只需在页面中填写相应参数即可开始测试。参数设置与命令行完全一致,并且同样支持随时终止测试。具体步骤如下:

  1. 打开 sponge UI 页面

    bash 复制代码
    sponge run
  2. 在左边菜单点击【Public】--> 【生成性能测试报告】,然后填写参数进行测试,如下图所示:

模拟 WebSocket 消息风暴

现在,我们模拟 100 个用户同时在线聊天,每个用户每秒发送 2 条消息(间隔 500ms),持续 5 分钟。

bash 复制代码
sponge perftest websocket \
    --worker=100 \
    --duration=5m \
    --send-interval=500ms \
    --body={\"event\":\"message\",\"payload\":\"你好,perftest!\"} \
    --url=ws://localhost:8080/ws

测试结束后,终端会清晰地告诉你连接成功率、消息收发总量和吞吐量,所有关键数据一目了然。

横向对比:perftest vs. ab, wrk, k6

是骡子是马,拉出来遛遛。perftest 与几位"前辈"相比,究竟处在什么位置?

特性 / 工具 ab (ApacheBench) wrk / wrk2 k6 perftest
核心定位 简单验证 极限性能 开发者体验与复杂场景 现代协议与监控集成
HTTP/1.1
HTTP/2 ❌ (需特定分支)
HTTP/3 (QUIC) ❌ (社区扩展) (原生)
WebSocket ❌ (需脚本)
实时数据推送 ✅ (生态丰富) (原生)
脚本能力 强 (Lua) 非常强 (JavaScript)
上手难度 极低 中等 中等 极低

深度解析

  • ab (The Old Guard)ab 就像一把老锤子,简单、可靠,但仅限于敲钉子(HTTP/1.1)。

  • wrk (The Speedster)wrk 是性能界的"速度之王"。它利用事件驱动模型能榨干机器的每一分性能,通过 Lua 脚本也能实现一定的定制化。但它的短板在于协议支持的滞后,原生不支持 HTTP/2 及以上协议。

  • k6 (The Powerhouse)k6 是目前最受开发者欢迎的压测工具之一。它用 JavaScript 写测试脚本,生态非常完善,可以模拟非常复杂的真实用户行为。在协议支持上,它覆盖了 HTTP/1.1, HTTP/2, WebSocket 和 gRPC。然而,对于 HTTP/3,k6 目前仍需要通过社区扩展来支持。

  • perftest (The Specialist)perftest 的定位非常清晰,在两个维度上做到极致:

    1. 最前沿的协议支持 :当你的团队在探索 HTTP/3 带来的性能提升时,perftest 是市面上为数不多能让你"开箱即用"进行测试的工具。
    2. 最原生的监控集成 :它没有像 k6 那样构建一个庞大的输出生态系统,而是直击痛点,原生支持了当前云原生领域的事实标准------Prometheus。这种"少即是多"的哲学,让集成工作变得异常简单。

结论

perftest 是为开发者和测试工程师提供了一个更现代、更聚焦、更贴近云原生生态的选择。

当你的需求是:

  • 快速验证和对比最新网络协议(HTTP/3、WebSocket)的性能表现。
  • 将性能测试与 Prometheus 监控系统无缝打通,实现压测过程的可视化和自动化。
  • 在 CI/CD 中进行轻量级的性能回归测试。
  • 寻找一款比 ab 强得多,又比 k6 轻得多的命令行工具。

那么,perftest 绝对值得你一试。它就像一把锋利的"手术刀",精准地切入了现代 Web 性能测试中最需要、也最前沿的那部分需求。在工具日趋复杂的今天,这样一款"小而美"的利器,或许正是你一直在寻找的答案。


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

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

相关推荐
年轻的麦子16 小时前
Go 框架学习之:go.uber.org/fx项目实战
后端·go
粘豆煮包18 小时前
脑抽研究生Go并发-1-基本并发原语-下-Cond、Once、Map、Pool、Context
后端·go
程序员爱钓鱼1 天前
Go语言实战案例-实现简易定时提醒程序
后端·google·go
岁忧2 天前
(LeetCode 面试经典 150 题) 200. 岛屿数量(深度优先搜索dfs || 广度优先搜索bfs)
java·c++·leetcode·面试·go·深度优先
程序员爱钓鱼2 天前
Go语言实战案例- 命令行参数解析器
后端·google·go
墩墩分墩2 天前
【Go语言入门教程】 Go语言的起源与技术特点:从诞生到现代编程利器(一)
开发语言·后端·golang·go
程序员爱钓鱼2 天前
Go语言实战案例- 开发一个ToDo命令行工具
后端·google·go
科技树支点2 天前
无GC的Java创新设计思路:作用域引用式自动内存管理
java·python·go·web·编程语言·编译器
qq_172805592 天前
GO : cannot find module
学习·go