拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Hey压测中10种最常遇到的错误及修复办法:error distribution排错速查

Hey压测中10种最常遇到的错误及修复办法:error distribution排错速查

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种错误速查表

#错误关键词一句话原因最快修复
1cannot 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
4could not parse the provided input-H/-a格式不对用英文冒号Name: value
5Flag '-h' is deprecated/not defined参数拼错或用了废弃参数对照 README.md Usage 核对
6missing protocol schemeURL 缺http(s)://补全协议头
7no such hostDNS 解析失败修 hosts/DNS 或改用 IP +-host
8connection refused端口没监听/防火墙拦截查服务状态与防火墙规则
9TLS handshake errorTLS/HTTP2 协商失败去掉-h2对比、查服务端要求
10context deadline exceeded超过-t超时调大-t或降低-c

排错实践:3个让 error distribution 更可信的小技巧

  1. 先小后大:正式压测前先用hey -n 20 -c 2 -z 5s级别跑一轮冒烟,把参数类错误(第 1~6 类)提前暴露。
  2. 导出 CSV 留证:-o csv会把每个请求的响应时间、DNS/建连/读写耗时、状态码逐行输出(列定义见 requester/print.go),错误请求的时间点可与其他请求的延迟毛刺互相印证。
  3. 错误分布 + 状态码分布一起看:Error distribution是 0 但状态码里冒出大量[503],问题在服务端而非网络——别只盯着报错区下结论。

把这张速查表存下来,下次 hey 压测报错时,先找Error distribution里的关键词、再对照上表,基本都能在 3 分钟内定位到根因。

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

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

返回列表