logo NodeSeekbeta

小鸡 Ping 很低,网站却很慢:用 curl 把 DNS、握手和首字节拆开看

讨论建站小鸡的速度时,Ping 和带宽测试很有参考价值,但它们回答不了所有问题。同样是“网页转圈”,可能慢在 DNS、建连、TLS,也可能是应用查数据库或调用外部接口。

可以先测一次完整的 HTTP 请求,把等待时间拆开,再决定查线路还是查应用。下面是一套排查起点,适用于 Linux / macOS 的终端。

先选一个没有跳转、内容相对固定的 HTTPS 地址。 把示例域名和路径换成自己的站点:

curl -q --noproxy '*' -4 --http1.1 -sS -o /dev/null \
  --connect-timeout 5 --max-time 20 \
  -w 'ip=%{remote_ip} code=%{http_code}\ndns=%{time_namelookup} tcp=%{time_connect} tls=%{time_appconnect}\nready=%{time_pretransfer} first=%{time_starttransfer} total=%{time_total} bytes=%{size_download}\n' \
  https://example.com/

这里用 -q 避免个人 curl 配置干扰,--noproxy '*' 排除环境代理,固定 IPv4 和 HTTP/1.1 作为第一组基线。请求仍会完整接收响应正文,只是不显示它;不能用这个结果代替浏览器整页加载时间。变量输出方式见 everything curl。

注意:这些时间大多是从请求开始累计的

例如 tcp=0.12、tls=0.20,不代表 TCP 花了 120ms 后,TLS 又花了 200ms。对于上面这种新建直连 HTTPS 请求,可以这样读:

阶段 近似计算 排查方向
名称解析 dns 本机解析器、DNS 缓存、解析链路
TCP 建连 tcp − dns 到目标 IP 的建连情况
TLS 握手 tls − tcp 握手往返、服务端 TLS 处理
准备就绪到首字节 first − ready 请求往返、服务端排队与处理
首字节到完成 total − first 正文接收、传输期间的等待

字段定义见 curl 手册。first 是首字节时间,包含前面的准备过程。首字节定义、准备阶段定义。

尤其是 first − ready,不能直接叫“后端执行耗时”,它还包含网络往返、反代等待等因素。最后一段也不等于纯带宽测试,服务器边生成边输出时,同样会拉长这段时间。上表只是定位方向,具体原因还要结合服务端日志确认。

有 CDN 时,分开测入口和源站

正常请求域名,通常测到的是 CDN 入口。需要检查自己的源站时,可以保持域名不变,用 --resolve 指定连接地址:

curl -q --noproxy '*' -4 --http1.1 -sS -o /dev/null \
  --connect-timeout 5 --max-time 20 \
  --resolve example.com:443:203.0.113.10 \
  -w 'code=%{http_code} first=%{time_starttransfer} total=%{time_total}\n' \
  https://example.com/

203.0.113.10 是示例地址,需要换成自己的源站 IP。这样 URL 里的域名、HTTP Host 和 TLS SNI 能保持一致,比直接请求 https://IP 更适合虚拟主机场景。名称解析与 SNI 说明

源站需要接受这种访问,而且证书应能被当前 curl 正常验证。若源站只允许 CDN 回源、要求客户端证书,或者用了仅供 CDN 信任的证书,直连失败并不证明网站故障;应在允许访问的环境测,或看回源日志。

对比时,先控制这几个变量

  • 状态码和响应大小:200 的页面与 403 的拦截页、301 的跳转页不能直接比。不要一上来加 -L 混合多次请求。
  • 测试位置和时间:VPS 本机访问自己的站,和家庭宽带跨网访问,观察的是不同路径。多测几次,保留异常值与错误信息。
  • 缓存状态:CDN 命中缓存和回源请求要分别看。可以加 -D - 查看响应头,但缓存标志因服务商而异。
  • 地址族:有 AAAA 记录时,把第一条命令里的 -4 改为 -6 再测,并记录实际连接的 IP;没有可用 IPv6 时不要硬比。

如果单个请求的时间正常,浏览器里仍明显卡顿,再看开发者工具的 Network:图片、脚本、第三方资源、串行请求和前端执行都可能拖慢整页。

欢迎大家补充排查经验:你遇到过“测速很漂亮,网站还是慢”的情况,最后定位到的是数据库、外部 API、CDN 回源,还是其他原因?

  • 点子不错,收藏了

  • 技术贴,收藏学习

  • 技术贴 底层出发

  • 干货帖,收藏了

你好啊,陌生人!

我的朋友,看起来你是新来的,如果想参与到讨论中,点击下面的按钮!

📈用户数目📈

目前论坛共有72640位seeker

🎉欢迎新用户🎉