☰
Hey -cpus参数详解:控制CPU核心数让压测结果可复现的关键技巧
2026/10/1 7:58:31 网站建设 项目流程

Hey -cpus参数详解:控制CPU核心数让压测结果可复现的关键技巧

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

Hey 是一款轻量级的开源HTTP 压测工具(HTTP load generator),被定位为 ApacheBench(ab)的现代替代品。它用一条命令就能对 Web 服务发起并发请求,并输出延迟百分位、QPS 等统计指标。但在实际使用中,不少人发现同一组压测命令跑两次,结果却对不上——罪魁祸首往往就是没有固定 CPU 核心数,而 Hey 的-cpus参数正是为此而生。本文面向新手,讲清楚-cpus为什么需要、如何生效,以及怎样用它让压测结果可复现。

一、30 秒认识 Hey:一条命令的 HTTP 压测工具 🚀

Hey 的核心用法非常简单:

hey -n 1000 -c 50 https://api.example.com

含义是:发起 1000 个请求(-n),同时保持 50 个并发 worker(-c),压测结束后自动输出统计报告。更多命令示例可以在 README.md 的 Examples 一节找到。

但"简单"也意味着一个坑:你不指定的参数,Hey 会按本机环境自动取默认值,其中就包括 CPU 核心数。

二、为什么需要 -cpus:压测结果"每次都不一样"的三个原因

做压测时,大家最头疼的问题之一是结果不可复现。同样的命令、同样的机器,上午跑和下午跑,P99 延迟可能差出几十毫秒。原因通常有这三个:

  1. 默认核心数随机器而变:-cpus不指定时,Hey 直接使用当前机器的 CPU 核心数作为默认值。换台机器、或者从笔记本换到云服务器,结果自然没法对比。
  2. goroutine 调度受核心数影响:Hey 的并发 worker 本质上是 Go 的 goroutine,它们在有限的 OS 线程上调度。可分配的 CPU 核心数不同,调度时机和 GC 表现都会不同,延迟分布随之漂移。
  3. 容器 / 云环境的隐性限制:cgroup 的 CPU quota、后台任务抢占都会干扰调度,而客户端自身的 CPU 波动也会"污染"被测服务的真实表现。

一句话:压测不仅要控制"发多少请求",还要控制"用什么资源发请求"。

三、-cpus 参数如何生效:一行 GOMAXPROCS 的事

从源码看,这个参数极其轻量。在 hey.go 中定义:

cpus = flag.Int("cpus", runtime.GOMAXPROCS(-1), "")

runtime.GOMAXPROCS(-1)表示"查询本机逻辑 CPU 数",所以默认值就是你的机器核心数。这也是为什么在帮助信息里,默认核心数是动态显示的(见 hey.go 的 usage 文案:-cpus Number of used cpu cores)。

真正生效的地方在 hey.go:

runtime.GOMAXPROCS(*cpus)

启动压测前,Hey 调用 Go 运行时的GOMAXPROCS,把"允许并行执行代码的 OS 线程数"固定为你指定的值。你可以把它理解为:给压测客户端划定一个 CPU 使用上限。

被划定上限后,所有 worker 协程(并发逻辑见 requester/requester.go 中的runWorkers)就在这个固定的 CPU 预算内竞争调度——这正是可复现性的来源。

四、3 个实用技巧:让 Hey 压测结果可复现

技巧 1:固定 -cpus,做"同核对比" ⚖️

对比两次压测结果(比如优化前后的延迟对比),务必使用相同的-cpus:

hey -cpus 4 -n 2000 -c 50 -z 60s https://api.example.com

把-cpus 4写进你的压测脚本,无论在哪台机器上执行,客户端的 CPU 预算都恒定,两次数据才具备可比性。

技巧 2:容器环境,先对齐 CPU 限制

在容器里跑 Hey 时,宿主机核心数往往远大于容器实际可用的 CPU 配额。建议先给容器设置明确的 CPU limit,再用-cpus与之对齐(例如容器限 2 核,就加-cpus 2),避免调度器"以为自己有 64 核"却只分得到 2 核的错位。

技巧 3:把 -cpus 写进压测报告 📝

Hey 结束时会输出请求耗时分布、状态码统计等报告(报告逻辑见 requester/report.go)。建议在报告归档时,一并记录本次使用的-cpus、-c、-n值——三个月后复盘数据时,你会感谢自己的。

五、常见混淆:-cpus 和 -c 不是一回事

参数控制对象类比
-c并发 worker 数(goroutine 数量)排队办事的窗口数
-cpusGo 运行时可用的 CPU 核心数办事大厅的电力供应

-c决定"多少人同时发请求",-cpus决定"客户端有多少计算资源支撑这些请求"。两者配合使用:核心太少时,高并发下客户端自身可能成为瓶颈,反而低估了服务器的真实能力。

六、-cpus 常见问题(FAQ) ❓

Q1:不写 -cpus 会怎样?默认取当前机器的 CPU 核心数(GOMAXPROCS(-1)),机器不同默认值就不同,跨机器对比时结果不可复现。

Q2:-cpus 是不是越大越好?不是。-cpus的目标是"一致性"而非"性能最大化"。盲目调大只会引入更多调度变量;核心数够用、且每次相同,就是好值。

Q3:如何查看 Hey 支持哪些参数?执行hey -h查看帮助,其中-cpus一行会动态显示当前机器的默认核心数。

七、总结

  • Hey 是 ApacheBench 的轻量替代品,一条命令即可完成 HTTP 压测
  • -cpus通过runtime.GOMAXPROCS固定客户端可用的 CPU 核心数(见 hey.go)
  • 默认值为本机核心数,跨机器、跨容器对比时务必显式指定
  • 搭配固定的-c/-n并把-cpus写入报告,压测结果才能真正可复现

掌握这个"小参数",你的压测报告就从"大概差不多"升级到了"可以拍胸脯"的精度。

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

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询