4. 压测工具选型与对比:Locust、k6、wrk、vegeta 的优缺点及与 Prometheus 集成方式
在 Prometheus 数据驱动的容量压测巡检体系中,压测工具是流量注入的核心执行器。选型需综合考虑:脚本灵活性、分布式能力、指标暴露方式以及与 Prometheus 生态的集成成本。本节对 Locust、k6、wrk、vegeta 四款主流工具进行横向对比,并给出集成建议。
4.1 工具概览与核心定位
| 工具 | 语言/DSL | 协议支持 | 执行模型 | 核心定位 |
|---|---|---|---|---|
| Locust | Python | HTTP / WebSocket / gRPC(插件) | 事件驱动 + 协程 | 可编程、分布式、面向复杂业务场景 |
| k6 | JavaScript (ES6) | HTTP / gRPC / WebSocket / Browser | Go 协程 + JS 运行时 | 开发者体验、CI/CD 集成、性能测试即代码 |
| wrk | Lua(脚本) | HTTP / HTTPS | 多线程 + 事件循环 | 高并发、低资源、纯压测引擎 |
| vegeta | Go(CLI + 库) | HTTP / HTTPS | 多 worker 并发 | 简洁、可组合、管道式压测 |
选型提示: 如果你的巡检脚本需要复杂的业务逻辑(如登录态保持、动态参数、多步骤事务),优先考虑 Locust 或 k6;如果仅需对单一 API 端点进行高并发压力测试,wrk 或 vegeta 更轻量高效。
4.2 优缺点深度对比
| 维度 | Locust | k6 | wrk | vegeta |
|---|---|---|---|---|
| 脚本编写 | Python 原生,生态丰富,学习成本低 | JS 语法,内置 HTTP 库,门槛中等 | Lua 脚本,功能有限,调试不便 | Go 结构体定义,无脚本,仅 CLI 参数 |
| 并发模型 | 协程(gevent),单机可模拟数千用户 | Go 协程,单机性能极高 | 多线程 + epoll,单机性能最优 | 多 worker,性能稳定 |
| 分布式支持 | 原生支持(Master-Worker) | k6-operator(K8s)或 k6-cloud | 无原生支持,需外部编排 | 无原生支持,需外部编排 |
| 指标丰富度 | 内置请求/响应/用户数,可自定义 | 内置 40+ 指标,支持 Trend/Counter/Gauge | 仅延迟/吞吐量/错误率 | 延迟/吞吐量/状态码分布 |
| CI/CD 集成 | 需额外配置,CLI 支持 | 原生支持,CLI 输出 JUnit/JSON | 需脚本封装 | 管道友好,支持 stdout 输出 |
| 学习曲线 | 低(Python 基础) | 中(JS + 概念) | 中(Lua + 线程模型) | 低(CLI 参数) |
4.3 与 Prometheus 集成方式
四款工具与 Prometheus 的集成路径差异显著,直接影响巡检脚本的数据采集架构。
4.4 各工具集成详解
4.4.1 Locust + Prometheus(推荐用于复杂巡检)
Locust 通过 prometheus_exporter 插件暴露 /metrics 端点,Prometheus 可直接拉取。支持自定义指标注入。
# 安装插件
pip install locust prometheus-client
# 启动时加载插件
locust -f locustfile.py --web-host 0.0.0.0 \
--web-port 8089 \
--prometheus-exporter-port 9646
# Prometheus scrape 配置
scrape_configs:
- job_name: 'locust'
static_configs:
- targets: ['locust-host:9646']
4.4.2 k6 + Prometheus(推荐用于 CI/CD 巡检)
k6 内置 --out output-prometheus-pushgateway 选项,将指标推送到 Pushgateway,再由 Prometheus 拉取。
# 运行 k6 并推送指标
k6 run --out output-prometheus-pushgateway=http://pushgateway:9091 script.js
# k6 脚本示例(自动生成指标)
import http from 'k6/http';
import { check } from 'k6';
export default function () {
let res = http.get('http://test.k6.io');
check(res, { 'status is 200': (r) => r.status === 200 });
}
4.4.3 wrk + Prometheus(需自定义 Exporter)
wrk 输出结构化文本到 stdout,需通过自定义 Exporter 解析并转换为 Prometheus 指标。
# wrk 运行示例
wrk -t12 -c400 -d30s http://target:8080/api
# 输出格式(需解析)
Running 30s test @ http://target:8080/api
12 threads and 400 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 45.67ms 12.34ms 123.45ms 75.00%
Req/Sec 890.12 45.67 1234.56 80.00%
26703 requests in 30.00s, 3.45MB read
Requests/sec: 890.10
Transfer/sec: 117.67KB
4.4.4 vegeta + Prometheus(管道友好)
vegeta 支持 JSON 输出,可管道传递给自定义 Exporter 或直接写入文件后批量导入。
# vegeta 攻击并输出 JSON
echo "GET http://target:8080/api" | \
vegeta attack -rate=100 -duration=30s | \
vegeta report --type=json > results.json
# 自定义 Exporter 解析 results.json 并暴露 /metrics
集成避坑: wrk 和 vegeta 缺乏原生 Prometheus 集成,在巡检脚本中需要额外开发 Exporter 组件,增加维护成本。如果团队资源有限,优先选择 Locust 或 k6。
4.5 选型决策矩阵
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 复杂业务巡检(多步骤、动态参数) | Locust | Python 脚本灵活,Prometheus 插件成熟 |
| CI/CD 流水线集成 | k6 | 原生 Pushgateway 输出,JS 脚本可版本管理 |
| 单端点高并发压测 | wrk | 资源占用极低,单机性能最优 |
| 管道式批量压测 | vegeta | CLI 简洁,JSON 输出易于二次处理 |
| 分布式压测(多节点) | Locust | 原生 Master-Worker 架构,无需额外编排 |
4.6 本章小结
- Locust 和 k6 是 Prometheus 数据驱动巡检的首选,集成成本低、指标丰富。
- wrk 和 vegeta 适合作为轻量级补充工具,但需额外开发 Exporter。
- 在巡检脚本编排中,建议以 Locust 为主力工具,k6 作为 CI/CD 场景的备选,wrk/vegeta 用于特定性能基线验证。
- 无论选择哪种工具,都应确保压测指标(延迟、吞吐量、错误率、P99)能够被 Prometheus 采集,并纳入统一的巡检看板。