无网络环境部署Hey压测工具:离线二进制分发与内网压测完整指南
【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey
hey是一个用 Go 编写的轻量级 HTTP 压测工具,定位为 ApacheBench(ab)的现代替代品,通过并发 Worker 向目标 URL 发送请求并输出延迟直方图、百分位分布等统计指标。由于它是零依赖的单一静态二进制,天生适合在无外网的内网、隔离机房或安全域中部署——无需安装任何运行时,拷贝一个文件即可开始压测。
为什么 Hey 是离线压测的理想选择 🎯
许多压测工具(如 JMeter)依赖 JVM 或复杂的安装环境,在隔离网络中难以落地。Hey 则不同:
| 特性 | 说明 |
|---|---|
| 单一静态二进制 | CGO_ENABLED=0编译,不依赖任何动态库 |
| 体积极小 | 官方发布包通常不到 10 MB |
| 零运行时 | 不需要 Python、JDK 或任何解释器 |
| 跨平台交叉编译 | 一台机器编译出 Linux / macOS / Windows 版本 |
| 支持 HTTP/2 | -h2参数即可启用 |
核心压测逻辑位于 requester/requester.go(Worker 调度与请求发送),CLI 参数解析与入口在 hey.go。整个项目代码量极小,审计成本低。
离线二进制分发的三种方式 📦
方式一:使用官方预编译二进制(最快)
在项目 README.md 中列出了三个平台的发布下载地址:
- Linux (amd64):
hey_linux_amd64 - macOS (amd64):
hey_darwin_amd64 - Windows (amd64):
hey_windows_amd64
操作步骤:
- 在有外网的机器上下载对应平台的二进制文件
- 通过 U 盘、内网文件服务器或镜像仓库传输到目标机器
- 赋予执行权限即可使用:
chmod +x hey_linux_amd64 ./hey_linux_amd64 -n 100 -c 10 http://intranet-api:8080/health💡 这是最省事的方案,适合一次性压测或临时任务。
方式二:本地交叉编译(推荐团队使用)
项目自带 Makefile,一条命令即可生成三大平台的二进制:
make release该目标会依次执行(详见 Makefile 第 3–6 行):
GOOS=windows GOARCH=amd64 go build -o ./bin/hey_windows_amd64 GOOS=linux GOARCH=amd64 go build -o ./bin/hey_linux_amd64 GOOS=darwin GOARCH=amd64 go build -o ./bin/hey_darwin_amd64只要编译机安装 Go 1.24+(见 go.mod 的go 1.24.0声明)并拉取一次依赖,后续完全离线可重复构建。将./bin/目录整体打包分发给内网各节点即可。
方式三:Docker 镜像(适合容器化内网)
项目提供了多阶段构建的 Dockerfile。关键点:
- 构建阶段使用
golang:1.15基础镜像 - 以
CGO_ENABLED=0静态编译 - 最终阶段
FROM scratch,仅包含二进制 + CA 证书,镜像极小
在有网环境构建并导出:
docker build -t hey:offline . docker save hey:offline -o hey-offline.tar将hey-offline.tar拷入内网后加载运行:
docker load -i hey-offline.tar docker run --rm hey:offline -n 200 -c 50 http://svc-internal:8080⚠️ 注意:
FROM scratch镜像无 shell,调试时可临时加--entrypoint /bin/sh不方便,建议压测参数在运行前确认好。
内网压测实战:常用参数速查 🚀
以下参数覆盖了大多数内网压测场景(完整列表见 hey.go 中的usage变量):
| 参数 | 作用 | 示例 |
|---|---|---|
-n | 总请求数(默认 200) | -n 1000 |
-c | 并发 Worker 数(默认 50) | -c 100 |
-z | 持续压测时长,到达后自动停止 | -z 30s/-z 5m |
-q | 每 Worker 限速(QPS) | -q 10 |
-m | HTTP 方法 | -m POST |
-H | 自定义请求头(可重复) | -H "Authorization: Bearer xxx" |
-d | 请求体 | -d "key=value" |
-t | 单请求超时(秒) | -t 30 |
-h2 | 启用 HTTP/2 | -h2 |
-o | 输出格式:空=摘要,csv=CSV | -o csv |
典型内网压测命令:
# 持续 60 秒、50 并发、限速每 Worker 20 QPS hey -c 50 -q 20 -z 60s http://order-service.internal/api/v1/orders # POST 接口 + 鉴权头 + CSV 导出(便于离线分析) hey -m POST -H "Content-Type: application/json" \ -d '{"qty":1}' -o csv \ -n 500 -c 20 \ http://payment-gateway.internal/charge | tee result.csv读懂压测报告 📊
Hey 默认输出包含以下核心区块(模板定义于 requester/print.go):
- Summary:总耗时、最慢/最快/平均响应、每秒请求数(RPS)
- Response time histogram:延迟直方图,一眼看出分布形态
- Latency distribution:P10 / P25 / P50 / P75 / P90 / P95 / P99 百分位
- Details:DNS、TCP 建连、请求写入、响应等待、响应读取各阶段的均值/极值
- Status code distribution:各 HTTP 状态码计数
- Error distribution:连接失败、超时等错误统计
对于内网服务,重点关注DNS+dialup和resp wait两个指标:前者反映内网网络质量,后者直接对应后端处理耗时。
离线环境的注意事项 ⚠️
TLS 证书:
FROM scratch镜像已内置 CA 证书(Dockerfile 第 27 行)。裸二进制若访问内网自签名 HTTPS,注意 hey 源码中InsecureSkipVerify: true(见 requester/requester.go 第 241 行),默认跳过证书校验,无需额外配置。CPU 核数:
-cpus参数可控制使用的 CPU 核数,默认取机器全部核心。在小规格内网机器上建议显式设置,避免压测进程抢占业务资源。结果留档:内网无外部监控平台时,用
-o csv将逐条延迟数据导出,压测后可通过 U 盘带回办公网做深度分析。版本管理:建议在二进制旁放置一个
VERSION文件记录构建 commit,方便团队追溯压测基准。
项目文件导航 📁
| 文件 | 用途 |
|---|---|
| hey.go | CLI 入口、参数定义与调度 |
| requester/requester.go | Worker 池、HTTP 请求发送与指标采集 |
| requester/report.go | 统计聚合、直方图与百分位计算 |
| requester/print.go | 摘要 / CSV 输出模板 |
| Makefile | 三平台交叉编译与发布脚本 |
| Dockerfile | 多阶段构建,产出 scratch 最小镜像 |
| go.mod | Go 模块声明(依赖仅golang.org/x/net) |
| README.md | 完整参数说明与示例 |
Hey 的"单文件、零依赖、秒启动"特性,让它成为内网压测场景中最容易落地的工具之一。无论是通过 U 盘拷贝一个 10 MB 的二进制,还是在内网 Harbor 里存一份 scratch 镜像,都能让团队在完全隔离的网络中拥有可靠的 HTTP 压测能力。
【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考