压测工具:Vegeta、PerfTest、Hurley

性能测试入门及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:在两个维度上做到极致:
    1. 协议支持:HTTP/3
    2. 原生监控集成:支持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:集成Prometheus
  • push-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

相关推荐
Echoo华地2 个月前
Gatling压测案例
java·jmeter·压力测试·并发·scale·压测·gatling
装不满的克莱因瓶4 个月前
Java高并发异步请求实战,Jmeter暴力压测下的解决方案
jmeter·线程池·多线程·并发·resttemplate·qps·压测
老友@4 个月前
JMeter 在 Linux 环境下进行生产级性能压测的完整实战指南
java·linux·jmeter·性能优化·系统架构·压测·性能瓶颈
大千AI助手5 个月前
Web 接口性能测试最佳实践:从“压一压”到“压明白”
python·api·性能测试·测试·性能·压测·大千ai助手
檀越剑指大厂5 个月前
【压测系列】响应时间的 99%线
压测
cui_win6 个月前
MySQL 压测实战:sysbench 从入门到精通
数据库·mysql·压测·sysbench
cui_win6 个月前
Prometheus实战教程 - mysql监控
mysql·prometheus·压测
布朗克1686 个月前
Apipost、Apifox、Postman 压测功能全面性对比
压测·接口工具
SunnyRivers7 个月前
通用大模型压测报告工具
大模型·报告·压测