用curl拆开访问耗时:DNS、连接和首包

“网站打开要两秒”还不足以判断该加带宽、改程序还是查网络。curl 可以把一次请求的几个时间点列出来,帮助缩小范围。它测的是一个 URL 的传输过程,不包含浏览器随后加载的其他文件、执行脚本和绘制页面。

选一个能安全重复访问的地址

下面适用于 Linux、macOS 终端,目标是自己管理的网站首页、公开静态文件或只读健康检查。www.example.com 和 /healthz 都是占位示例,必须换成确实存在且不会改变业务数据的地址。不要用下单、支付、发信接口做反复测试。

curl -q --noproxy '*' --http1.1 -sS \
  --connect-timeout 5 --max-time 20 \
  -o /dev/null \
  -w 'HTTP=%{http_code} IP=%{remote_ip}\nDNS=%{time_namelookup}\nTCP_DONE=%{time_connect}\nTLS_DONE=%{time_appconnect}\nREADY=%{time_pretransfer}\nFIRST_BYTE=%{time_starttransfer}\nTOTAL=%{time_total}\n' \
  'https://www.example.com/healthz'
printf 'curl_exit=%s\n' "$?"

输出时间的单位全部是秒。-q 放在第一项以排除默认配置;--noproxy '*' 排除终端代理;连接阶段最多等待5秒,整个请求最多20秒。-o /dev/null 只是丢弃下载内容,请求仍会读取响应体,因此 TOTAL 包括传输过程。

本例固定 HTTP/1.1,便于按 TCP 和 TLS 拆分。浏览器可能使用 HTTP/2、HTTP/3 或复用连接,所以不能把这组数字直接当成浏览器整页加载时间。为避免把多个请求混在一起,示例没有加入自动跟随跳转参数。

这些是累计时间点,不能直接相加

假设一次请求显示如下数据。以下数字仅用于说明计算方法,并非宝乐云线路或产品性能指标:

HTTP=200 IP=203.0.113.10
DNS=0.012000
TCP_DONE=0.045000
TLS_DONE=0.080000
READY=0.081000
FIRST_BYTE=0.230000
TOTAL=0.250000
curl_exit=0
想观察的阶段 本例计算 说明
名称解析 DNS=0.012秒 从请求开始到解析完成,不等于必然发出了一次公网DNS查询。
TCP连接 TCP_DONE-DNS=0.033秒 本例新建连接时的阶段近似值。
TLS握手 TLS_DONE-TCP_DONE=0.035秒 只适用于这里的HTTPS请求;普通HTTP不能照减。
传输准备后等待首字节 FIRST_BYTE-READY=0.149秒 仍包含网络往返、排队及服务端处理等,不能直接当成程序或数据库耗时。
收到首字节到完成 TOTAL-FIRST_BYTE=0.020秒 包含余下响应传输,需结合内容大小判断。

FIRST_BYTE 已经包含前面的解析、连接和准备时间;把 DNS、TCP_DONE、TLS_DONE、FIRST_BYTE 全部相加会重复计算。以上拆分只用于本例“单次、无跳转、新建连接”的简单对照。连接复用、代理或重定向等场景需要重新理解各时间点,不能机械套公式。

先排除失败请求和错误页面

命令最后的 curl_exit 是传输退出码。返回0只表示 curl 完成了这次传输;本例没有启用按HTTP错误状态失败的选项,所以收到404或500时也可能返回0。应同时看 HTTP 状态、目标IP及实际业务结果。

出现证书错误、解析失败或超时,应先处理该错误;HTTP=000 表示没有取得可报告的HTTP响应码,某些阶段为0也不能解释成“特别快”。遇到301、302等跳转时,记录当前响应的 Location,按重定向排查找出最终安全地址,再对那个地址单独测量。

把慢的阶段与下一步检查对应起来

  • 解析阶段明显增长:检查当前机器的解析器与域名实际解析路径,可接着看Linux DNS排查。不同缓存状态的结果要分开比较。
  • TCP或TLS阶段增长:记录测试位置、网络、时间和IP,检查连接路径、丢包与证书握手,不要只依据一次请求认定线路故障。
  • 首字节等待增长:同一时间核对反向代理和应用日志、后端连接、资源压力。静态小文件快而动态接口慢,是继续查应用链路的线索。
  • 首字节快、后续传输慢:比较相同资源的大小、传输限制和实际下载情况;一个很小的文件无法用来估算可用带宽。

在同一位置、同一URL连续做3到5次轻量检查,每次之间留几秒,保留每一次结果及目标IP,不只摘最快或最慢的一次。再从另一条网络作同条件对照。提交问题时附时间和时区、测试位置、状态码、退出码、各阶段耗时,并按照网络工单资料清单补充必要信息;不要附带Cookie、令牌或有敏感参数的完整URL。