免费监控
logo prod

资讯与帮助

HTTP请求慢在哪一层?用分层诊断工具精准找出延迟瓶颈

时间:2025-07-10
编辑:tance.cc

HTTP请求慢.png

“为啥我网站访问总是时快时慢?”
“前端没改,代码也没动,就是卡。”
“CDN 有加,Ping 正常,难道是运气不好?”

如果你经常在业务高峰期听到类似抱怨,不要急着推锅给网络或者 CDN,也别死盯着 Nginx 日志翻来翻去。很多时候,问题根本不是出在你想象中的那一层。

想搞清楚网站慢在哪儿,你得从 HTTP 请求的每一层下手排查,而不是凭经验拍脑袋猜。本文就来聊聊,如何用 HTTP 分层诊断工具,一步步剖析你的网站到底卡在哪一环。


为什么“请求慢”不能只看整体耗时?

我们先来做个类比:
如果说你的网站是一家餐厅,那么用户发起请求就像点餐——

  • 用户开车进停车场(DNS 解析)

  • 找服务员点单(TCP 连接)

  • 等厨房做菜(后端处理)

  • 上菜过程中被其他顾客卡住(队列/线程瓶颈)

  • 食物到手发现配料出错又退单(应用层逻辑问题)

最终“吃饭慢”的体验,其实包含了很多个过程的耗时,而不只是点完单到上菜这一段。

同样,HTTP 请求从发出到接收响应,是一个分层结构的耗时体系,常见分层包括:

  • DNS 解析耗时

  • TCP 握手耗时

  • TLS 握手耗时

  • 发送请求头耗时

  • 等待响应耗时(TTFB)

  • 接收响应体耗时

如果你只看整体耗时(比如 time_total),就像医生只测体温给病人开药,那只能算玄学运维。


常用的 HTTP 分层诊断工具有哪些?

要想真正搞懂问题在哪,工具必须用对。以下是最实用的几个:

1. curl -w(快速诊断工具)

你可以用以下命令打印所有耗时细节:

bash
curl -o /dev/null -s -w "@curl-format.txt" https://example.com

内容示例:

css
DNS解析时间: %{time_namelookup}s
TCP连接时间: %{time_connect}s
SSL握手时间: %{time_appconnect}s
首字节等待: %{time_starttransfer}s
总耗时: %{time_total}s

这几项指标是排查性能瓶颈的黄金参考线。

2. Chrome DevTools(前端请求耗时分析)

在浏览器按 F12 打开开发者工具,进入 Network 面板,点击具体请求,Timeline 会详细显示:

  • Stalled

  • DNS Lookup

  • Initial Connection

  • SSL

  • Request Sent

  • TTFB

  • Content Download

配合各阶段耗时,你能大致判断问题是出在客户端、网络、还是服务端。

3. Wireshark 或 tcpdump(高级抓包分析)

当你怀疑是 TLS 连接反复建立、RTT 波动过大、服务器 RST 多等网络异常问题时,抓包是最后的底牌。


常见请求慢的分层原因分析

知道怎么测还不够,你还得知道不同层的慢意味着什么问题

 DNS 耗时高:

可能是 DNS 服务质量差,缓存失效或运营商劫持。解决方式:

  • 使用可靠的公共 DNS(如 114.114.114.114 / 8.8.8.8)

  • 启用 DNS 缓存服务如 dnsmasq

  • 启用 EDNS Client Subnet 适配就近解析

 TCP 连接耗时长:

代表三次握手慢,通常是由于:

  • 路由不稳定

  • 跨运营商链路质量差

  • 服务端 SYN-ACK 拒绝(连接数打满)

可用 MTR/TraceRoute 工具排查路径质量,用 CDN 弹性调度应对。

 SSL 握手慢:

这跟证书大小无关,而可能是:

  • TLS 协议协商慢(禁用了 TLS1.3?)

  • 服务端未启用缓存 Session ID/Resumption

  • 客户端和服务端支持算法不匹配

建议启用 TLS 1.3 + 0-RTT,配置 OCSP Stapling 缓解验证慢问题。

 TTFB 高(首字节等待慢):

这是最容易暴露服务端问题的地方,比如:

  • 后端数据库慢查询

  • 应用逻辑阻塞(PHP / Java 执行耗时)

  • 线程池或连接池打满

你可以结合服务端 APM 工具(如 Skywalking、Pinpoint、New Relic)辅助排查。

 响应体下载慢:

可能是服务器出口带宽拥堵、CDN 回源慢、GZIP 开启失败等原因。


实战例子:我们怎么一步步查出“请求慢”真相?

有个客户反馈说:“我们网站首页加载总在北京地区卡住,国外正常。”

我们让他用 curl 打了个诊断请求,结果是:

makefile
DNS解析时间: 0.02sTCP连接时间: 0.3sSSL握手时间: 0.9s首字节等待: 1.2s总耗时: 3.2s

一眼看出:TLS 握手和首字节等待明显偏高。
抓包后发现,TLS 连接反复失败,SNI 不匹配,服务端返回多次 RST。

根源在于:CDN 厂商的证书配置错误,回源 IP 路由绕到美国节点。

修复后,耗时从 3.2s 降至 0.9s。


如何建立一套完整的 HTTP 分层监控体系?

如果你维护的是高可用网站,建议做如下监控体系建设:

  • 用 curl + bash 自动巡检耗时关键指标,异常就报警

  • 接入网站 APM,定位后端响应瓶颈

  • 利用 Prometheus + Grafana 可视化 HTTP 各阶段指标趋势

  • 异地多点部署 curl 请求监控真实访问体验(配合 观图 之类服务)


客服
意见反馈