当前位置:首页 > 文章列表 > 文章 > linux > curl 怎么分别查看 DNS、连接和首字节耗时

curl 怎么分别查看 DNS、连接和首字节耗时

来源:17golang原创 2026-09-06 00:47:31 0浏览 收藏

只看 curl 的总耗时,只能知道“这次请求花了多久”,不能知道慢在 DNS、TCP 连接、TLS 握手、服务端计算还是响应传输。最实用的办法是用 --write-out(简写 -w)一次打印累计时间,再用相邻字段相减得到每个阶段的耗时。

要点速览
  • time_namelookuptime_connecttime_appconnecttime_starttransfertime_total 都是从请求开始计算的累计时间。
  • DNS、TCP、TLS 等阶段时间不能直接把累计字段当结果,要用相邻字段做差。
  • --write-out 配合 -o /dev/null 可以把正文丢弃,只保留适合日志记录的一行指标。
  • 代理、重定向、连接复用和单次网络抖动都会改变口径,定位服务端问题前要先排除这些因素。
curl 时间字段与解析连接握手首字节完整传输的静态关系图
图1:curl 时间字段与请求阶段的静态对应关系;字段是累计值,具体阶段耗时需要用相邻字段相减。

curl 的时间字段分别代表什么

先记住一个关键点:curl 的时间变量默认是“从本次传输开始到某个节点完成”的累计秒数,而不是每一段独立的秒数。官方手册把 time_namelookup 定义为名称解析完成时间,把 time_connect 定义为 TCP 连接完成时间;HTTPS 场景还可以用 time_appconnect 表示 TLS 握手完成时间。

字段它回答什么常见用法
time_namelookup从开始到名称解析完成多久观察 DNS 阶段的累计位置
time_connect从开始到 TCP 连接完成多久与前一字段相减得到 TCP 耗时
time_appconnect从开始到 TLS/SSH 握手完成多久HTTPS 中与连接时间相减
time_pretransfer开始传输前的准备完成多久覆盖握手及协议准备
time_starttransfer从开始到收到首字节多久观察服务端等待和首包延迟
time_total完整操作结束多久与首字节时间相减得到后续传输

所以标题中的“DNS、连接、首字节”分别对应 time_namelookup 的累计位置、time_connect 的累计位置,以及 time_starttransfer 的累计位置。它们不是三支互不相关的计时器,而是同一次请求上逐步增加的观察点。

怎样一次输出可比较的耗时数据

排查时建议把响应体丢到 /dev/null,同时保留错误信息和格式化指标。下面这条命令适合手工执行,也适合放进临时采样脚本:

curl -sS -o /dev/null \
  -w 'code=%{http_code} remote=%{remote_ip}\nDNS=%{time_namelookup}s TCP=%{time_connect}s TLS=%{time_appconnect}s pre=%{time_pretransfer}s first_byte=%{time_starttransfer}s total=%{time_total}s\n' \
  'https://example.com/health'
# -sS 保留错误信息;-o 丢弃响应体;-w 只输出本次传输的测量字段

-w 的格式字符串中,变量写成 %{变量名},换行写成 \n。输出中的 coderemote 不是耗时字段,但很重要:同一个域名可能解析到不同地址,状态码也能帮助你区分“服务端很快返回错误”和“服务端迟迟没有首字节”。

HTTP 明文请求没有 TLS 握手,time_appconnect 可能是零;不要因此把它当成一次失败。HTTPS 请求则要把证书和加密握手包含在连接分析里。为了让多次结果容易比较,尽量固定 URL、代理设置和请求方法,连续采样几次再看分布。

用字段差值判断慢在哪里

拿到一行输出后,按照下面的关系把累计值还原成阶段值:

DNS耗时 = time_namelookup
TCP耗时 = time_connect - time_namelookup
TLS耗时 = time_appconnect - time_connect
准备耗时 = time_pretransfer - time_appconnect
服务端等待 = time_starttransfer - time_pretransfer
响应传输 = time_total - time_starttransfer
# 每一行都使用相邻累计节点,避免把累计时间重复相加

例如 time_namelookup 很小但 time_connect - time_namelookup 很大,优先检查网络路径、代理或目标端口,而不是先改 DNS。若连接阶段正常,time_starttransfer - time_pretransfer 却明显偏大,才更像服务端排队、数据库查询或应用计算拖慢首包。首字节已经很快、但 time_total - time_starttransfer 很大,则应转向响应体大小、带宽和接收窗口排查。

