Web服务压力测试工具hey学习一:使用方法
先给算法同学推荐个人工智能学习网站,写的挺详细的,感兴趣的同学可以去看看:人工智能学习网站,点击跳转
1、hey工具简介
你见过如此清晰且简明扼要的压力测试结果吗?他仅仅展示了耗时信息、发送速率信息,还展示了耗时分布的直方图信息,P90、P95也一目了然,这个结果就是这篇文章介绍的hey工具返回的。
hey是一个非常轻量的http服务压测工具,今天主要介绍其使用方法,后面还会学习其源码,解析其精巧的实现请求发送并对结果进行分析的技术方案,他的设计理念和实现思路非常值得借鉴和学习。

hey是一个由 Go 语言编写的轻量级 HTTP 负载测试工具,项目开源,其目的是替代 ApacheBench(ab),提供更灵活的 HTTP(S) 负载模拟能力,项目地址:
github.com/rakyll/hey
无法翻墙的同学可以访问gitee地址,我从github克隆了一份过来,代码也是最新的:
https://gitee.com/bd-super-sugar/hey.git
2、hey的使用场景
2.1 web应用性能评估
- 测试 API 在高并发下的响应时间和吞吐量,识别性能瓶颈。
验证微服务架构的稳定性,确保系统能承受预期流量。
2.2 服务器负载测试
- 模拟大规模用户访问,评估服务器资源配置的合理性。
检测服务器在极限流量下的表现,优化资源分配或扩容策略。
2.3
开发调试辅助
- 在接口联调阶段,快速验证接口功能及性能。
结合持续集成(CI)流程,自动化执行性能测试。
3、
hey核心功能及优势
1、并发控制
支持通过 -c 参数指定并发工作线程数(默认 50),模拟多用户同时访问。
结合 -q 参数可限制每个工作线程的 QPS(每秒查询数),实现精细化的流量控制。
2、请求定制
支持多种 HTTP 方法(GET、POST、PUT、DELETE 等),通过 -m 参数指定。
可自定义请求头(-H)、请求体(-d 或 -D 读取文件)、内容类型(-T)等,适配不同 API 需求。
支持基本身份验证(-a)、代理设置(-x)和 HTTP/2(-h2)。
3、测试模式
【固定请求数模式】:通过 -n 指定总请求数(默认 200),测试完成后输出统计。
【持续时间模式】:通过 -z 指定测试时长(如 -z 10s 或 -z 3m),忽略 -n 参数。
4、结果分析详尽
提供详细的统计报告,包括总耗时、最慢/最快请求时间、平均响应时间、RPS(每秒请求数)等。
输出响应时间分布直方图和延迟百分比(如 50%、90%、99% 请求的耗时)。
支持 CSV 格式输出(-o csv),便于程序化分析。
hey在技术上有很强的优势:
- 基于 Go 的协程(goroutine)实现高并发,资源占用低,能快速生成大量请求。
- 编译为单一二进制文件,支持 Linux、macOS、Windows 等操作系统。
- mac下,可通过 brew install hey或直接下载预编译版本快速安装。
4、hey的使用方法
hey作为一个应用程序,其参数的设置,都是通过命令行传入的,支持的参数有20多个,主要的有以下几个:
-n:设定发送请求数量,默认200.
-c:并发数量,启动几个线程来发送请求。
-q:发送速率,qps设置。
-z:发送时间,设定-z参数后,-n参数将会失效。
-o:输出格式,支持csv,输出内容为逗号分隔的表格数据,每一行代表一次请求的详细指标。
-m:设置http方法,支持GET, POST, PUT, DELETE, HEAD等选项。
-H:用于设置任意自定义header。
-t:每个请求的超时时间,默认20s,设置为0,则没有超时限制。
-A:用于专门设置 HTTP 的 Accept 头,比如 -A application/json,等价于 Accept: application/json。
它是一个快捷参数,只能设置 Accept 头。
-d:请求体。
-D:来自文件的请求体,比如:/home/user/file.txt
-q参数需要解释下,它设置的是一个线程的发送速率,比如设置为5,-c为1时,那么工具发送的整个qps就是5,如果-c为10,-q为5,那么整体qps就是50,这个要特别注意。
接下来进行实际验证和测试,来进一步说明hey的使用方法,首先启动一个服务,用于测试的api做了限流,最大支持1qps,下面我们进行压测,发送5个请求,一个线程,qps为1:
./hey -n 5 -c 1 -q 1 -m POST http://192.168.3.67:8200/mianhuatang/load/articles
理论上,服务对于hey发上来的请求都能够处理,因为服务支持1qps,发送的速率设置的也是1qps,测试结果如下:
5个请求,全部正确处理。
测试结果:
测试持续5.0046s,最快响应时间2.9ms,最慢响应时间8.7ms,平均4.5ms,每秒发送请求个数0.9991,基本就是1qps,http状态码200的是5个,全部正常返回。
下面调整一下服务,支持到2qps,将hey的发送速率也调整到2:
下面将发送速率发送到3:
./hey -n 50 -c 1 -q 3 -m POST http://192.168.3.67:8200/mianhuatang/load/articles
由于hey的发送速率大于了服务的承载能力,因此只正确处理了大概2/3左右的请求。
下面测试发送post请求,使用-d参数携带post参数到服务:
如果参数比较多,可以将参数放到txt文件里,使用-D参数传入文件地址:
./hey -n 5 -c 1 -q 1 -m POST -D /Users/liupeng/Documents/career/hey-master/param.txt http://192.168.3.67:8200/mianhuatang/clip/search
以上就是hey的基本使用方法,已能够满足大部分的压力测试场景,接下来我将研究一下hey的源码,学习其实现细节,后面也会在公众号上把这部分内容写下来,感兴趣的同学可以蹲个后续。
今天就写到这了,我是棉花糖,下期见~~~~~~~~~~~,欢迎同学们关注。
往期推荐
2025越山向海张家口站:从草原天路到崇礼142.6公里,我们一起跑过。
云端【多维度限流】技术方案设计,为服务稳定保驾护航
自动驾驶数据仓库:对时间片进行合并的小算法。
一个有线上问题带来的知识点:Python日志打印
一个实际上线的项目:Elastic检索库历史数据清理
Elastic:索引生命周期管理(Index Lifecycle Management)-减轻ES存储压力
Elasticsearch:delete_by_query使用方法
大同华严寺:受人民爱戴的耿市长还会回来吗?薄伽教藏的合掌漏齿菩萨你知道是谁吗?
云冈石窟:翻开这本距今1565年、与天地同久长的石头史书,感受北魏王朝雕刻艺术的巅峰之作。
我在百度的这10年~~
一个读写excel的简单程序(golang)
一个异步架构设计:批量消费RabbitMQ,批量写入Elasticsearch(golang实现)
Python web框架sanic+tortoise服务框架搭建(MVP版本)
命令行参数的艺术:Python、Golang、C++技术实现
supervisor,你理应知道。
借助tritonserver完成gpt2模型的本地私有化部署
武汉抗疫英雄汪勇:平凡人的非凡之举。
微信小程序文章列表焕新颜:从丑小鸭到白天鹅的华丽蜕变
李白:为何两次选择做了上门女婿?
纳兰性德-我是人间惆怅客,世间唯有『若』字,最难成真
tritonserver学习之九:tritonserver grpc异步模式
条件变量的使用(golang)
2025年,我要做个自我介绍