hey:用并发请求替代 ApacheBench 的 HTTP 压测工具
一个给 Web 应用发压测请求的 Go 工具,支持 HTTP/2 和并发控制,比 ApacheBench 更直接。
GitHub rakyll/hey 更新 2026-09-30 分支 master 星标 20.5K 分叉 1.3K
Go HTTP 压测 HTTP/2 Linux/macOS/Windows amd64

🧭 决策指南

适合,如果你

  • 你要给 HTTP Web 应用发送固定请求数或持续 30 秒的负载
    README「Usage」支持 -n 和 -z;「Examples」包含 hey -z 30s https://google.com
  • 你需要用 100 个并发 worker 发送 1000 个请求
    README「Examples」原文为 hey -n 1000 -c 100 https://google.com
  • 目标 endpoint 使用 HTTP/2,或请求需要 POST body 与自定义 header
    README「Usage」列出 -h2、-d、-H;「Examples」包含 POST、Bearer token 和 HTTP/2 示例

不适合,如果你

  • 你的运行环境不是 README 列出的 Linux、macOS 或 Windows amd64
    README「Installation」只列出 Linux (amd64)、macOS (amd64)、Windows (amd64) 下载项
  • 你需要除 summary 或 CSV 之外的输出格式
    README「Usage」说明 -o 的唯一支持替代格式是 csv
  • 你要让请求总数小于并发数,例如 -n 10 -c 50
    README「Usage」明确说明 total number of requests cannot be smaller than the concurrency level

前置条件

  • 需要 Linux (amd64)、macOS (amd64) 或 Windows (amd64) 二进制环境
  • 可在 macOS 使用 Homebrew 命令 brew install hey
  • 目标应是可通过 URL 访问的 Web application 或 HTTP/2 endpoint

第一步命令(README 原文)

hey https://google.com

要注意

  • 使用 -z 时 n 会被忽略,时长到达后程序停止并退出
    README「Usage」对 -z 的说明
  • 重复使用 -H 才能传多个 header,例如 Accept 和 Content-Type
    README「Usage」-H 说明及自定义 header 示例
  • -q 按每个 worker 限制 QPS,不是整个 hey 进程的总 QPS
    README「Usage」将 -q 定义为 queries per second per worker
  • 默认启用 keep-alive;关闭需显式使用 -disable-keepalive
    README「Usage」列出 -disable-keepalive 并说明其作用

替代方案

  • ApacheBench (ab):当现有压测流程明确要求 ApacheBench (ab) 时,使用 README 所称的原有对照工具
    README 核心描述与开头说明

材料未说明

  • README 未说明响应统计包含哪些具体指标,例如延迟分位数或错误率
  • README 未说明 ARM、Linux 非 amd64 或其他架构是否有可用构建
  • README 未说明 v0.1.5 相比此前 4 个版本的具体变更
  • README 未说明 20,477 颗星和 2026-09-30 Trending 上榜是否由某个新功能或发布事件驱动
  • README 未说明认证信息、Bearer token 和请求 body 在日志或 CSV 中的处理方式
  • README 未说明目标 URL 的 TLS、重定向和代理行为在各平台上的具体兼容范围

💡 深度解析

6
适合:hey 原生支持持续时间模式和每个 worker 的 QPS 限制,但总速率需要按 worker 数量理解。 我需要对预发布 HTTP 服务持续 30 秒施压,并把目标速率设为每个 worker 10 QPS、共 5 个 worker;hey 的 `-q` 和 `-z` 能否表达这个负载模型?
适合读者: 负责预发布上线验证的 SRE,需要按固定 QPS 持续压测一个 HTTP 服务

适合:hey 原生支持持续时间模式和每个 worker 的 QPS 限制,但总速率需要按 worker 数量理解。

  • -z 指定运行时长,README 明确说明达到时长后程序停止,且此时 -n 会被忽略。
  • -q 的单位是每个 worker 的 QPS;README 示例 -q 10 -c 5 -z 30s 正好对应每 worker 10 QPS、5 个 worker、持续 30 秒的模型。
  • -c 控制并发 worker,因此目标总速率不是简单把 -q 当作全局限速。

这种方式适合预发布容量验证和持续负载观察。README 没有保证实际速率一定精确达到理论值,也没有提供服务端限流、告警或监控集成;响应时间和调度仍可能影响实际吞吐。

  • Usage:`-q Rate limit, in queries per second (QPS) per worker`
  • Usage:`-z Duration of application to send requests`,以及 `n is ignored`
  • Examples:`hey -q 10 -c 5 -z 30s https://google.com`
