恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
Hey 压测工具参数校验全解:为什么 -n 不能小于 -c?-z 模式的 MaxInt32 小技巧
首页
资讯中心
/
Hey 压测工具参数校验全解:为什么 -n 不能小于 -c?-z 模式的 MaxInt32 小技巧
Hey 压测工具参数校验全解:为什么 -n 不能小于 -c?-z 模式的 MaxInt32 小技巧
发布时间:2026/10/3 20:07:51
Hey 压测工具参数校验全解为什么 -n 不能小于 -c-z 模式的 MaxInt32 小技巧【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey做 HTTP 压测时hey一个轻量级的 HTTP 负载生成工具常被视为 ApacheBench 的现代替代品的参数校验逻辑藏着两个值得细品的细节一是-n总请求数绝不能小于-c并发数否则直接报错退出二是指定-z时长模式后内部会把请求数悄悄替换成math.MaxInt32。这两处代码量极小却决定了压测能否跑起来、跑得久不久、会不会撑爆内存。本文用大白话带你逐个拆解。核心参数速览hey 的 -n、-c、-z 各管什么在讲校验之前先明确三个参数在 hey.go 中的定义与默认值参数含义默认值备注-n总请求数200整个压测要发出的请求总数-c并发 worker 数50同时跑的请求协程数量-z压测持续时长0不启用如-z 10s、-z 3m启用后-n被忽略校验规则一为什么 -n 不能小于 -c请求是如何分配给 worker 的hey 的并发模型是**均分制**总请求数按整除的方式切给每个并发 worker。在 requester/requester.go 的runWorkers中可以看到每个 worker 各自执行b.N / b.C次请求整数除法。这意味着一个硬性前提总请求数必须能喂饱每个 worker至少要 ≥ 并发数。否则会出现某个 worker 分到 0 次请求、白白启动却从不干活的情况统计结果也会失真。校验逻辑两道闸门hey.go 中的校验分两步第一道闸门-n和-c都不能小于 1——两者都是正整数才有意义第二道闸门-n不能小于-c违反则打印-n cannot be less than -c.并退出。if num 0 || conc 0 { usageAndExit(-n and -c cannot be smaller than 1.) } if num conc { usageAndExit(-n cannot be less than -c.) }这段校验失败后会调用 usageAndExit先打印错误提示再输出完整用法说明并以非零状态码退出——对 CI 脚本友好管道里不会静默失败。常见踩坑hey -n 20 -c 50最典型的错误就是照搬默认值却只改了-n$ hey -n 20 -c 50 https://example.com -n cannot be less than -c.-c默认是 50如果你只想发 20 个请求必须同时把并发降下来例如hey -n 20 -c 10。记住这个口诀先定并发再让总数 ≥ 并发。校验规则二-z 时长模式的 MaxInt32 小技巧问题按时长压测时总请求数怎么填指定-z 30s这类时长模式时程序不可能提前知道 30 秒内会发出多少个请求——它取决于服务器响应速度。但下游的 worker 循环仍然需要一个请求数上限来驱动。hey 的解法非常巧妙在 hey.go 中一旦检测到dur 0就直接把请求数num赋值为math.MaxInt32约 21 亿if dur 0 { num math.MaxInt32 if conc 0 { usageAndExit(-c cannot be smaller than 1.) } }用一个永远不会被耗尽的超大上限模拟无限循环真正决定停止的是时长定时器到点后 主函数中的定时器协程 调用w.Stop()向 stop 信号通道 发送停止信号每个 worker 在 每次循环开头检查该信号 后优雅退出。为什么敢用 MaxInt32内存不会爆炸吗这是很多读者会担心的点答案藏在两处封顶设计里统计缓冲区封顶结果通道容量取min(b.C*1000, maxResult)上限是常量 maxResult 100 万报告数组封顶report.go 中maxRes 1000000newReport 创建各切片时容量是min(n, maxRes)——即使n是 21 亿每个切片的初始容量也最多 100 万。所以MaxInt32在这里只是一个安全的无限哨兵值它大到不可能被请求计数追上而所有内存分配都有独立的上限兜底。时长到点即停既不会跑不完也不会撑爆内存。两种模式对比一览固定请求数模式-n时长模式-z请求数用户指定的-n内部替换为MaxInt32停止条件所有请求发完定时器到点触发Stop()校验重点-n ≥ -c且两者 ≥ 1只需-c ≥ 1-n已被忽略典型命令hey -n 1000 -c 100 https://example.comhey -z 30s https://example.com 一个细节时长模式下程序不再检查-n因为num已经被覆盖你传什么都无所谓——这也是帮助文档里写着 If duration is specified, n is ignored 的原因见 README.md。参数校验失败时会发生什么hey 对所有参数错误采用统一的退出策略定义在 hey.gousageAndExit参数类错误-n/-c不合法、-H头格式不对等。先输出你的错误原因再打印完整-h用法退出码为 1errAndExit运行期错误如-D指定的请求体文件读不到。只输出错误信息并退出。两种情况都写入stderr而非 stdout方便脚本用管道分离正常输出与错误信息。小结把这两条规则变成肌肉记忆固定次数压测-n ≥ -c且都不为 0。想发 20 个请求并发最多开 20。时长压测-z模式下-n自动失效内部用MaxInt32当无限哨兵靠定时器 优雅停止信号收场统计缓冲区有 100 万条上限放心用。校验失败时 hey 会打印完整用法并返回非零退出码——把它写进 CI 时失败原因能第一时间浮现在 stderr 上。项目结构供延伸阅读参数解析与校验集中在 hey.goworker 调度与停止信号在 requester/requester.go统计与报告在 requester/report.go 与 requester/print.go另有 requester/requester_test.go 与 hey_test.go 覆盖解析逻辑。获取源码可执行git clone https://gitcode.com/GitHub_Trending/he/hey配合 Makefile 与 Dockerfile 即可在本地构建。【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考