curl 累计时间字段通过相减得到 DNS TCP TLS 服务端等待和响应传输耗时的关系图
图2:用相邻累计字段相减得到可排查的阶段耗时;右侧结果只表示测量口径,不是固定性能阈值。

结果异常时先排除四个测量边界

代理会改变连接的解释

如果环境设置了 HTTPS_PROXY 或显式使用 --proxytime_connect 记录的可能是到代理的 TCP 连接,而不是到最终业务服务器的直连时间。文章里的差值仍然有效,但结论应写成“客户端到代理慢”或“代理之后慢”,不要直接归因于源站。

重定向会让一次请求包含多个 URL

加上 -L 后,curl 会跟随重定向。此时总耗时可能包含多个解析、连接和响应阶段,最后一组 remote_ip 也可能不是初始地址。要定位首个跳转,先不加 -L 看响应头,再分别测最终 URL。

连接复用会让后续请求看起来更快

同一次 curl 命令里请求多个 URL 时,curl 会尝试复用连接;但不同的 curl 进程之间不能复用连接。因此“同一命令第二次很快”与“单独启动一次 curl 很快”不是一个实验。压测或巡检要明确是否要测冷连接,并记录 num_connects 作为辅助信息。

单次读数不能代替连续采样

DNS 缓存、TCP 拥塞、代理负载和服务端排队都可能造成偶发尖峰。可以把格式字符串放入循环,每次记录时间戳、状态码、远端地址和五个时间字段,然后比较中位数与高分位,而不是只拿某一次最大值下结论。

常见问题

只想看首字节耗时,最少要输出哪个字段?

输出 %{time_starttransfer} 即可,但它仍是从请求开始算的累计时间。要看服务端从“准备完毕”到首字节的等待,应计算 time_starttransfer - time_pretransfer

为什么 DNS 耗时和 time_namelookup 不是总能对上?

在单 URL、没有特殊代理和重定向的简单请求中,二者可以近似对应;遇到 DoH、代理、连接复用或多次传输时,实际解析路径和统计边界会变化,应结合完整输出判断。

curl 输出的 total 比各段直接相加小,正常吗?

正常。累计字段之间存在重叠,正确做法是使用相邻字段相减;不要把所有累计字段相加,否则会重复计算。

time_namelookuptime_connecttime_appconnecttime_pretransfertime_starttransfertime_total 一起记录,再用相邻值做差,curl 就不只是“请求是否成功”的工具,也能成为一把边界清楚的网络排查尺。

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go 文件下载怎么支持断点续传和 Range 请求Go 文件下载怎么支持断点续传和 Range 请求
上一篇
Go 文件下载怎么支持断点续传和 Range 请求
自动点击器脚本怎么导入和恢复?文件识别、权限失效与安卓兼容说明
下一篇
自动点击器脚本怎么导入和恢复?文件识别、权限失效与安卓兼容说明
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • SuperCLUE中文大模型评测基准:功能、能力维度与应用指南
    SuperCLUE
    SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
    157次使用
  • C-Eval中文评测基准:大语言模型多学科能力评估指南
    C-Eval
    深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
    86次使用
  • ClickPrompt:AI提示词生成与优化工具,支持Stable Diffusion、ChatGPT及代码辅助
    ClickPrompt
    ClickPrompt是一款专为AI提示词编写者设计的开源在线工具,支持Stable Diffusion绘图、ChatGPT对话及GitHub Copilot代码辅助。提供Prompt自动生成、一键运行、社区分享及可视化优化功能,帮助用户高效获取精准AI输出。
    46次使用
  • PromptHero官网:AI提示词搜索、优化与学习平台,支持Midjourney/Stable Diffusion
    PromptHero
    PromptHero是专业的AI提示词搜索引擎与优化平台,支持Stable Diffusion、Midjourney等主流模型。提供海量提示词库、分类搜索、在线课程及社区互动,助力用户高效生成高质量AI图像与文本。
    26次使用
  • OpenArt免费开源指南:Stable Diffusion Prompt Book提示词手册详解
    Stable Diffusion Prompt Book
    深入解析OpenArt推出的Stable Diffusion Prompt Book,这本免费的开源提示词指南涵盖从基础语法到高级技巧,提供风格化词库与参数建议,助您优化AI绘画生成效果。
    29次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码