hey -q 10 -c 5 -z 30s https://google.com
材料未说明:README 未说明实际 QPS 与理论 QPS 的偏差范围。;README 未说明目标服务是否会返回限流、错误或因持续负载触发保护机制。
适合:它直接提供并发 worker、请求总数和汇总统计,定位就是 ApacheBench 的轻量替代品。 我维护一个 Go 编写的 HTTP 服务,通常只需要比较 GET 接口在 50 到 100 个并发下的延迟;hey 能否替代 ApacheBench 完成这类验证?
适合读者: 需要快速验证 HTTP API 性能、使用 Go 服务并希望替代 ApacheBench 的后端开发者

适合:它直接提供并发 worker、请求总数和汇总统计,定位就是 ApacheBench 的轻量替代品。

  • -n 控制请求总量,-c 控制并发 worker,README 的示例明确展示了 -n 1000 -c 100。
  • 默认执行后打印统计结果,能够覆盖基础吞吐和延迟比较;也可用 -o csv 导出响应指标。
  • 项目是 Go 编写的独立命令行程序,并提供 Linux、macOS、Windows amd64 二进制,部署成本低。

它不等于完整性能平台:README 没有说明分布式执行、复杂业务流程或服务端指标采集能力。若你的验证只是单 URL 的基础 HTTP 压测,匹配度较高;若要模拟多步骤用户流程,则需要其他工具。

  • 项目描述:HTTP load generator, ApacheBench (ab) replacement
  • Usage:`-n`、`-c`、`-o csv`
  • Examples:`hey -n 1000 -c 100 https://google.com`
  • Installation:Linux、macOS、Windows amd64 可执行文件
hey -n 1000 -c 100 https://google.com
材料未说明:README 未说明汇总统计具体包含哪些百分位指标。;README 未说明在高并发下单个客户端的 CPU、文件描述符和网络上限。
适合:hey 支持 POST、自定义请求头和字符串或文件形式的请求体,能够覆盖这种单请求模板。 我正在测试一个需要 POST、`Content-Type: application/json` 和自定义 Authorization 请求头的 HTTP API;我能否只用 hey 构造这类请求?
适合读者: 测试工程师,需要验证带 JSON 请求头和 POST 请求体的 HTTP API

适合:hey 支持 POST、自定义请求头和字符串或文件形式的请求体,能够覆盖这种单请求模板。

  • -m 支持 POST,因此可以显式指定方法而不是使用默认 GET。
  • -H 可重复传入多个请求头,README 示例同时展示了 Accept: application/json 和 Authorization: Bearer token。
  • -d 可直接传字符串请求体,-D 可从文件读取请求体;-T 用于设置 Content-Type。

因此固定 JSON 内容的接口回归、基础吞吐测试和鉴权头验证都可执行。不过 README 明确列出的认证选项是 Basic authentication,Bearer token 只是通过普通请求头传入;没有说明动态 Token 刷新、参数化数据集或每次请求生成不同 body 的能力。

  • Usage:`-m HTTP method`,支持 POST
  • Usage:`-H Custom HTTP header`、`-d HTTP request body`、`-D HTTP request body from file`、`-T Content-type`
  • Examples:`-H "Authorization: Bearer token"`
  • Usage:`-a Basic authentication, username:password`
hey \
    -m POST \
    -d "param1=value1&param2=value2" \
    https://google.com
材料未说明:README 未说明是否支持每个请求使用不同的请求体或动态变量。;README 未说明是否支持 OAuth、签名认证或自动刷新 Bearer token。
适合:它提供对应平台的独立二进制和 CSV 输出,足以作为基础 CI 测试步骤。 我想在 Linux amd64 或 macOS amd64 的 CI 中运行固定请求数的 API 基准测试,并把每次响应指标保存下来;hey 是否适合接入流水线?
适合读者: 需要在 CI 中保存可处理结果的测试工程师,运行环境是 Linux amd64 或 macOS amd64

适合:它提供对应平台的独立二进制和 CSV 输出,足以作为基础 CI 测试步骤。

  • Installation 章节列出 Linux amd64 和 macOS amd64 下载地址,也支持 macOS Homebrew 安装。
  • -o csv 是 README 明确支持的输出方式,会导出响应指标,便于后续脚本读取或保存。
  • -n 和 -c 可把测试规模写入 CI 命令,默认还会打印汇总结果。
  • Go 项目以独立命令行程序交付,不要求部署完整服务平台。

它更适合生成原始测试数据,而不是直接提供完整质量门禁。README 只列出 summary 和 CSV,没有说明 JUnit、HTML 报告、阈值断言、趋势图或 CI 平台插件;这些判断和可视化需要流水线自行实现。

  • Installation:Linux amd64、macOS amd64 下载地址及 Homebrew
  • Usage:`-o Output type`,`"csv" is the only supported alternative`
  • Usage:`hey runs provided number of requests ... and prints stats`
  • 项目数据:主语言 Go;最新版本 v0.1.5;Apache License 2.0
