凌晨 2 点,告警群炸了:商品详情页 P99 从 200ms 飙升到 8s。运维说服务器 CPU 内存一切正常,DBA 说慢查询日志里啥也没有,前端说 Bundle 没动过。问题悬了 3 个小时,最后定位到的元凶是——某省运营商的骨干节点路由抖动。
如果你做过线上服务的稳定性保障,类似的剧情应该不陌生:所有应用层指标都正常,但用户就是说慢。这种时候,问题往往不在你能看到的应用层,而是藏在网络链路的某一层里。
本文整理我这几年踩过的坑,沉淀出一套五层分层排障方法论,配合具体命令和工具,给后端、运维、SRE 同学做一份可以直接照抄的排查手册。
一、为什么需要「分层」?
很多同学排障时容易陷入两个误区:
- 看到「慢」第一反应就是看应用日志、看慢 SQL——但日志和 SQL 都没问题的时候就懵了
- 把「慢」当成单一问题解决——其实从客户端发起请求到收到响应,中间至少要经过 5 层
这 5 层从下到上分别是:
| 层级 | 阶段 | 常见问题 | 典型工具 |
|---|---|---|---|
| L1 | DNS 解析 | 解析慢、被污染、被劫持、TTL 配置不合理 | dig / nslookup |
| L2 | 网络链路 | 跨运营商绕路、骨干网拥塞、路由抖动 | ping / mtr / traceroute |
| L3 | TCP / TLS | 端口未开、握手慢、证书链问题、安全组限制 | tcping / openssl s_client |
| L4 | HTTP 响应 | TTFB 高、CDN 回源慢、网关超时 | curl -w / 压测工具 |
| L5 | IP 信誉 | 出口 IP 被拉黑、被风控、被反欺诈拦截 | 威胁情报查询 |
排障的黄金原则:从下往上排,先确认基础设施,再看应用。 下层不通的时候去优化上层,等于在沙地上盖楼。
下面逐层来讲。
二、L1:DNS 解析层 —— 用户连「找到你」这一步都没走完
DNS 是用户访问服务的第一道关卡。这一层出问题,后面所有的优化都白搭。
一个真实案例
之前公司接入了一家第三方 SaaS,部分用户反馈服务不可用。后端、网关、SaaS 服务商查了半天都说没问题,最后发现是某省运营商的 DNS 把这个第三方域名解析到了一个完全错误的 IP——可能是历史缓存,也可能是污染。
这种问题在公司内网用 dig 一查永远是对的,因为公司用的是 8.8.8.8 或者 223.5.5.5,但用户用的是当地运营商默认的 DNS。
命令行排查
# 用指定 DNS 服务器查询
dig @8.8.8.8 yourdomain.com
dig @114.114.114.114 yourdomain.com
dig @223.5.5.5 yourdomain.com
# 查询 A、AAAA、CNAME 全套记录
dig yourdomain.com ANY +noall +answer
# 跟踪完整解析路径
dig +trace yourdomain.com
但单机查询不够,要看「全国一致性」
在自己的 ECS 上用 dig 查一万次也只能验证你这条链路的解析。真正要看的是全国各运营商节点的解析结果是否一致。
要重点关注:
- 各地返回的 IP 是否一致 → 不一致可能是 DNS 劫持
- 是否有节点解析到完全无关的 IP → 典型 DNS 污染
- 各地解析耗时 → 超过 100ms 就要排查权威 DNS 配置
- TTL 是否合理 → 太短会导致频繁解析,太长不利于切流
推荐工具:BiuPing 多地 DNS 查询,可以同时查询 A / AAAA / MX / CNAME 记录在全国电信、联通、移动各节点的生效情况,一眼看出有没有被污染或劫持。
三、L2:网络链路层 —— Ping 通了,但链路质量真的没问题吗?
DNS 没问题之后,下一步看网络链路本身。
一个反直觉的事实:Ping 值低 ≠ 网络好
我之前接过一个游戏行业客户,他们的服务器从公司机器 Ping 平均 30ms,看起来非常完美。但玩家依然反馈「卡顿」「掉线」。
后来从全国多个节点持续 Ping 5 分钟才发现真相:
- 平均延迟:30ms(看起来很美)
- 丢包率:2.8%(开始出问题了)
- 延迟抖动 Jitter:±180ms(致命)
对实时性要求高的场景(游戏、直播、视频会议、长连接 IM),抖动比平均延迟更重要。一个平均 100ms 但稳定的链路,比平均 30ms 但抖动 ±200ms 的链路体验好得多。
三个必看指标
# 持续 Ping,看长时间稳定性
ping -c 300 yourdomain.com
# 用 mtr 同时看路径和每一跳的丢包/延迟
mtr -rwzbc 100 yourdomain.com
# 输出示例(重点看 Loss% 和 StDev 列)
# HOST Loss% Snt Last Avg Best Wrst StDev
# 1. 192.168.1.1 0.0% 100 1.2 1.5 1.0 3.2 0.4
# 2. 10.0.0.1 0.0% 100 5.3 6.1 4.8 12.3 1.2
# 3. xx.xx.xx.xx 0.0% 100 15.2 16.8 14.5 25.1 2.3
# ...
排查时盯三个指标:
- 平均延迟:< 50ms 优秀,< 100ms 正常
- 丢包率:> 1% 警觉,> 3% 用户体感明显
- 延迟抖动 StDev:越小越好,最好 < 10ms
链路有问题怎么办?
光看 Ping 已经不够,要上 MTR / Traceroute 把每一跳路由都列出来。常见问题模式:
- 跨运营商绕路:电信用户访问联通服务器,数据包跑到香港绕一圈才回来
- 某一跳节点拥塞:前几跳都很快,突然某一跳延迟飙到 300ms+
- 国际链路抖动:晚高峰跨境出海链路几乎天天炸
- 运营商路由策略变更:早上还好的,晚上就开始绕路
定位到具体的丢包跳之后,看那一跳是哪个 AS、属于哪家运营商,提工单或者切线路解决。
推荐工具:BiuPing 多地 Ping 和 路由追踪 / MTR,可以从全国电信/联通/移动 + 海外节点同时发起,一眼看出是哪个运营商的哪一跳出了问题。比单机 mtr 高效得多。
四、L3:TCP / TLS 层 —— 不是所有「不通」都是 Ping 不通
这一层专治「Ping 通但连不上」
很多场景下:Ping 完全通、延迟漂亮,但 TCP 连接就是建立不起来。常见原因:
- 服务器防火墙放了 ICMP 但封了业务端口
- 云厂商安全组没放行(这个真的是日经问题)
- 服务进程挂了但服务器还活着
- LB / 网关的健康检查异常,但 ICMP 还能通
- 运营商封了特定端口(经典 80 端口被运营商拦截)
- DDoS 防护把 ICMP 放过去但限制了 TCP 新建连接
更常见的情况:生产环境为了安全直接禁了 ICMP,这时候 Ping 永远不通,但 TCP 是好的。
命令行排查
# 用 nc 测端口是否开放
nc -zv yourdomain.com 443
nc -zv yourdomain.com 8080
# 用 curl 测 TCP 连接耗时
curl -o /dev/null -s -w "TCP连接: %{time_connect}s\nTLS握手: %{time_appconnect}s\n首字节: %{time_starttransfer}s\n总时间: %{time_total}s\n" https://yourdomain.com
# 用 openssl 详细查看 TLS 握手过程
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -showcerts
# 看 TLS 握手具体耗时(可结合 -trace)
time openssl s_client -connect yourdomain.com:443 < /dev/null
TLS 握手慢的几个常见原因
- 证书链太长:浏览器要验证整条信任链,每多一级就多一次开销
- 没启用 TLS 1.3:1.2 是 2-RTT,1.3 是 1-RTT,差别明显
- 没启用 OCSP Stapling:客户端要去 CA 查证书吊销状态,跨境时尤其慢
- 没启用 Session Resumption:每次新连接都完整握手
- 服务器加密套件太老:用了性能差的椭圆曲线
我之前帮一家公司排查 API 慢的问题,发现 TLS 握手单独就吃掉了 600ms——后来开了 TLS 1.3 + OCSP Stapling + Session Resumption,握手降到 80ms 以内。
推荐工具:BiuPing 在线 TCPing,专门用来测多地多线路对指定端口的 TCP 连通性,禁 Ping 环境也能用。比一台台跳板机上去 nc 高效得多。
五、L4:HTTP 响应层 —— 这才是真正的「网站测速」
到这一步,下层链路全部都是好的,问题就锁定到应用层了。
一个完整 HTTP 请求的耗时分布
| 阶段 | 含义 | 慢的常见原因 |
|---|---|---|
| DNS Lookup | 域名解析 | 见 L1 |
| TCP Connect | 三次握手 | 见 L2、L3 |
| TLS Handshake | HTTPS 握手 | 见 L3 |
| TTFB | 服务器返回首字节时间 | 应用层慢,重点排查对象 |
| Content Transfer | 内容传输 | 资源体积大 / 带宽不足 / GZip 没开 |
TTFB 是后端的命门
如果你看到 TTFB > 500ms,基本可以确定是应用层或者 CDN 回源的问题。继续往下排:
# 用 curl -w 拆解每个阶段耗时
curl -o /dev/null -s -w \
"DNS解析: %{time_namelookup}s\n\
TCP连接: %{time_connect}s\n\
TLS握手: %{time_appconnect}s\n\
首字节TTFB: %{time_starttransfer}s\n\
总耗时: %{time_total}s\n\
HTTP状态: %{http_code}\n\
重定向次数: %{num_redirects}s\n" \
https://yourdomain.com/api/products/123
如果 TTFB 高,往下排查的几个方向:
- 应用层慢查询:重点查那个接口对应的 SQL、Redis 命中率、外部依赖
- CDN 回源:CDN 命中率多少?回源带宽够不够?回源链路稳不稳?
- 网关排队:API Gateway / Nginx 的 worker 数、队列深度
- 冷启动:Serverless 场景的冷启动可能轻松 1s+
- 跨区域调用:服务部署在华东,调了一个华南的下游
- 链路追踪缺失:没接入 APM 的话这一步会非常痛苦,强烈建议接入
测速一定要测多地
我有个客户的 API 服务部署在华东,他自己在杭州办公室测延迟 50ms,体验丝滑。但他的用户分布在新疆、云南、东北——那边测出来 TTFB 直接 1.5s 起步。后来在西部和北部各加了一组就近接入的节点才解决。
永远不要相信你自己电脑上的测速结果。 一定要从用户视角、多地、多运营商去看。
推荐工具:BiuPing 多地网站测速,给出 DNS / TCP / TLS / TTFB / 下载 完整瀑布流,能清楚看到时间花在哪一步、哪个地区慢。比 curl 串多个跳板机高效太多。
六、L5:IP 信誉层 —— 这是 90% 的开发都没听过的概念
这一层非常隐蔽,但一旦命中就会让你怀疑人生。
什么是 IP 信誉?
互联网上有大量威胁情报机构(Spamhaus、AbuseIPDB、各种反钓鱼联盟)会维护「黑名单 IP 库」。任何被举报过发垃圾邮件、被滥用、被识别为代理 / Tor / 数据中心 IP 的地址,都会被记录。
很多服务(CDN、邮件服务商、风控平台、海外 SaaS、Google reCAPTCHA、各种反欺诈系统)都会读这些黑名单,对黑名单上的 IP 直接拒绝服务或者降级处理。
这跟我有什么关系?
关系大了。我亲眼见过的几种翻车场景:
- 新申请的 ECS 公网 IP,发出去的邮件全部进对方垃圾箱——前持有者发过垃圾邮件,IP 被多家邮件服务商拉黑
- 海外用户访问某些功能直接 403——CDN 把这个出口 IP 判成了高风险
- 接入第三方支付/登录回调失败——对方风控把出口 IP 识别成机房代理
- Google reCAPTCHA / Cloudflare Turnstile 一直要求验证——IP 信誉评分太低
- 国外 SaaS 接口偶发 403/429——按 IP 信誉做了限流
这些问题,查代码、查抓包、查日志全部都查不出来。 因为你的代码完全没毛病,是 IP 本身在「外面名声不好」。
怎么排查
把服务器出口 IP(或者用户反馈有问题的客户端 IP)丢进 IP 信誉查询,看:
- 是否在主流黑名单里(Spamhaus、AbuseIPDB 等)
- 风险评分多少
- 是否被识别为代理 / VPN / Tor
- 是否被分类为机房 IP(很多场景下机房 IP 会被歧视)
- 历史滥用记录
如果 IP 已经被「污名化」了,最快的解决方法是申请释放重新分配,或者更换出口 NAT IP。这一步省下来的排查时间,能比你优化整个应用还多。
推荐工具:BiuPing IP 信誉查询,聚合了多个威胁情报源,一眼看出 IP 的「江湖名声」。新机器接入前建议先查一下。
七、实战串联:用这套方法 5 分钟定位一个真实问题
讲了这么多理论,来一个我去年真实排过的 case 串一下。
背景:一个电商客户线上告警——商品详情页 P99 从 200ms 飙升到 8s,但只有部分用户复现,监控里 ECS、RDS、Redis 全部正常。
按这套方法走了一遍:
L1 DNS 排查:多地查询,所有节点解析到的都是 CDN 回源 IP,正常 ✅
L2 链路排查:从全国 20 个节点持续 Ping 这个 CDN IP,发现 广东电信节点丢包率 8%、延迟抖动 ±150ms,其他节点正常。问题缩小到广东电信用户。
继续 MTR:从广东电信发起 traceroute,发现数据包在某个省级骨干节点的 Hop 上持续丢包——典型的链路拥塞。
L3 TCP 排查:广东电信对 443 端口的 TCP 握手成功率只有 70%,跟丢包率吻合 ✅
L4 HTTP 排查:广东电信节点测 TTFB 飙到 4 秒,同一时刻其他地区 TTFB 都在 100ms 以内。证实就是这条链路的问题,跟应用层无关。
L5 IP 信誉排查:顺手查了下 CDN IP,干净的,排除被风控拦截的可能 ✅
结论:CDN 厂商在广东电信的 PoP 节点出现链路异常。截图带数据丢工单,2 小时后他们切换了出口路由,问题解决。
整个排查从开始到定位,约 5 分钟。 如果不是按分层方法走,光让开发去翻代码、翻 SQL、翻日志,估计加班到天亮也找不出来。
八、写在最后:这套方法的工程价值
总结一下「五层分层排障法」:
- L1 DNS 层 → 域名解析对了吗?多地解析一致吗?
- L2 链路层 → Ping 通吗?延迟抖动正常吗?路由有没有绕路?
- L3 TCP/TLS 层 → 端口能握手吗?TLS 握手快吗?
- L4 HTTP 层 → TTFB 高在哪一段?哪个地区慢?
- L5 IP 信誉层 → 出口 IP 在黑名单上吗?被风控了吗?
核心顺序:从下往上,从基础设施到应用。 这个顺序不能颠倒,因为下层不通的时候去优化上层,纯属浪费时间。
把这套方法做成一份排障 Runbook 沉淀到团队 wiki 里,下次告警的时候照着走一遍,能省 80% 的定位时间。
我用的这一整套工具都在 BiuPing 这个站点上,免费、不用注册、支持 IPv4/IPv6 双栈,对后端、运维、SRE 都挺友好。新接入业务、上线新机器、做容量评估、排查线上问题的时候都能用上。
如果这篇文章对你的线上稳定性保障有帮助,欢迎收藏。也欢迎在评论区分享你踩过的网络坑——这种事,看一万遍理论不如听一个真实案例。