Hey压测工具result结构体深度解析:6个延迟字段如何读懂一次请求的一生
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),仅供参考

相关新闻

面向对象程序设计-类与对象1-衣服Clothing类定义

面向对象程序设计-类与对象1-衣服Clothing类定义

作者 xyzyl单位 惠州学院按题目的输入输出样例定义一个Clothing类。包括四个私有数据成员:string brand;string material;double price;string size;五个公有成员函数setBrand(), setMaterial(), setPrice(), setSize()和showInfo()裁判测试程序样例:在这…

2026/10/5 9:08:04 阅读更多 →
19_实验十八_认识Linux内核

19_实验十八_认识Linux内核

实验十八 认识 Linux 内核——版本号、源码目录与"内核文件四兄弟"对应课件:《第5章 移植Linux内核》5.1~5.3 节,Slide 2-24 系列说明:本系列基于华清远见 FS-MP1A(STM32MP157A)开发板,对应课件《…

2026/10/4 7:44:17 阅读更多 →
可启动ISO是如何造出来的?图解macos-iso-builder的hdiutil与createinstallmedia镜像流水线(无需Mac)

可启动ISO是如何造出来的?图解macos-iso-builder的hdiutil与createinstallmedia镜像流水线(无需Mac)

可启动ISO是如何造出来的?图解macos-iso-builder的hdiutil与createinstallmedia镜像流水线(无需Mac) 【免费下载链接】macos-iso-builder Generate bootable macOS installer ISO or DMG images directly from Apple servers via GitHub Acti…

2026/10/5 13:49:24 阅读更多 →

最新新闻

遥感生态指数RSEI模型原理与GEE实现全解析

遥感生态指数RSEI模型原理与GEE实现全解析

这些年做生态环境遥感评估,我周围很多同行一开始都习惯用NDVI单指标来看一个区域的生态状况,但说实话,单看绿度太片面了。一个城市周边可能有大量农田,NDVI很高,但地表温度、建筑裸土占比这些生态压力因素完全没体现出…

2026/10/5 14:01:23 阅读更多 →
CH340N Type-C转串口模块设计全流程:原理图到调试

CH340N Type-C转串口模块设计全流程:原理图到调试

CH340N这颗芯片,凡是玩单片机、折腾串口调试的人,大概率都见过。最近两年USB Type-C接口普及之后,基于CH340N做的Type-C转TTL小模块越来越多,体积比过去CH340G加晶振的方案小了一大截,插上电脑就能识别成一个串口&…

2026/10/5 14:01:22 阅读更多 →
蓝桥杯P8627饮料换购:从模拟循环到数学公式的解法剖析

蓝桥杯P8627饮料换购:从模拟循环到数学公式的解法剖析

看到 P8627 [蓝桥杯 2015 省 A] 饮料换购,熟悉蓝桥杯的朋友应该会心一笑——这是省赛里少见的“送分题”。但别急着得意,我身边很多同学在这道题上翻过车:有人把简单模拟写成了死循环,有人算出了错误的总瓶数,还有人明…

2026/10/5 14:01:22 阅读更多 →
基于Hadoop+Spark+Hive与TensorFlow的招聘薪资预测及岗位推荐系统实战

基于Hadoop+Spark+Hive与TensorFlow的招聘薪资预测及岗位推荐系统实战

每年到了毕业设计的高峰期,总能看到一批批类似“薪资预测系统”“招聘岗位推荐”的题目涌进来。这个方向之所以长盛不衰,本质上是踩中了当下两个最热的赛道:大数据处理和机器学习应用。你只要走进任何一个招聘软件的后台,就会发现…

2026/10/5 14:01:22 阅读更多 →
Supacode Worktree工作流实战:如何让多个AI编码Agent并行开发互不冲突

Supacode Worktree工作流实战:如何让多个AI编码Agent并行开发互不冲突

Supacode Worktree工作流实战:如何让多个AI编码Agent并行开发互不冲突 【免费下载链接】supacode worktree coding agents command center. 项目地址: https://gitcode.com/gh_mirrors/su/supacode Supacode 是一款 macOS 原生的 AI 编码 Agent 并行指挥中心…

2026/10/5 14:01:21 阅读更多 →
3D打印Pre-IPO估值30亿背后:设备、材料与应用生态的决胜点

3D打印Pre-IPO估值30亿背后:设备、材料与应用生态的决胜点

刚刷到这条融资消息的时候,我第一反应不是“哇,30亿”,而是“Pre-IPO”这三个字比数字本身更有意思。苏州,3D打印,投前估值30亿,这几个词叠在一起,基本能确定一件事:这个行业已经从“…

2026/10/5 14:00:21 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →