继性能测试入门及JMH、JMeter、Gatling、ab、Siege、Wrk、Locust、sysbench工具简介,本文继续汇总介绍几款性能测试工具。
Vegeta
用Go语言编写的开源(GitHub,25.1K Star,1.4K Fork)HTTP负载测试工具和库,提供命令行工具和编程接口,让开发者能够快速评估服务的性能表现。官方文档。

优势:
- 高性能:基于Go并发,轻松达到10万QPS
- 简单易用:命令行直接使用,无需GUI
- 结果丰富:支持多种格式报告(JSON、直方图等)
- 功能完整:支持HTTP/2、自定义请求头、Keep-Alive、精确的QPS控制
- 可编程:可作为Go库集成到程序中
适用场景
- API性能测试
- 容量规划评估
- 性能瓶颈定位
- 发布前压测
- 持续性能监控
特性
| 特性 | 说明 | 应用场景 |
|---|---|---|
| 恒定速率 | 精确控制QPS | 模拟真实流量 |
| 持续时间 | 支持时间/请求数控制 | 灵活测试策略 |
| 自定义请求 | Headers、Body、Method | 复杂接口测试 |
| Keep-Alive | HTTP连接复用 | 真实网络环境 |
| HTTP/2支持 | 现代协议 | 新版服务测试 |
| 结果导出 | JSON/CSV/直方图 | 数据分析 |
| 实时监控 | 流式输出结果 | 即时观察 |
| 分布式压测 | 多机协同 | 超大规模测试 |
对比
| 工具 | 语言 | 性能 | 易用性 | 报告 | 适用场景 |
|---|---|---|---|---|---|
| Vegeta | Go | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | HTTPAPI测试 |
| ApacheBench | C | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | 简单压测 |
| wrk | C | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ | 高并发测试 |
| JMeter | Java | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐⭐ | GUI场景测试 |
| Locust | Python | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 分布式压测 |
| K6 | Go | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 现代化压测 |
实战
官方提供超多安装方式:
bash
# Mac
brew install vegeta
# Linux
wget https://github.com/tsenart/vegeta/releases/download/v12.11.1/vegeta_12.11.1_linux_amd64.tar.gz
tar -xzf vegeta_12.11.1_linux_amd64.tar.gz
# Windows
scoop install vegeta
# 基于Go
go install github.com/tsenart/vegeta@latest
# 基于源码
git clone https://github.com/tsenart/vegeta
cd vegeta
make vegeta
mv vegeta ~/bin
命令行使用示例:
bash
# 以100 QPS的速率压测30秒
echo "GET http://localhost:8080/api/users" | vegeta attack -rate=100 -duration=30s -max-workers=10 -keepalive=true -timeout=5s -max-body=0 | vegeta report
# 输出结果
Requests [total, rate, throughput] 3000, 100.03, 99.98
Duration [total, attack, wait] 30.001s, 29.99s, 11.232ms
Latencies [min, mean, 50, 90, 95, 99, max] 8.523ms, 15.234ms, 14.123ms, 19.456ms, 22.123ms, 28.234ms, 45.123ms
Bytes In [total, mean] 450000, 150.00
Bytes Out [total, mean] 0, 0.00
Success [ratio] 100.00%
Status Codes [code:count] 200:3000
查看报告:
bash
# 生成文本报告
vegeta report results.bin
vegeta report -type=json results.bin
# 生成直方图(HTML)
vegeta report -type='hist[0,5ms,10ms,20ms,50ms,100ms]' results.bin
# 生成曲线图
cat results.bin | vegeta plot > plot.html
Go SDK集成
go
package main
import (
"fmt"
"time"
vegeta "github.com/tsenart/vegeta/v12/lib"
)
func main() {
rate := vegeta.Rate{Freq: 100, Per: time.Second}
duration := 30 * time.Second
targeter := vegeta.NewStaticTargeter(vegeta.Target{
Method: "GET",
URL: "http://localhost:8080/api/users",
})
attacker := vegeta.NewAttacker()
var metrics vegeta.Metrics
for res := range attacker.Attack(targeter, rate, duration, "Test") {
metrics.Add(res)
}
metrics.Close()
fmt.Printf("99th percentile: %s\n", metrics.Latencies.P99)
fmt.Printf("Success rate: %.2f%%\n", metrics.Success*100)
}
进阶示例
bash
# 梯度压测:从小到大逐步增加压力
for rate in 10 50 100 200 500 1000; do
echo "GET http://api.example.com" | \
vegeta attack -rate=$rate -duration=10s | \
vegeta report | grep "Success"
done
# 实时监控延迟
echo "GET http://localhost:8080" | \
vegeta attack -rate=100 -duration=0 | \
vegeta encode | \
jq -r '.latency / 1000000 | tostring + " ms"'
# 筛选失败的请求
vegeta report results.bin | jq 'select(.code != 200)'
# 分布式压测
# 机器1
echo "GET http://api.example.com" | vegeta attack -rate=1000 -duration=1m > results1.bin
# 机器2
echo "GET http://api.example.com" | vegeta attack -rate=1000 -duration=1m > results2.bin
# 合并结果
cat results1.bin results2.bin | vegeta report
持续集成
yml
# .gitlab-ci.yml
performance_test:
stage: test
script:
- echo "GET https://staging.example.com/api/health" |
vegeta attack -rate=100 -duration=10s |
vegeta report -type=json > report.json
- |
success=$(jq '.success' report.json)
if [ $(echo "$success < 0.99" | bc) -eq 1 ]; then
echo "Performance test failed: success rate $success"
exit 1
fi
监控和告警
go
// 结合Prometheus监控
func runLoadTest() {
rate := vegeta.Rate{Freq: 100, Per: time.Second}
targeter := vegeta.NewStaticTargeter(vegeta.Target{
Method: "GET",
URL: "http://localhost:8080",
})
attacker := vegeta.NewAttacker()
var metrics vegeta.Metrics
for res := range attacker.Attack(targeter, rate, 10*time.Second, "Test") {
metrics.Add(res)
// 上报到Prometheus
latencyGauge.Set(res.Latency.Seconds())
requestCounter.Inc()
if res.Code != 200 {
errorCounter.Inc()
}
}
}
Sponge-PerfTest
一个集成在开源(GitHub)Go开发框架Sponge中的轻量级、高性能压测工具。未来将支持分布式集群压测,只需在单机基础上增加一个协调控制节点即可。
核心:
- 协议全能:原生支持HTTP/1.1、HTTP/2、HTTP/3和WebSocket
- 模式灵活:支持固定请求数(
--total),在规定时间内持续施压(--duration) - 监控无缝集成:可将压测过程中的实时指标(QPS、延迟等)直接推送到Prometheus或任何自定义HTTP端点
- 简单纯粹:基于命令行,学习成本极低
| 对比项 | ab(ApacheBench) | wrk/wrk2 | k6 | perftest |
|---|---|---|---|---|
| 核心定位 | 简单验证 | 极限性能 | 开发者体验与复杂场景 | 现代协议与监控集成 |
| HTTP/1.1 | ✅ | ✅ | ✅ | ✅ |
| HTTP/2 | ❌ | ❌(需特定分支) | ✅ | ✅ |
| HTTP/3(QUIC) | ❌ | ❌ | ❌(社区扩展) | ✅(原生) |
| WebSocket | ❌ | ❌(需脚本) | ✅ | ✅ |
| 实时数据推送 | ❌ | ❌ | ✅(生态丰富) | ✅(原生) |
| 脚本能力 | 无 | 强(Lua) | 非常强(JavaScript) | 无 |
| 上手难度 | 极低 | 中等 | 中等 | 极低 |
解读:
- ab:简单、可靠,但仅限于HTTP/1.1
- wrk:极致性能,利用事件驱动模型能榨干机器的每一分性能,通过Lua脚本也能实现一定定制化。但原生不支持HTTP/2及以上协议。
- k6:用JavaScript写测试脚本,生态完善,可以模拟非常复杂的真实用户行为。协议支持HTTP/1.1、HTTP/2、WebSocket和gRPC。对于HTTP/3,目前仍需要通过社区扩展来支持,并非开箱即用。
- perftest:在两个维度上做到极致:
- 协议支持:HTTP/3
- 原生监控集成:支持Prometheus
实战
安装:go install github.com/go-dev-frame/sponge/cmd/sponge@latest
示例
bash
# 50并发,100w请求;HTTP、HTTP/2、HTTP/3支持
sponge perftest http \
--worker=50 \
--total=1000000 \
--url=http://localhost:8080/user/1
报告
========== 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
WebSocket支持
bash
sponge perftest websocket \
--worker=100 \
--duration=5m \
--send-interval=500ms \
--body={\"event\":\"message\",\"payload\":\"你好,perftest!\"} \
--url=ws://localhost:8080/ws
参数:
--duration:如1m、2h--prometheus-job-name:集成Prometheuspush-url:
启动UI页面:sponge run
Hurley
用Rust写的、开源(GitHub,14 Star)类似于cURL的HTTP客户端+命令行压测工具:
- 支持所有常用Method,常用参数风格跟cURL非常接近,如
-L表示自动跟随301/302重定向,支持超时设置、代理、自定义CA等,迁移成本很低; - 用于压测:
-c concurrency表示并发连接数,-n number设置总请求数。支持基于数据集的随机化压测,非常适合模拟真实用户行为,避免缓存预热导致的假象。报告比很多传统工具更关注尾部延迟,输出的统计信息对SLA敏感型业务非常有参考价值。
技术选型
- 异步运行时:
tokio - HTTP 客户端底层:基于
reqwest大量定制 - 高精度延迟统计: hdrhistogram (HDR Histogram,工业级延迟统计库)
- 错误处理: thiserror + Rust 强类型系统
实战
基于cargo安装:cargo install hurley
基于源码安装:
bash
git clone https://github.com/dursunkoc/hurley.git
cd hurley
cargo build --release
生成的二进制文件在target/release/hurley。