curl -w 拆解接口耗时:从 DNS 解析到 TTFB 的慢请求定位实战

举报
yd_239575663 发表于 2026/11/01 21:00:03 2026/11/01
【摘要】 接口偶发变慢时,用 curl -w 把 DNS 解析、TCP 建连、TLS 握手、TTFB 各阶段耗时拆开,一行命令定位慢请求瓶颈,附慢因对照表与多次采样、shell 函数等进阶用法。

背景

线上接口偶发变慢,浏览器开发者工具只给一个总耗时,看不出时间到底花在哪一步。上周排查一个内部接口超时,靠猜测折腾了半天,最后发现是 DNS 解析偶发抖动。从那以后,凡是遇到“接口慢”,我第一反应都是先用 curl 的 -w 参数把各阶段耗时拆出来,一行命令就能定位慢在 DNS、建连、TLS 还是服务端处理。

核心命令

curl -o /dev/null -s -w 'dns:%{time_namelookup} connect:%{time_connect} tls:%{time_appconnect} pretransfer:%{time_pretransfer} starttransfer:%{time_starttransfer} total:%{time_total}\n' https://example.com/api/health
  • -o /dev/null -s:丢弃响应体并静默,避免下载大 body 干扰计时
  • time_namelookup:DNS 解析耗时
  • time_connect:TCP 建连完成耗时(含 DNS)
  • time_appconnect:TLS 握手完成耗时(HTTPS 才有意义)
  • time_pretransfer:开始发送请求前的准备耗时(含 TLS)
  • time_starttransfer:收到首字节耗时,即 TTFB
  • time_total:请求总耗时

实战解读

一次真实的输出长这样:

dns:0.012 connect:0.045 tls:0.132 pretransfer:0.133 starttransfer:0.412 total:0.415

注意这些值是“从请求开始算起”的累计值,相邻两项相减才是该阶段的增量:

  • DNS 增量 = dns 本身(0.012s,正常)
  • TCP 建连增量 = connect - dns(0.033s,正常)
  • TLS 握手增量 = appconnect - connect(0.087s,略高)
  • 服务端处理 ≈ starttransfer - pretransfer(0.279s,这是大头)

结论很清楚:慢主要慢在服务端处理,TLS 顺带看一眼即可,不用在网络层浪费时间。

常见慢因对照

哪一段偏大 可能原因 排查方向
dns 大 本地 DNS 慢或被劫持 换公共 DNS(如 223.5.5.5)、检查 /etc/resolv.conf
connect - dns 大 网络抖动、跨运营商 mtr 看路由跳数与丢包
appconnect - connect 大 TLS 握手慢、证书链过长 检查证书链完整性、开启 TLS 会话复用
starttransfer - pretransfer 大 服务端处理慢 查服务端日志、慢 SQL、GC 停顿
total - starttransfer 大 响应体大或带宽不足 开启压缩、接口分页、走 CDN

进阶用法

1. 多次采样取中位数:单次请求可能正好撞上抖动,循环几次再看:

for i in 1 2 3 4 5; do curl -o /dev/null -s -w '%{time_total}\n' https://example.com/api/health; done

2. 写成 shell 函数:放进 ~/.bashrc,以后随手调用:

ct(){
  curl -o /dev/null -s -w 'dns:%{time_namelookup} tcp:%{time_connect} tls:%{time_appconnect} ttfb:%{time_starttransfer} total:%{time_total}\n' "$@"
}

3. 压测前先定基线:压测之前先用它确认接口本身各阶段耗时,区分“网络慢”还是“服务慢”,避免压测结论背锅。

小结

接口慢不要先猜,curl -w 把时间拆开再看:DNS、建连、TLS、TTFB 四段一减,慢在哪一段一目了然,再顺着上面的对照表去查,排查效率至少翻倍。建议把那个 ct 函数加进你的常用工具箱。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。