news 2026/10/1 1:14:34

从curl到Hey:如何把一个调试请求改造成可复用的压测用例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从curl到Hey:如何把一个调试请求改造成可复用的压测用例

从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):

  1. Summary:总耗时、最快/最慢/平均响应时间、Requests/sec(每秒处理请求数)
  2. Response time histogram:响应时间分布直方图,肉眼就能看出延迟是「尖峰」还是「长尾」
  3. Latency distribution:50% / 75% / 90% / 95% / 99% 等百分位延迟——排障时优先看 P99
  4. Details:把单次请求拆成 DNS 解析、TCP 建连、请求写出、等待响应、读取响应五个阶段,快速定位瓶颈在哪个环节
  5. Status code distribution:状态码分布,一眼发现 4xx/5xx 是否异常增多

第四步:把用例沉淀下来,持续对比

压测用例的价值在于复用。两个实用技巧:

1. 导出 CSV 便于二次分析

hey -o csv -z 30s https://api.example.com/orders > run1.csv

CSV 每行包含单次请求的各阶段耗时与状态码,方便和上一轮结果对比,量化新版本改动的影响。

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 压测用例,只需四步:

  1. 拆分要素:方法、请求头、请求体对应-m、-H、-d
  2. 选定模式:总量模式-n -c或持续模式-z,必要时加-q限流
  3. 读报告:关注 Requests/sec、P99 延迟和各阶段耗时分布
  4. 沉淀复用:-o csv留档对比,Docker 固化环境

一条命令即可从「调通了」走向「量得准」,这就是 hey 作为 HTTP 压测工具的核心价值。

【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 1:13:55

Linux内存排查利器:/proc/pid/smaps核心字段解析与实战

有一类内存问题&#xff0c;会把一个Linux老兵逼到挠头&#xff1a;free 报告可用内存只剩几百MB&#xff0c;top 按 RES 排序杀出一个进程&#xff0c;数字大得吓人。你点开 pmap -x&#xff0c;看到的却是一长串十六进制地址&#xff0c;根本读不出信息。我早期排查这类问题也…

作者头像 李华
网站建设 2026/10/1 1:12:44

业余无人机图像数据集实战指南:噪声即特征,落地即检验

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/1 1:11:55

软件测试全流程解析:从测试用例到自动化落地

1. 为什么软件测试是关键环节从入行到现在&#xff0c;我见过太多把软件测试当成“点点点”的团队&#xff0c;也见过因为测试缺位而事故频发的项目。甚至很多刚转行的新人会问&#xff1a;“测试不就是帮开发找茬吗&#xff1f;有什么技术含量&#xff1f;”每次听到这种话&am…

作者头像 李华
网站建设 2026/10/1 1:11:26

ipmitool监控服务器电源与风扇:从命令入门到故障排查

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/1 1:11:25

冬虫夏草YOLO田间检测数据集与实战调优指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/1 1:11:24

C/C++ sizeof运算符详解:编译期求值、数组指针陷阱与内存对齐

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华