用 curl -w 拆开一次 HTTP 请求的耗时

举报
yd_51737554 发表于 2026/10/30 10:44:32 2026/10/30
【摘要】 接口变慢的时候,浏览器的网络面板不一定打得开。登录云主机排查,手头往往只有 curl。很多人只看它打出来的状态码,状态码是 200 就以为“不慢”。其实同一次请求里,时间可能花在域名解析、TCP 握手、TLS、服务端计算,或者正文传输上。curl 的 -w 可以把这些累计时刻打出来,先看清慢在哪一段,再决定查 DNS、查证书、查应用还是查带宽。下面这条命令访问一个公开地址。-s 关掉进度条,...

接口变慢的时候,浏览器的网络面板不一定打得开。登录云主机排查,手头往往只有 curl。很多人只看它打出来的状态码,状态码是 200 就以为“不慢”。其实同一次请求里,时间可能花在域名解析、TCP 握手、TLS、服务端计算,或者正文传输上。curl 的 -w 可以把这些累计时刻打出来,先看清慢在哪一段,再决定查 DNS、查证书、查应用还是查带宽。

下面这条命令访问一个公开地址。-s 关掉进度条,-o /dev/null 丢掉正文,只保留计时。把网址换成自己的健康检查接口即可。

curl -s -o /dev/null -w ‘dns:%{time_namelookup} connect:%{time_connect} tls:%{time_appconnect} ttfb:%{time_starttransfer} total:%{time_total} code:%{http_code}\n’ 你的健康检查地址

这些 time_ 字段都是从发起请求开始累计的秒数,不是每一段单独的时长,读的时候要做减法。

time_namelookup 是 DNS 完成的时刻。它经常超过零点二秒时,先看本机的解析配置和云上的 DNS,而不是先改业务代码。

time_connect 减去 time_namelookup,是 TCP 三次握手。跨地域访问这一段会明显变长,同一可用区里通常只有几毫秒。如果这里就很大,加机器解决不了,要先看链路和安全组是否绕远。

time_appconnect 减去 time_connect,是 TLS 握手。证书链太长,或者还在协商过时的协议版本,这一段会被抬高。访问的是明文 HTTP 时,这项为 0,不必紧张。

time_starttransfer 减去 time_appconnect,是服务端从收齐请求到吐出第一个字节的时间,也就是 TTFB。应用逻辑慢、数据库慢、网关排队,多半体现在这里。

time_total 减去 time_starttransfer,是正文下载。大文件、没有压缩、带宽不够,会体现在这一段,而不是 TTFB。接口只返回几十字节时,这一段应该接近 0。

只测一次不够。网络抖动会让单次结果骗人。同一个地址连跑五次,丢掉最高和最低,看中间三次的 TTFB 是否稳定。DNS 一次快一次慢,多半是缓存没命中,不要据此判断服务本身坏了。

还有两个容易看错的地方。第一,curl 默认会复用连接,紧接着的第二次请求,connect 可能接近 0。要比建连成本,加上 --no-keepalive,或者每次都新开一个进程。第二,前面如果有 HTTP 代理,time_connect 量的是到代理的时间,不是到源站的时间,结论会偏。需要看源站时,先确认没有 http_proxy 环境变量。

我把这条命令和 ss、journalctl 放在同一条排障顺序里:先确认端口在听,再确认服务日志没有报错,最后用 curl -w 看时间花在哪一段。三段对得上,才值得打开性能分析工具。否则很容易在错误的一层上耗一下午。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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