从curl到Hey:如何把一个调试请求改造成可复用的压测用例
【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey
Hey 是一个开源的 HTTP 压测工具(HTTP load generator),定位是 ApacheBench(ab)的替代品。它能把你平时用 curl 调试好的单个请求,改造成可复用的压测用例:并发发压、限流、输出响应时间直方图和百分位延迟分布。
为什么选择 hey 做压测工具?
相比 ApacheBench,hey 的优势在于:
- 上手快:一条命令即可对指定 URL 发起压测,默认 200 个请求、50 个并发 worker
- 统计细:内置响应时间直方图、百分位延迟分布、DNS/TCP/读写各阶段耗时
- 贴近真实:支持自定义请求头、POST body、Basic 认证、HTTP/2、限流 QPS
- 轻量部署:Go 语言编写,无 CGO 依赖,可直接编译或用 Docker 运行,见 Dockerfile 与 Makefile
如果你还没有安装,可以克隆源码后自行构建:
git clone https://gitcode.com/GitHub_Trending/he/hey cd hey go build -o hey hey.go第一步:把 curl 调试请求拆成三个部分
假设你调试接口时常用的 curl 命令是这样的:
curl -X POST https://api.example.com/orders \ -H "Content-Type: application/json" \ -H "Authorization: Bearer <token>" \ -d '{"sku":"A-101","qty":2}'把它拆成三要素,正好对应 hey 的参数组(完整参数定义见 hey.go):
| curl 要素 | 对应 hey 参数 | 说明 |
|---|---|---|
-X POST | -m POST | 指定 HTTP 方法 |
-H "..." | -H "..."(可重复) | 自定义请求头 |
-d '{...}' | -d "..." | 请求体内容 |
| 内容类型 | -T | 默认text/html,JSON 需改为application/json |
改造后的第一条 hey 压测用例:
hey -m POST \ -T "application/json" \ -H "Authorization: Bearer <token>" \ -d '{"sku":"A-101","qty":2}' \ -n 10 -c 2 \ https://api.example.com/orders💡 小贴士:如果请求体是文件(比如一大段 JSON),用
-D ./payload.json从文件读取,比写在命令行更干净。
第二步:选择压测模式——总请求数还是持续时长?
hey 提供两种典型的压测方式:
固定请求数模式(-n + -c)
-n:总请求数(默认 200)-c:并发 worker 数(默认 50),注意-n不能小于-c
适合:回归验证、版本对比等需要「同样总量」的场景。
固定时长模式(-z)
hey -z 30s -c 50 https://api.example.com/orders按持续时间压测(如 30 秒、3 分钟),此时-n会被忽略。适合:观察服务在持续流量下的稳定性。
限流压测(-q)
如果只想以 10 QPS/worker 的温和速率压测:
hey -q 10 -c 5 -z 30s https://api.example.com/orders更多可选项(超时-t、HTTP/2-h2、代理-x等)都在 README.md 的 Usage 一节里有完整说明。
第三步:看懂 hey 的输出报告
压测结束后,hey 会打印一份人类可读的摘要报告(报告模板见 requester/print.go,统计逻辑见 requester/report.go):
- Summary:总耗时、最快/最慢/平均响应时间、Requests/sec(每秒处理请求数)
- Response time histogram:响应时间分布直方图,肉眼就能看出延迟是「尖峰」还是「长尾」
- Latency distribution:50% / 75% / 90% / 95% / 99% 等百分位延迟——排障时优先看 P99
- Details:把单次请求拆成 DNS 解析、TCP 建连、请求写出、等待响应、读取响应五个阶段,快速定位瓶颈在哪个环节
- Status code distribution:状态码分布,一眼发现 4xx/5xx 是否异常增多
第四步:把用例沉淀下来,持续对比
压测用例的价值在于复用。两个实用技巧:
1. 导出 CSV 便于二次分析
hey -o csv -z 30s https://api.example.com/orders > run1.csvCSV 每行包含单次请求的各阶段耗时与状态码,方便和上一轮结果对比,量化新版本改动的影响。
2. 用 Docker 固定压测环境
项目自带 Dockerfile,构建出的镜像极小且免安装,保证团队内压测环境一致:
docker build -t hey . docker run --rm hey -z 30s https://api.example.com/orders常见坑与注意事项 ⚠️
-n小于-c会直接报错退出,参数校验逻辑见 hey.go- 指定
-z后-n失效,别以为两者叠加生效 - 发 JSON 时记得
-T application/json,默认内容类型是text/html,可能导致服务端直接拒绝 - 对生产环境压测请谨慎限流(
-q),并先与相关团队确认,避免误伤真实用户 - 需要关闭 keep-alive 或跟随重定向时,可用
-disable-keepalive、-disable-redirects控制行为
总结
把 curl 调试请求改造成 hey 压测用例,只需四步:
- 拆分要素:方法、请求头、请求体对应
-m、-H、-d - 选定模式:总量模式
-n -c或持续模式-z,必要时加-q限流 - 读报告:关注 Requests/sec、P99 延迟和各阶段耗时分布
- 沉淀复用:
-o csv留档对比,Docker 固化环境
一条命令即可从「调通了」走向「量得准」,这就是 hey 作为 HTTP 压测工具的核心价值。
【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考