跳到主要内容
xzzlog

curl 测网页慢在哪里:DNS、连接、TLS 和首字节怎样看

curl 的时间值大多从请求开始累计,不能直接当各阶段耗时。用同一请求条件记录状态、连接地址与时间,区分 CDN、代理和应用处理。

文章目录
LisaHost:原生与住宅IP产品,按套餐选择
大陆访问,精品线路|搬瓦工 · CN2 GIA / CTGNet 套餐
腾讯云:锐驰型200Mbps峰值带宽,中国内地2核2G50元每月
野草云:香港200Mbps峰值带宽,不限月流量,30元每月起
RackNerd:海外VPS21.99美元每年起
云服务器,积分可续期|雨云 · 国内外节点 · 积分兑换权益
DMIT:Premium中国大陆优化线路CN2GIA
WorkBuddy:交代任务,交付文件
BRNCHost:Bursa土耳其游戏服务器,1Gbps端口,DDoS防护
Evoxt:最高6.0GHz CPU,2.99美元每月起
晚安云:香港云服务器2核2G15元每月
京东云:AI进入真实业务

网页打开慢,终端只测一个 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 的检查方法。

继续阅读 返回顶部