在 Web 应用开发、接口调试与性能优化过程中,负载测试是不可或缺的环节——它能帮助我们模拟高并发场景,检测接口的响应速度、吞吐量、稳定性,提前发现系统在高负载下的瓶颈(如超时、崩溃、响应延迟飙升等问题)。今天,我们重点介绍一款轻量、高效、易用的开源 HTTP 负载测试工具——hey,它基于 Go 语言开发,凭借 Go 语言的并发优势,能快速模拟大量并发请求,且配置灵活、输出直观,是开发者和测试工程师的得力助手。
本文将从工具核心特性、环境安装、基础用法、高级用法、实战示例到拓展知识,全方位讲解 hey 的使用方法,全程搭配可直接复制运行的示例代码,兼顾新手入门与进阶需求,让你快速掌握这款工具的核心能力。
一、hey 工具核心介绍
hey 是由 Jaana Dogan 使用 Go 语言开发的开源 HTTP 负载测试工具,最初名为 boom,后为避免命名冲突更名为 hey,目前托管在 GitHub(仓库地址:https://github.com/rakyll/hey),遵循 MIT 开源协议,支持全平台运行。
作为一款轻量级压测工具,hey 摒弃了复杂的图形界面,完全基于命令行操作,核心优势源于 Go 语言的 goroutine 并发模型——无需复杂配置,就能轻松模拟上百、上千甚至上万的并发请求,且资源占用远低于传统压测工具(如 JMeter),尤其适合快速验证接口性能、临时压测场景,也可集成到 CI/CD 流程中实现自动化压测。
1.1 核心特性
多协议支持:兼容 HTTP、HTTPS 以及 WebSocket 协议,同时支持 HTTP/2 站点,可满足不同类型 Web 服务的压测需求;
高并发能力:依托 Go 语言 goroutine 机制,模拟大量并发连接,无需担心线程切换开销,能充分利用 CPU 资源;
高度可定制:支持自定义请求方法(GET、POST、PUT 等)、请求头、请求体、超时时间、并发数、请求总数等参数,适配复杂测试场景;
丰富统计输出:压测结束后,自动生成详细的统计报告,包括请求总耗时、QPS(每秒请求数)、响应时间分布、状态码分布、DNS 解析耗时等关键指标;
易用性强:命令行参数简洁易懂,无需编写复杂脚本,新手可快速上手,同时支持输出 CSV 格式报表,便于后续数据分析;
跨平台支持:可运行在 Linux、MacOS、Windows 等主流操作系统,安装部署简单便捷。
1.2 适用场景
接口开发调试:验证接口在高并发下的响应稳定性,排查接口超时、报错等问题;
性能瓶颈定位:模拟真实用户访问场景,检测系统在高负载下的吞吐量、响应延迟,定位 CPU、内存、网络等瓶颈;
自动化压测:集成到 CI/CD 流程,在代码部署前自动执行压测,确保新版本接口性能达标;
临时快速压测:无需搭建复杂环境,通过简单命令快速验证某个接口或页面的承载能力。
二、hey 环境安装(全平台,极简版)
hey 安装无需复杂操作,最便捷的方式是使用go install一键安装,适用于所有已配置 Go 环境的用户;未配置 Go 环境的用户,补充简单的 Go 环境配置和备选安装方式,高效完成部署。
2.1 前提条件(仅针对 go install 方式)
需提前安装 Go 语言环境(版本 ≥ 1.16),Go 语言安装可参考官方文档:https://golang.org/doc/install,安装完成后执行go version验证是否成功(输出版本信息即达标)。
2.2 核心安装方法(go install 一键安装,全平台通用)
无论 Linux、MacOS 还是 Windows 系统,只要已配置 Go 环境,执行以下单条命令即可完成 hey 安装,无需额外配置:
# 一键安装 hey(自动下载源码、编译并安装到 Go 的 bin 目录,可直接全局调用)goinstallgithub.com/rakyll/hey@latest# 验证安装是否成功(查看版本)hey-v安装成功后,终端会输出 hey 的版本信息(如 hey version 0.1.5,当前最新版本),说明安装完成,可直接在命令行使用 hey 命令。
2.3 备选安装方式(适用于未配置 Go 环境的场景)
若未安装 Go 环境,且不想额外配置,可直接下载对应系统的二进制文件,步骤极简:
访问 hey 官方 GitHub Releases 页面:https://github.com/rakyll/hey/releases;
下载对应系统架构的二进制文件(Linux 选 hey_linux_amd64、MacOS 选 hey_darwin_amd64、Windows 选 hey_windows_amd64.exe);
将下载的文件放到系统可执行目录(Linux/MacOS 放 /usr/local/bin,Windows 放 Program Files 并添加到 PATH 环境变量);
打开终端/CMD,输入
hey \-v,输出版本信息即安装成功。
说明:go install是最推荐的方式,无需手动处理编译、环境变量配置,Go 会自动完成所有操作,适合绝大多数开发者;备选方式仅作为补充,适合未使用 Go 语言的测试人员。
三、hey 基础用法(必学)
hey 的核心用法是通过命令行参数指定压测配置,基本语法格式如下:
hey[选项参数]<目标URL>其中,\<目标URL\>是必填项(如http://localhost:8080/api/test),选项参数是可选项,用于配置并发数、请求总数、请求方法等,下面先介绍最常用的基础参数和示例,帮你快速上手。
3.1 核心基础参数(必记)
hey 的参数简洁明了,以下是日常压测中最常用的 5 个基础参数,覆盖 80% 的基础压测场景:
| 参数 | 说明 | 默认值 |
|---|---|---|
| -n | 指定压测的总请求数(若指定 -z 参数,该参数会被忽略) | 200 |
| -c | 指定并发请求数(即同时发起的请求数量,建议根据服务器配置调整) | 50 |
| -z | 指定压测持续时间(格式:10s 表示 10 秒,3m 表示 3 分钟,忽略 -n 参数) | 无(默认按 -n 参数执行) |
| -m | 指定 HTTP 请求方法(GET、POST、PUT、DELETE、HEAD、OPTIONS 等) | GET |
| -t | 指定每个请求的超时时间(单位:秒,0 表示无超时限制) | 20 |
3.2 基础用法示例(可直接复制运行)
以下示例均以http://localhost:8080/api/hello为目标接口(可替换为自己的接口地址),覆盖最常见的基础压测场景,新手可逐一尝试,熟悉参数用法。
示例 1:默认配置压测(最简洁)
不指定任何可选参数,使用默认配置(总请求数 200、并发数 50、GET 方法、超时 20 秒)进行压测:
hey http://localhost:8080/api/hello压测结束后,会输出详细的统计报告,后续会专门讲解报告解读方法。
示例 2:指定总请求数和并发数
模拟 1000 个总请求,同时发起 100 个并发请求,压测 GET 接口:
hey-n1000-c100http://localhost:8080/api/hello适用场景:验证接口在固定请求量、固定并发下的性能(如模拟 100 个用户同时访问接口,共访问 1000 次)。
示例 3:指定压测持续时间
模拟并发数 50,持续压测 30 秒(忽略总请求数,按时间结束):
hey-c50-z30s http://localhost:8080/api/hello适用场景:模拟长时间高并发场景(如高峰期持续 30 秒的用户访问),检测接口的稳定性。
示例 4:指定请求方法和超时时间
模拟 500 个总请求、30 个并发,使用 POST 方法,超时时间设置为 10 秒:
hey-n500-c30-mPOST-t10http://localhost:8080/api/submit适用场景:压测非 GET 方法的接口(如提交表单、提交数据的 POST 接口),同时限制请求超时时间,避免请求长时间阻塞。
3.3 压测报告解读(关键)
无论使用哪种基础用法,压测结束后 hey 都会输出一份详细的统计报告,以下是一份典型报告的解读(结合示例 2 的输出),帮你快速提取关键信息:
Summary: Total:0.8334secs Slowest:0.3334secs Fastest:0.0463secs Average:0.0726secs Requests/sec:27.4439# QPS(每秒请求数,核心指标)Total data:2000bytes Size/request:200bytes Responsetimehistogram:# 响应时间分布(关键,看延迟集中范围)0.046[1]|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■0.075[8]|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■0.104[1]|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ Latency distribution:# 延迟分位数(核心指标,看不同分位的延迟)10%in0.0500secs25%in0.0550secs50%in0.0680secs# 中位数延迟(一半请求的延迟≤该值)75%in0.0820secs90%in0.0950secs# 90%请求的延迟≤该值(关键,评估大部分用户体验)95%in0.1020secs99%in0.3334secs Status code distribution:# 状态码分布(看接口成功率)[200]10responses# 200 表示成功,若有 4xx、5xx 说明接口有异常核心关注 3 个指标:
QPS(Requests/sec):每秒能处理的请求数,数值越高,接口吞吐量越好;
延迟分位数(尤其是 90%、95%、99%):90% 的请求延迟≤某个值,说明大部分用户的访问体验,若该值过高,说明接口延迟严重;
状态码分布:若存在 4xx(客户端错误)、5xx(服务端错误),需排查接口是否存在异常,成功率 = 成功状态码(如 200)请求数 / 总请求数。
四、hey 高级用法(进阶必备)
基础用法适用于简单压测场景,而实际开发中,我们常需要模拟更复杂的请求(如带请求头、请求体、身份认证、代理等),下面介绍 hey 的高级参数和对应的实战示例,覆盖复杂压测场景。
4.1 高级核心参数
| 参数 | 说明 | 示例 |
|---|---|---|
| -H | 自定义 HTTP 请求头(可重复使用,添加多个请求头) | -H "Content-Type: application/json" -H "Token: abc123" |
| -d | 指定 HTTP 请求体(适用于 POST、PUT 等方法) | -d '{"name":"test","age":20}' |
| -D | 从文件中读取请求体(适用于请求体较大的场景) | -D ./request.json |
| -a | 基本身份认证(用户名:密码) | -a "admin:123456" |
| -x | 指定 HTTP 代理(格式:host:port) | -x "127.0.0.1:8080" |
| -o | 指定输出格式(默认输出摘要,支持 csv 格式) | -o result.csv(将报告保存到文件) |
| -q | 限制每个并发 worker 的 QPS(避免请求过于集中) | -q 10(每个 worker 每秒最多 10 个请求) |
| -cpus | 指定使用的 CPU 核心数(默认使用当前机器所有核心) | -cpus 4(使用 4 个 CPU 核心) |
| -h2 | 启用 HTTP/2 协议(适用于支持 HTTP/2 的接口) | -h2 http://localhost:8080/api/hello |
4.2 高级用法实战示例
示例 1:带请求头和请求体的 POST 压测
模拟 300 个总请求、50 个并发,POST 方法,带 JSON 格式请求头和请求体,压测提交接口:
# 注意:请求体为 JSON 时,需通过 -H 指定 Content-Type 为 application/jsonhey-n300-c50-mPOST-H"Content-Type: application/json"-H"Token: abc123456"-d'{"username":"testuser","password":"123456","data":{"id":1001,"name":"测试数据"}}'http://localhost:8080/api/login适用场景:压测需要身份验证、提交 JSON 数据的接口(如登录、数据提交接口)。
示例 2:从文件读取请求体压测
若请求体较大(如复杂的 JSON、XML 数据),可将请求体写入文件,通过 -D 参数读取,示例如下:
# 1. 先创建请求体文件 request.json(内容如下)# {# "username": "testuser",# "password": "123456",# "data": {# "id": 1001,# "name": "测试数据",# "desc": "从文件读取请求体,适用于复杂请求"# }# }# 2. 执行压测(读取文件中的请求体)hey-n500-c80-mPOST-H"Content-Type: application/json"-D./request.json http://localhost:8080/api/submit适用场景:请求体复杂、内容较多的场景,避免在命令行中输入过长的请求体,便于维护。
示例 3:带基本身份认证的压测
部分接口需要基本身份认证(用户名+密码),可通过 -a 参数指定,示例如下:
# 模拟 200 个请求、30 个并发,带基本认证(用户名 admin,密码 123456)hey-n200-c30-a"admin:123456"http://localhost:8080/api/admin/getInfo适用场景:压测需要权限验证的后台接口、管理接口。
示例 4:指定代理进行压测
若目标接口需要通过代理访问(如测试环境需要代理、避免本地 IP 被限制),可通过 -x 参数指定代理,示例如下:
# 模拟 100 个请求、20 个并发,通过代理 127.0.0.1:8080 压测hey-n100-c20-x"127.0.0.1:8080"http://localhost:8080/api/test示例 5:限制 QPS 并保存报告到文件
模拟持续 60 秒、50 个并发,限制每个 worker 每秒最多 10 个请求,将压测报告保存为 CSV 文件(便于后续分析):
hey-c50-z60s-q10-o./hey_result.csv http://localhost:8080/api/helloCSV 文件中会包含每个请求的响应时间、状态码等详细信息,可用 Excel、WPS 打开进行数据分析。
示例 6:动态 URL 压测(社区拓展)
默认情况下,hey 只能对单个固定 URL 进行压测,但社区开发者对其进行了拓展,支持动态 URL(如随机生成 URL 中的参数),示例如下(需使用拓展版本 hey):
# 模拟 10 个请求、2 个并发,动态生成 URL 中的数字参数(十位数 2-9,个位数 1-9)hey-n10-c2http://www.baidu.com/{{(2-9)(1-9)}}运行后会随机生成类似http://www\.baidu\.com/31、http://www\.baidu\.com/98的 URL 进行压测,适用于需要测试多个相似 URL 的场景(如不同 ID 的详情接口)。
五、hey 实战场景:模拟真实业务压测
结合实际业务场景,我们以“用户登录接口”为例,演示如何使用 hey 进行完整的压测,覆盖真实业务中的常见需求(带请求头、请求体、身份验证、并发控制),并解读压测结果,指导性能优化。
5.1 实战场景说明
目标接口:
http://localhost:8080/api/login(POST 方法,用户登录接口);接口要求:请求头需包含
Content\-Type: application/json和App\-Version: 1\.0\.0,请求体为 JSON 格式(用户名、密码);压测需求:模拟 1000 个用户登录请求,同时发起 100 个并发,超时时间 15 秒,保存压测报告到 CSV 文件,限制每个 worker 每秒最多 15 个请求;
预期结果:接口成功率 100%,QPS ≥ 50,90% 延迟 ≤ 0.5 秒。
5.2 执行压测命令
hey-n1000-c100-mPOST-t15-q15-H"Content-Type: application/json"-H"App-Version: 1.0.0"-d'{"username":"test_01","password":"test123456"}'-o./login_test_result.csv http://localhost:8080/api/login5.3 压测结果解读与优化建议
假设压测结束后,输出的核心报告如下:
Summary: Total:18.23secs Slowest:1.20secs Fastest:0.12secs Average:0.45secs Requests/sec:54.85# QPS = 54.85,满足预期(≥50)Responsetimehistogram:0.120[10]|■■0.228[150]|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■0.336[320]|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■0.444[280]|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■0.552[180]|■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■0.660[40]|■■■■■■■■0.768[15]|■■■0.876[5]|■0.984[0]|1.092[0]|1.200[0]|Latency distribution:10%in0.25secs25%in0.32secs50%in0.43secs75%in0.52secs90%in0.60secs# 90% 延迟 = 0.6 秒,略高于预期(≤0.5 秒)95%in0.72secs99%in0.95secs Status code distribution:[200]1000responses# 成功率 100%,满足预期结果分析
1. 优势:接口成功率 100%,QPS 达到 54.85,满足预期需求,说明接口在 100 并发下整体稳定;
2. 不足:90% 延迟为 0.6 秒,略高于预期的 0.5 秒,说明部分用户的登录体验有待优化。
优化建议
接口层面:优化登录接口的业务逻辑(如减少数据库查询次数、缓存用户信息);
服务器层面:增加服务器 CPU、内存资源,或优化服务器配置(如调整 Nginx 连接数);
压测优化:可适当降低并发数(如调整为 80),或增加 CPU 核心数(通过 -cpus 参数),观察延迟是否下降。
六、拓展知识:hey 与其他压测工具对比
市面上有很多 HTTP 负载测试工具(如 JMeter、ab、wrk 等),不同工具各有优势,下面将 hey 与主流工具进行对比,帮助你根据场景选择合适的工具:
| 工具 | 开发语言 | 优势 | 劣势 | 适用场景 |
|---|---|---|---|---|
| hey | Go | 轻量、高效、并发能力强,命令行操作简单,输出直观,跨平台,支持 HTTP/2 | 无图形界面,不支持复杂场景(如分布式压测) | 快速压测、接口调试、临时压测、CI/CD 集成 |
| JMeter | Java | 图形界面友好,支持复杂场景(如分布式压测、多协议),可生成详细报表 | 资源占用高,配置复杂,启动慢 | 大型项目、复杂场景、长期压测、团队协作 |
| ab(ApacheBench) | C | 轻量、安装简单,适合简单 GET 请求压测 | 功能单一,不支持复杂请求(如 POST、请求头),并发能力有限 | 简单 GET 接口压测、快速验证 |
| wrk | C | 性能极强,支持 Lua 脚本,可定制复杂场景 | 学习成本高,不支持 Windows 系统,配置复杂 | 高性能场景、复杂脚本压测、Linux 环境 |
总结:如果是开发者日常调试、临时压测、简单场景,优先选择 hey(轻量、高效、易上手);如果是大型项目、复杂场景、需要团队协作,可选择 JMeter;如果是 Linux 环境下的高性能压测,可选择 wrk。
七、常见问题与解决方案
使用 hey 过程中,可能会遇到一些常见问题,下面整理了高频问题及解决方案,帮助你快速排查问题。
问题 1:执行 hey 命令提示“command not found”
原因:未配置环境变量,系统无法找到 hey 可执行文件。
解决方案:
MacOS/Linux:将 hey 可执行文件移动到 /usr/local/bin/ 目录(如
mv hey /usr/local/bin/);Windows:将 hey.exe 所在目录添加到系统 PATH 环境变量中,重启 CMD/PowerShell 即可。
问题 2:压测时出现大量超时(status code 504 或 timeout)
原因:并发数设置过高,服务器无法承载;或接口本身响应较慢;或超时时间设置过短。
解决方案:
降低并发数(-c 参数),逐步调整(如从 100 调整为 50);
增加超时时间(-t 参数),如设置为 30 秒(
\-t 30);排查接口本身的性能问题(如数据库慢查询、代码逻辑繁琐)。
问题 3:POST 请求提示“400 Bad Request”
原因:请求体格式错误;或未指定正确的 Content-Type 请求头;或请求体参数缺失。
解决方案:
检查请求体格式(如 JSON 格式是否正确,是否缺少引号、逗号);
通过 -H 参数指定正确的 Content-Type(如 JSON 格式指定
\-H \&\#34;Content\-Type: application/json\&\#34;);检查请求体参数是否完整,与接口要求一致。
问题 4:压测结果中 QPS 过低
原因:服务器资源不足(CPU、内存、网络);或接口性能较差;或并发数设置过低。
解决方案:
增加服务器资源(如升级 CPU、内存,优化网络);
优化接口性能(如缓存、减少数据库查询、异步处理);
适当增加并发数(-c 参数),但需结合服务器配置,避免过度压垮服务器。
八、总结
hey 作为一款基于 Go 语言开发的开源 HTTP 负载测试工具,凭借轻量、高效、易用的特点,成为开发者日常接口调试和性能验证的首选工具。本文从工具介绍、环境安装、基础用法、高级用法、实战场景、拓展知识到常见问题,全方位讲解了 hey 的使用方法,搭配了大量可直接复制运行的示例代码,兼顾新手入门与进阶需求。
使用 hey 时,核心是根据实际业务场景配置合适的并发数、请求数、请求方法等参数,通过压测报告解读接口性能瓶颈,进而优化接口和服务器配置。需要注意的是,压测时应避免过度压垮生产环境服务器,建议在测试环境进行压测,或控制压测强度。
如果你需要快速验证接口性能、排查高并发问题,不妨试试 hey,相信它能帮你高效完成负载测试,提升 Web 应用的性能和稳定性。同时,hey 是开源项目,你也可以通过修改源码,定制适合自己业务场景的压测功能。