curl -w 可精确测量 HTTP 请求各阶段耗时,关键在于用 -o /dev/null -s -w 组合输出 DNS、TCP、TLS、TTFB 和总耗时等变量,单位为秒,支持诊断网络、服务端及证书问题。

用 curl -w 查 HTTP 请求各阶段耗时,核心是把时间变量嵌入自定义输出格式,并配合静默和丢弃响应体的选项,让结果干净、可读、可复用。
基础命令结构:精简输出的关键组合
最常用的一行命令已足够诊断大多数问题:
-
-o /dev/null:不保存响应内容,避免干扰时间统计 -
-s:关闭进度条和错误提示,只留-w输出 -
-w "...":直接写格式字符串,支持换行(\n)和变量(如%{time_connect}) - 对 HTTPS 站点,
time_appconnect会显示 TLS 握手耗时;HTTP 则恒为 0
示例:
curl -o /dev/null -s -w "DNS: %{time_namelookup}s\nTCP: %{time_connect}s\nTLS: %{time_appconnect}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\n" https://httpbin.org/get
各阶段时间变量含义与典型排查指向
这些变量单位都是秒(含小数),从请求发起时刻开始累计计时:
- time_namelookup:DNS 解析完成耗时 → 偏高说明本地 DNS 配置慢、域名未缓存或解析服务器响应差
-
time_connect:TCP 连接建立完成 → 包含 DNS 时间,减去
time_namelookup即纯连接耗时;若差值大,可能是网络延迟或服务端 SYN 队列积压 - time_appconnect:SSL/TLS 握手完成 → HTTPS 专属;超过 300ms 常见于证书链长、OCSP 检查阻塞、或客户端信任库缺失中间证书
-
time_starttransfer:首字节到达(TTFB)→ 反映服务端处理逻辑+网络往返,等于
time_pretransfer + 服务端处理时间 -
time_total:整个请求结束 → 减去
time_starttransfer就是响应体下载耗时,可用于判断带宽或大响应瓶颈
进阶技巧:提升测试准确性
默认 curl 可能复用连接或读取系统 DNS 缓存,导致多次测试结果不一致。可加以下参数控制:
-
--dns-servers 8.8.8.8:绕过本地 DNS 缓存,强制走指定 DNS -
--no-keepalive:禁用 HTTP Keep-Alive,每次都是全新 TCP 连接 -
--connect-timeout 5:防止卡在连接阶段,超时即报错 -
-H "Cache-Control: no-cache":提示服务端不返回缓存响应(需服务端配合)
若需批量测试并计算平均值,可结合 shell 循环与 awk 处理:
for i in {1..5}; do curl -o /dev/null -s -w "%{time_total}\n" https://api.example.com; done | awk '{sum += $1} END {printf "Avg: %.3fs\n", sum/NR}'
用文件管理格式:适合长期复用
把格式写进文件(如 curl-format.txt),便于维护和团队共享:
time_namelookup: %{time_namelookup}s
time_connect: %{time_connect}s
time_appconnect: %{time_appconnect}s
time_pretransfer: %{time_pretransfer}s
time_starttransfer: %{time_starttransfer}s
time_total: %{time_total}s
http_code: %{http_code}
size_download: %{size_download} bytes
调用方式:
curl -o /dev/null -s -w "@curl-format.txt" -L https://example.com
-L 表示跟随重定向,此时 time_redirect 变量也会有值,反映全部跳转总开销。


















