curl 测网页慢在哪里:DNS、连接、TLS 和首字节怎样看
curl 的时间值大多从请求开始累计,不能直接当各阶段耗时。用同一请求条件记录状态、连接地址与时间,区分 CDN、代理和应用处理。
文章目录
网页打开慢,终端只测一个 time_total,还不知道时间花在解析、连线、TLS 握手还是等待响应。curl 能输出这些时间点,但大多是累计值,理解方式比多打印几个字段更重要。
保存一次能比较的请求
以下请求不带登录信息,对自己管理的页面测试,域名需要替换:
curl -sS -o /dev/null --connect-timeout 10 --max-time 30 \
-w 'status=%{http_code}\nip=%{remote_ip}\ndns=%{time_namelookup}\nconnect=%{time_connect}\ntls=%{time_appconnect}\npretransfer=%{time_pretransfer}\nfirst_byte=%{time_starttransfer}\ntotal=%{time_total}\n' \
'https://site.example/article'
超时数字只是示例。这里没有 -L,先测当前 URL 的这一次响应;如果它返回重定向,先查看目标,再另测目标页面。把多跳请求与单跳请求混着比较,会误读结果。
同时确认命令退出状态。连接超时或 HTTP 错误时,打印出的部分时间不能当作一次正常页面成功响应的耗时。
时间点怎样拆开
对常见的新建 HTTPS 连接,time_namelookup 是解析完成时点,time_connect 是 TCP 连接完成时点,time_appconnect 是 TLS 等应用层连接完成时点。粗略观察可用相邻时点的差值。
time_starttransfer 是收到首字节的时点,包含此前阶段;它不等于纯服务器执行时间。time_pretransfer 到首字节之间还会涉及请求传输、网络往返、代理和服务器处理。time_total 减首字节时间,反映后续传输的部分,也不能完全隔离网络与客户端影响。
连接复用、代理和不同协议可能让某些字段接近零或具有不同背景。对有重定向的 -L 请求,应同时记录跳转次数与 time_redirect,不能继续套单跳的减法就认为找到了服务器瓶颈。
连接地址未必是源站
有 CDN 的网站,remote_ip 往往是边缘地址。测到边缘很快,不能证明数据库没有问题;边缘缓存命中也可能避开了源站。
需要比较指定地址时,可以保留域名与 TLS 验证,用 curl 的 resolve 选项:
curl --resolve 'site.example:443:192.0.2.10' \
-sS -o /dev/null -w '%{http_code} %{time_total}\n' \
'https://site.example/article'
地址是文档示例,替换为你有权访问的实际地址。目标必须能用这个域名正常处理 HTTPS;不使用 -k 把证书问题藏起来。源站限制访问时,按既有权限判断,不为测量扩大暴露面。
留下可重复的条件
同一客户端、同一 URL、相近时间做少量重复测量,记录是否使用代理、IPv4/IPv6、是否缓存命中以及是否带认证。看到一次很快或很慢,只能作为线索;要定位间歇问题,还应结合应用日志和同期负载。
curl 测一次请求,不会下载并执行网页全部脚本、图片,也不衡量浏览器渲染时间。字段定义与 --resolve 行为见 curl 官方手册。响应状态涉及缓存时,可结合 304 与 ETag 的检查方法。











