Hey压测中10种最常遇到的错误及修复办法:error distribution排错速查
【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey
用hey 压测时,最让人头疼的不是"压不动",而是满屏的报错不知道从哪查起。其实 hey 会把所有请求失败按错误类型聚合成error distribution(错误分布)输出在报告末尾,它就是压测排错的第一现场。本文整理 hey 压测中10 种最常遇到的错误,给出每条报错的含义与最快修复办法,附带一张可直接对照的速查表,帮助新手 3 分钟定位问题。
先学会读 hey 的错误报告:error distribution 怎么看
hey 跑完(或中途停止)后会输出一份 Summary 报告,其中包含两块与"错误"直接相关的内容:
| 报告区块 | 含义 | 排错价值 |
|---|---|---|
Status code distribution | 各 HTTP 状态码出现次数,如[200] 190 responses | 发现 4xx/5xx 业务错误 |
Error distribution | 各错误信息出现次数,如[3] dial tcp: ... | 发现连接、超时等网络层错误 |
两点关键认知:
- 只有真正没收到 HTTP 响应的请求才会进入
Error distribution;收到 502、503 这类"成功返回的错误页"只会出现在状态码分布里。 Error distribution区块仅在有错误时才显示。它的模板位于 requester/print.go,统计逻辑在 requester/report.go:每遇到一次失败就errorDist[错误文本]++,所以数字就是该错误的精确发生次数。
看到[50] Get "https://...": context deadline exceeded这种行,先数次数、再按本文下面的速查表定位原因,即可覆盖绝大多数场景。
10种最常遇到的错误及修复办法
一、还没开跑就报错:参数类错误
这类错误在 hey 启动阶段直接打印并退出(校验代码见 hey.go),修复起来最快。
1.-n and -c cannot be smaller than 1.
-n(总请求数)或-c(并发数)传了 0、负数甚至空值。
🔧修复:两者都至少为 1,例如hey -n 100 -c 10 <url>。默认值是-n 200 -c 50,直接省略这两个参数即可。
2.-n cannot be less than -c.
总请求数小于并发数,意味着有 worker 分不到任何请求。
🔧修复:保证-n ≥ -c。比如-c 100时至少写-n 100。
3.-c cannot be smaller than 1.
使用-z 30s按时长压测时触发的校验:时长模式下并发数必须为正。
🔧修复:加上-c且大于 0,例如hey -c 50 -z 30s <url>。
4.could not parse the provided input; input = xxx
-H请求头或-a认证参数的格式不对。解析规则见 hey.go:
-H必须是名称: 值形式(冒号不能少、不能放中文冒号):-H "Authorization: Bearer token"-a必须是用户名:密码形式:-a "admin:123456"
🔧修复:检查引号是否成对、冒号是否为英文半角。
5.Flag '-h' is deprecated, please use '-H' instead.
小写-h是旧版加请求头的参数,已废弃(见 hey.go)。
🔧修复:改用大写-H。另外,任何未定义的参数(如-m POSTT拼错、-t 20s漏空格)都会以flag provided but not defined形式报出,对照 README.md 的 Usage 段落核对拼写即可。
6.missing protocol scheme或parse "xxx": ...类 URL 报错
URL 缺少协议头,比如直接写了hey example.com:8080/api。
🔧修复:补全http://或https://。
二、跑起来了但大量失败:网络连接类错误
这类错误会实时计入Error distribution,是新手压测内网/测试环境时最常撞见的。
7.dial tcp: lookup xxx.com: no such host
DNS 解析失败,hey 根本拿不到目标 IP。
🔧修复:
- 确认域名拼写正确、在压测机上
ping或nslookup该域名能通; - 内网域名需要配 hosts 或内网 DNS 时,检查压测机的解析配置;
- 临时绕开 DNS:直接用 IP 压测,并配合
-host参数补上正确的 Host 头。
8.dial tcp 127.0.0.1:8080: connect: connection refused
TCP 连接被拒绝:服务没启动、端口不对,或防火墙直接 RST。
🔧修复:
- 先确认目标服务确实监听了对应端口(
ss -lntp/netstat -anp); - 检查压测机与目标机之间的安全组、iptables 是否放行该端口;
- 目标写的是本机 IP 时,确认服务没有只绑定在特定网卡上。
9.TLS handshake error/remote error: tls: ...
HTTPS 场景下握手阶段失败。注意 hey 默认设置了跳过证书校验(requester/requester.go 中InsecureSkipVerify: true),所以"自签证书报错"反而少见——常见的真问题是:
- 服务端要求客户端证书(mTLS)而 hey 不提供,这类压测场景建议改用支持双向认证的压测方式;
- 用了
-h2强制 HTTP/2,但服务端 ALPN 协商有问题,可去掉-h2对比验证。
三、压着压着开始报错:执行超时类错误
10.Get "https://...": context deadline exceeded (Client.Timeout exceeded ...)
单请求等待响应超过-t秒(默认 20s)后被强杀,超时逻辑见 requester/requester.go。这是高并发压测时Error distribution里的头号角色。
🔧修复分两种情况:
- 偶发少量:目标服务偶发慢查询,适当调大
-t 60再看分布是否收敛; - 大量出现且错误数随并发线性增长:说明服务端已经扛不住当前
-c,这不是 hey 的错,而是压测目标——降低并发找到拐点,或扩容后复测。
💡 补充:长时间高并发压测偶发
too many open files时,先调大压测机文件描述符上限(ulimit -n 65535)再跑,否则错误分布会被压测机自身"污染"。
10种错误速查表
| # | 错误关键词 | 一句话原因 | 最快修复 |
|---|---|---|---|
| 1 | cannot be smaller than 1 | -n/-c传了 0 或负数 | 省略参数用默认值 |
| 2 | -n cannot be less than -c | 请求总数 < 并发数 | 保证-n ≥ -c |
| 3 | -c cannot be smaller than 1 | -z模式下并发非法 | 显式传-c ≥ 1 |
| 4 | could not parse the provided input | -H/-a格式不对 | 用英文冒号Name: value |
| 5 | Flag '-h' is deprecated/not defined | 参数拼错或用了废弃参数 | 对照 README.md Usage 核对 |
| 6 | missing protocol scheme | URL 缺http(s):// | 补全协议头 |
| 7 | no such host | DNS 解析失败 | 修 hosts/DNS 或改用 IP +-host |
| 8 | connection refused | 端口没监听/防火墙拦截 | 查服务状态与防火墙规则 |
| 9 | TLS handshake error | TLS/HTTP2 协商失败 | 去掉-h2对比、查服务端要求 |
| 10 | context deadline exceeded | 超过-t超时 | 调大-t或降低-c |
排错实践:3个让 error distribution 更可信的小技巧
- 先小后大:正式压测前先用
hey -n 20 -c 2 -z 5s级别跑一轮冒烟,把参数类错误(第 1~6 类)提前暴露。 - 导出 CSV 留证:
-o csv会把每个请求的响应时间、DNS/建连/读写耗时、状态码逐行输出(列定义见 requester/print.go),错误请求的时间点可与其他请求的延迟毛刺互相印证。 - 错误分布 + 状态码分布一起看:
Error distribution是 0 但状态码里冒出大量[503],问题在服务端而非网络——别只盯着报错区下结论。
把这张速查表存下来,下次 hey 压测报错时,先找Error distribution里的关键词、再对照上表,基本都能在 3 分钟内定位到根因。
【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考