资讯动态

Hey压测工具result结构体深度解析:6个延迟字段如何读懂一次请求的一生

发布时间:2026/10/3 7:36:26 来源:尧图企业网站定制
Hey压测工具result结构体深度解析6个延迟字段如何读懂一次请求的一生【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey跑完一次 hey 压测屏幕上会刷出平均延迟、P99、resp wait 等一串数字这些数字到底从哪来答案就藏在 hey 压测工具里一个小小的result结构体中——它的 6 个延迟字段完整记录了一次请求从发出到收到的全部旅程。本文带你逐层拆解 result 结构体它如何诞生、6 个延迟字段如何测量以及如何用它快速定位性能瓶颈。先认识 hey一个极快的 HTTP 压测工具hey 是用 Go 编写的轻量级 HTTP 压测工具可以看作 ApacheBenchab的现代替代。它的核心能力两个参数定压测规模总请求数-n、并发数-c实时统计响应时间直方图、10%~99% 分位数分布、状态码分布两种输出默认人类可读的 Summary或用-o csv导出每个请求的明细上手只需一条命令更多用法见 README.mdhey -n 1000 -c 100 https://example.comresult 结构体一次请求的完整病历hey 每发出一个请求就会生成一条result记录定义非常精炼位于 requester/requester.gotype result struct { err error statusCode int offset time.Duration duration time.Duration connDuration time.Duration // connection setup(DNS lookup Dial up) duration dnsDuration time.Duration // dns lookup duration reqDuration time.Duration // request write duration resDuration time.Duration // response read duration delayDuration time.Duration // delay between response and request contentLength int64 }这些字段可以分成三组来看字段归属通俗解释err、statusCode、contentLength请求元信息这次请求成功了吗返回什么状态码响应多大offset时间标记请求开始时压测已经运行了多久duration延迟字段 1整次请求的端到端总耗时connDuration延迟字段 2建立连接DNS TCP花了多久dnsDuration延迟字段 3DNS 解析花了多久reqDuration延迟字段 4发送请求体写入花了多久delayDuration延迟字段 5写完请求后等多久才收到第一个响应字节resDuration延迟字段 6从首个字节到读完整个响应体花了多久上面 6 个延迟字段就是本文的主角而offset更像一枚时间戳标记请求的出生时刻。所有时间都以压测进程启动为零点取时工具函数now()见 requester/now_other.go。6 个延迟字段怎么测出来的httptrace 钩子hey 并不靠猜来得到这些耗时。秘密在makeRequest里的一组 httptrace 钩子标准库的httptrace.ClientTrace会在 HTTP 请求的每个关键节点触发回调hey 在每个节点精确记一次时钟。回调钩子覆盖阶段记录的字段DNSStart→DNSDoneDNS 解析前 → 后dnsDurationGetConn→GotConn申请连接前 → 后仅新建连接connDurationGotConn→WroteRequest连接就绪 → 请求写完reqDurationWroteRequest→GotFirstResponseByte请求写完 → 收到首字节delayDurationGotFirstResponseByte→ 读完响应首字节 → 响应体读完resDuration一个请求的完整生命周期可以想象成一条直线时间轴开始 (offset) ├─ DNS 解析 (dnsDuration) ─┐ ├─ TCP 建连 (connDuration) ─┘ 仅新建连接时发生 ├─ 写请求 (reqDuration) ├─ 等待服务器处理 首字节 (delayDuration) ← 最关键 └─ 读响应体 (resDuration) 结束 (duration ≈ 以上全部相加)几个值得注意的细节复用连接时connDuration为 0keep-alive 下大多数请求复用同一条 TCP 连接建连耗时只出现在新连接上这正是判断连接复用是否生效的依据dnsDuration是connDuration的子集新建连接时DNS 时间包含在建连时间内delayDuration代表服务器时间请求已发出剩下的等待基本就是服务端在处理是排查接口性能最关键的字段duration是端到端总耗时复用连接时约等于 req delay res 三项之和从单条记录到统计报告Summary 里的 Details 区块每条result是一个人的病历而 reporter 会把它们逐条累加对 6 个延迟字段同时记录总和算平均值和逐条明细算最快/最慢与分位数。压测结束后finalize 除以样本数得到均值明细排序后得到各阶段的最大最小值。Summary 输出中的 Details 区块正是这份统计的体现每行格式为平均、最快、最慢Details (average, fastest, slowest): DNSdialup: 0.0123 secs, 0.0456 secs, 0.0000 secs DNS-lookup: 0.0045 secs, 0.0123 secs, 0.0000 secs req write: 0.0001 secs, 0.0003 secs, 0.0001 secs resp wait: 0.0345 secs, 0.2100 secs, 0.0089 secs resp read: 0.0056 secs, 0.0321 secs, 0.0012 secs5 行对应 5 个阶段字段端到端总耗时duration则体现在 Summary 的 Average / Fastest / Slowest、响应时间直方图和分位数分布中。完整输出模板见 requester/print.go。报告行对应字段偏高说明什么DNSdialupconnDuration建连慢DNS 慢、离服务器远、新连接多DNS-lookupdnsDurationDNS 解析是瓶颈无缓存、DNS 服务器远req writereqDuration请求体过大大 body / 上传resp waitdelayDuration服务器处理慢——最该优先排查resp readresDuration响应体过大或下行链路慢CSV 模式逐条查看每个请求的一生想更精细地分析——比如找出哪个请求是黑天鹅——可以用-o csv把每个请求输出为一行 CSV8 列与 result 字段一一对应列定义说明就在 requester/print.go 的文件头部注释中hey -n 200 -c 20 -o csv https://example.comCSV 列对应字段response-timedurationDNSdialupconnDurationDNSdnsDurationRequest-writereqDurationResponse-delaydelayDurationResponse-readresDurationstatus-codestatusCodeoffsetoffset配合offset列还能回答更多问题慢请求是开头并发洪峰造成的还是中途某次服务器抖动这正是逐请求数据的价值所在。三个实战排障场景用 6 个延迟字段可以快速回答三个高频问题场景一接口慢是客户端还是服务器的问题看resp waitdelayDuration。若它占duration的大头说明服务端处理慢去查 SQL、下游依赖、GC若它很小但resp read大则是响应体问题体积过大、未开压缩。场景二为什么压测结果比线上明显慢看DNSdialupconnDuration。偏大说明新连接多可能是压测机离目标远、连接池没生效或误开了-disable-keepalive——关掉再对比一次即可验证。场景三结果稳不稳有没有偶发尖刺看 fastest 与 slowest 的差距。fastest 10ms 而 slowest 500ms说明问题不是整体慢而是尾延迟高再配合 CSV 的offset列就能定位尖刺发生的时刻。总结hey 的 result 结构体 虽小却是整个压测工具的数据骨架6 个延迟字段duration、connDuration、dnsDuration、reqDuration、delayDuration、resDuration采集机制httptrace 钩子在每个阶段打精确时间戳汇总输出reporter 将逐条记录累加为平均值、最值、分位数与直方图两种视角Summary 看整体趋势CSV 模式看单请求明细下次压测报告里 resp wait 飙高时你就不只是看到一串数字而是清楚地知道该去查服务器了。【免费下载链接】heyHTTP load generator, ApacheBench (ab) replacement项目地址: https://gitcode.com/GitHub_Trending/he/hey创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