hey -n 1000 -c 100 https://google.com
材料未说明:README 未说明 CSV 的列定义、错误记录格式和退出码语义。;README 未说明是否有官方 CI 集成示例或性能阈值断言功能。
适合:hey 同时提供代理地址、自定义 Host 头和 Linux amd64 二进制,适合单 URL 路由验证。 我需要在 Linux amd64 主机上经由 HTTP 代理访问测试环境,并设置自定义 Host 头来验证路由;hey 能否覆盖这个部署验证场景?
适合读者: 需要通过代理和自定义 Host 头验证部署路由的运维工程师,目标环境使用 amd64 主机

适合:hey 同时提供代理地址、自定义 Host 头和 Linux amd64 二进制,适合单 URL 路由验证。

  • -x 接受 host:port 格式的 HTTP Proxy address,可将请求指向指定代理。
  • -host 用于设置 HTTP Host header,能够验证基于 Host 的虚拟主机或路由规则。
  • Installation 章节直接提供 Linux amd64 二进制,不需要在目标主机部署额外平台组件。
  • -t 可设置单请求超时,-disable-redirects 可关闭重定向跟随,有助于观察部署入口的原始响应行为。

限制在于 README 没有说明代理认证、HTTPS CONNECT 的具体支持方式、SOCKS 代理或多目标路由编排。如果验证需要代理用户名密码、复杂证书链或多个服务之间的业务流程,单个 hey 命令不能从 README 得到完整保证。

  • Usage:`-x HTTP Proxy address as host:port`
  • Usage:`-host HTTP Host header`
  • Usage:`-t Timeout for each request`、`-disable-redirects`
  • Installation:`Linux (amd64)`
hey https://google.com
材料未说明:README 未说明 HTTP 代理认证和 HTTPS CONNECT 的具体行为。;README 未说明是否支持 SOCKS 代理。;README 未说明自定义 Host 与 TLS 证书校验之间的处理方式。
视情况:hey 提供 HTTP/2 开关,但是否真正使用 HTTP/2 取决于目标端点和客户端环境的协商结果。 我的服务提供 HTTP/2 端点,我想用同一个命令行工具发送并发请求并验证 HTTP/2 路径;hey 的 `-h2` 是否足够?
适合读者: 维护 HTTP/2 API 的后端工程师,需要比较 HTTP/1 与 HTTP/2 端点的请求表现

视情况:hey 提供 HTTP/2 开关,但是否真正使用 HTTP/2 取决于目标端点和客户端环境的协商结果。

  • README 明确写明 hey 支持 HTTP2 endpoints,并提供 -h2 Enable HTTP/2 选项。
  • HTTP/2 测试仍可结合 -n、-c 或 -z,因此并发请求和固定时长负载模型不需要更换工具。
  • 项目同时支持自定义 Host、超时、代理和连接行为选项,可用于部分端点配置验证。

但 -h2 只是启用客户端侧选项,不代表目标一定按 HTTP/2 处理请求。README 没有说明 ALPN/TLS 协商细节、明文 h2c 支持、HTTP/2 连接复用的统计方式,也没有提供协议版本确认字段;因此它适合发起测试,不足以单独证明协议协商结果。

  • README 开头:`It also supports HTTP2 endpoints.`
  • Usage:`-h2 Enable HTTP/2`
  • Usage:`-n`、`-c`、`-z`、`-host`、`-x`、`-t`
hey -h2 https://google.com
材料未说明:README 未说明是否支持明文 HTTP/2(h2c)。;README 未说明如何在输出中确认最终协商出的 HTTP 协议版本。;README 未说明 HTTP/2 多路复用连接的具体统计口径。

✨ 核心亮点

  • 支持 HTTP/2、POST、代理与自定义请求头
  • 用 -n、-c、-z 控制请求数、并发和时长
  • 提供 Linux、macOS、Windows amd64 二进制
  • ApacheBench 替代品,社区已有 20,477 颗星

🔧 工程化

  • hey 发送指定数量请求并输出 HTTP 统计信息
  • 支持 -n 请求数、-c 并发 worker 与 -q QPS 限速
  • 支持 GET、POST、PUT、DELETE 等 HTTP 方法
  • 可用 -o csv 导出响应指标,唯一替代输出格式是 CSV

⚠️ 风险

  • 默认仅发送 200 请求并使用 50 个并发 worker
  • README 要求请求总数不能小于 -c 并发数
  • 单请求默认超时 20 秒,-t 0 才表示无限等待
  • 仅列出 amd64 二进制,未列出 ARM 架构构建物

👥 适合谁?

  • 需要快速压测 HTTP Web 应用的 Go 或 Web 开发者
  • 需要验证 HTTP/2 endpoint、POST body 或 Bearer token 的团队
  • 使用 Linux、macOS 或 Windows amd64 的工程师