curl -w 可精准拆解http请求各阶段耗时:dns解析、tcp连接、tls握手(https专属)、ttfb及总耗时,需配合-o /dev/null、-s和-w使用,单位为秒(纳秒级精度),支持相减推导子阶段耗时并定位网络或服务瓶颈。

用 curl -w 输出 HTTP 请求各阶段耗时,关键不是堆砌变量,而是让时间维度对齐、单位统一、逻辑可读——一张清晰的分布表,能直接对应到网络链路或服务瓶颈。
核心命令结构:干净输出 + 精确格式
基础写法必须包含三个控制项:-o /dev/null(不保存响应体)、-s(静默模式,屏蔽进度条)、-w(自定义输出)。否则时间值会被干扰或混入无关信息。
- 推荐单行命令示例:
curl -o /dev/null -s -w "DNS:%{time_namelookup}\nTCP:%{time_connect}\nTLS:%{time_appconnect}\nTTFB:%{time_starttransfer}\nTotal:%{time_total}\n" https://httpbin.org/get
- 输出单位默认是秒,含6位小数(纳秒级精度),适合比对微小差异;如需毫秒,可在后续用
awk '{printf "%.2f", $1*1000}'转换 - HTTPS 请求中
%{time_appconnect}有实际值,HTTP 则恒为 0,这是判断协议是否启用 TLS 的快捷方式
各阶段时间含义与典型问题定位
每个变量代表请求生命周期中一个明确边界,不是孤立数值,而是可相减推导出子阶段耗时:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
DNS 解析耗时(%{time_namelookup}):从发起请求到拿到 IP 地址。若 >100ms,优先检查本地 DNS 配置或尝试加
--dns-servers 8.8.8.8绕过缓存 -
TCP 连接耗时(%{time_connect}):含 DNS 时间,即“DNS + 建连”。单纯建连时间 =
%{time_connect} - %{time_namelookup};若该差值 >50ms,可能是网络延迟高或服务端 SYN 队列积压 - TLS 握手耗时(%{time_appconnect}):仅 HTTPS 有效,从开始到 Finished 包完成。明显高于 300ms?关注证书链长度、服务器 TLS 版本协商或客户端信任库更新状态
-
TTFB(%{time_starttransfer}):首字节到达时间,等于“DNS + TCP + TLS + 服务端处理”。它减去
%{time_pretransfer}就是纯后端逻辑耗时(如数据库查询、模板渲染) -
总耗时(%{time_total}):含 TTFB + 响应体下载时间。若
%{time_total} - %{time_starttransfer}显著偏大,说明响应体体积大或带宽受限
进阶技巧:生成可读性更强的分布表
直接终端输出适合单次调试,批量分析或报告需要结构化。可用以下方式提升实用性:
- 把格式写入文件(如
curl-format.txt),内容如下:
URL: %{url_effective}\nStatus: %{http_code}\nDNS: %{time_namelookup}s\nTCP: %{time_connect}s\nTLS: %{time_appconnect}s\nPreXfer: %{time_pretransfer}s\nTTFB: %{time_starttransfer}s\nTotal: %{time_total}s\nSize: %{size_download} bytes\nSpeed: %{speed_download} B/s\n
- 执行时用
-w "@curl-format.txt"调用,结果更规整,也方便重定向到 CSV 或日志 - 加
-L支持重定向追踪,此时%{time_redirect}会记录全部跳转开销,配合%{redirect_url}可还原完整路径 - 多次测试取平均?用 shell 循环 +
awk汇总,例如统计 5 次 TTFB 平均值:for i in {1..5}; do curl -o /dev/null -s -w "%{time_starttransfer}\n" u; done | awk '{sum += $1} END {printf "%.4f", sum/NR}'
避坑提醒:影响精度的常见干扰项
真实环境测试容易被隐性因素扭曲结果,务必主动排除:
- 连接复用:默认 curl 会复用 TCP 连接,导致第二次起的
%{time_connect}接近 0。加--no-keepalive强制每次新建连接 - DNS 缓存:系统或 libc 层缓存会影响
%{time_namelookup}。用--dns-servers 1.1.1.1或--resolve example.com:443:93.184.216.34锁定解析结果 - 服务端缓存:加
-H "Cache-Control: no-cache"和-H "Pragma: no-cache"减少 CDN 或反向代理返回缓存响应 - SSL 会话复用:HTTPS 下
%{time_appconnect}偏低可能因会话复用。加--ciphers DEFAULT@SECLEVEL=1或临时禁用会话票证测试真实握手成本










