这篇文章不讲八股,讲一个我们团队真实遇到的网络故障,以及我整理的一套从命令行到在线工具的排查方法论。读完你应该能在下次"用户说慢但监控全绿"的时候,少走 80% 的弯路。
一、故事的开端
凌晨 3 点,企业微信报警群里炸开了锅:
"华南区用户反馈页面打不开,已经持续 20 分钟" "我这里测试是好的啊?" "我的也是好的" "但是用户截图是 502"
这是后端开发都熟悉的一种"鬼故事"——监控大盘一片绿,自己访问没问题,但用户就是说不行。
第一反应当然是登服务器:
$ ping www.example.com
PING www.example.com (xxx.xxx.xxx.xxx) 56(84) bytes of data.
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=53 time=12.3 ms
64 bytes from xxx.xxx.xxx.xxx: icmp_seq=2 ttl=53 time=11.8 ms
延迟 12ms,丢包率 0%,看起来没毛病。
但这里有个最致命的认知陷阱:你在自己的机器(或者公司办公网)上 ping 通了,只能证明你这条线路是好的,证明不了广州联通的用户、深圳电信的用户、海外用户也是好的。
故障的本质是线路相关性,而单点检测无法发现线路相关性问题。
二、单点排障的天花板
我先把命令行工具能跑的都跑了一遍:
# 1. ICMP Ping
ping -c 100 www.example.com
# 2. TCP 端口探测
nc -zv www.example.com 443
# 3. HTTP 完整链路
curl -w "@curl-format.txt" -o /dev/null -s https://www.example.com
# 4. 路由追踪
mtr -rwc 50 www.example.com
# 5. DNS 解析
dig www.example.com +trace
其中 curl-format.txt 是我多年攒下来的格式化模板,强烈推荐放到家目录里:
time_namelookup: %{time_namelookup}s\n
time_connect: %{time_connect}s\n
time_appconnect: %{time_appconnect}s\n
time_pretransfer: %{time_pretransfer}s\n
time_redirect: %{time_redirect}s\n
time_starttransfer: %{time_starttransfer}s\n
----------\n
time_total: %{time_total}s\n
跑完这一套,结果是:全 绿。
但是用户还在反馈卡。
这种时候你会突然意识到:我的视角是错的。我需要的是"用户视角"——具体来说,是华南联通某个城市某个机房出口的视角。
三、多节点检测的必要性
互联网在不同 ISP 之间是"互联但不互通"的。所谓的国内三大运营商(电信、联通、移动)以及更细分的 CN2、CMI、9929、CMIN2 等线路,走的是完全不同的物理路径。一条 BGP 路由的抖动可能只影响某一组特定的 Source-Destination 组合。
举几个真实案例:
- 联通用户访问电信服务器,绕一圈到香港再回来 → 个例延迟 200ms+
- 移动用户访问某 CDN 节点,CMIN2 线路波动 → 局部丢包
- 国内某 IDC 上联出口某个时段拥塞 → 仅该 IDC 的部分 IP 段受影响
- DNS 在某个公共 DNS 上被错误劫持 → 仅使用该 DNS 的用户受影响
这些场景,坐在办公室里 ping 永远看不出来。
你需要的是从 N 个节点(最好覆盖三大运营商各省份 + 海外)同时发起检测,对比延迟、丢包、路由路径的差异。
四、命令行 vs 在线检测工具,怎么选?
我整理了一张对比表(基于多年工作经验):
| 维度 | 命令行 (ping/mtr/dig) | 在线多节点工具 |
|---|---|---|
| 检测视角 | 单点(你的机器) | 多点(全国 + 海外) |
| 部署成本 | 需要服务器 | 浏览器即可 |
| 自动化能力 | 强(脚本/cron) | 弱(适合人工排查) |
| 数据可视化 | 弱 | 强(地图、瀑布流) |
| 路径差异对比 | 困难 | 一目了然 |
| 客户/老板沟通 | 截图说不清 | 截图直接交付 |
结论很简单:命令行做日常监控和自动化,在线工具做故障期间的快速定位。两者不是替代关系,是互补关系。
五、我常用的在线诊断工具
国内能用的多节点检测站点其实就那么几个,我现在主用 BiuPing(这也是这次故障最终帮我定位到问题的工具)。简单说几个我看重的点:
1. 节点覆盖
它聚合了全国电信/联通/移动的多个省份节点,以及海外节点。这次故障我就是用它的在线 Ping发现:广东、广西、福建三个联通节点丢包率都在 30% 以上,而其他省份正常——立刻锁定是华南联通方向出问题。
2. 不只是 ICMP Ping
很多服务器禁 Ping(出于安全考虑封了 ICMP),这时候普通 ping 工具会误报"目标不可达"。它的 TCPing 直接对 443/80/3306 等端口发 TCP SYN,完美绕开 ICMP 限制。我现在排查"服务器是不是真挂了"基本只用 TCPing。
3. 路径可视化
路由追踪会把每一跳的 IP、ASN、地理位置都画出来。这次我对比华南联通和华东联通的路径,发现华南联通走到 AS4837(联通骨干)某一跳就开始丢包,立刻就有了和上游 ISP 沟通的证据。
4. HTTP 完整瀑布流
网站测速能拆分出 DNS 解析、TCP 握手、SSL 握手、首字节、内容下载各个阶段的耗时。我之前定位过一个"网站偶发慢"的问题,瀑布流显示 SSL 握手耗时异常,最终查出是证书链配置缺了中间证书,导致部分客户端要回源校验。
5. DNS + IP 信誉
DNS 查询能看到不同地区的解析结果,识别 DNS 污染或 CDN 调度异常。IP 信誉对反垃圾邮件、风控场景很有用,能查 IP 是否在黑名单、是不是代理/VPN/Tor 出口。
完全免费,不用注册,对我这种"故障期间一秒都不想浪费"的场景非常友好。
当然,如果你是企业级监控,还是建议自建 Prometheus + Blackbox Exporter 那一套。在线工具更适合事后排查和临时验证。
六、回到那次故障
用 BiuPing 跑了一轮多节点检测,结果非常清晰:
节点 延迟 丢包率
广东·联通 超时 100%
广西·联通 158ms 45%
福建·联通 132ms 28%
广东·电信 32ms 0%
广东·移动 28ms 0%
北京·联通 48ms 0%
上海·联通 51ms 0%
定位结论:华南方向联通线路出口异常,与我们的服务器/应用本身无关。
接下来动作:
- 截图发到运维群,证明不是应用层问题
- 联系 IDC 提工单,附上 traceroute 截图
- 在 CDN 控制台临时把华南联通用户调度到 BGP 多线节点
- 在客服话术里加一条"如果您是联通用户遇到访问问题,可以尝试切换 4G 网络"
整个过程从 3 点 20 排查开始,到 3 点 45 切完调度,故障感知期 25 分钟。
第二天联通方面回复:华南某骨干节点路由抖动,已经恢复。和我们的判断完全吻合。
七、一些可以直接抄走的方法论
7.1 故障排查的"由近及远"原则
应用日志 → 应用进程 → 操作系统 → 网卡/防火墙 →
本机网络 → 机房网络 → 运营商骨干 → 客户端网络
从离自己最近的开始查,但不要陷在某一层。如果一层查了 10 分钟没结果,就跳到下一层。
7.2 "对照组"思维
任何检测都要有对照:
- 出问题的省份 vs 没问题的省份
- 出问题的运营商 vs 没问题的运营商
- 出问题的时间段 vs 平时
- 出问题的用户 vs 其他用户
只有形成对照,你才能区分"系统问题"和"个例问题"。
7.3 网络抖动 ≠ 高延迟
很多人盯着平均延迟看,其实抖动(Jitter)才是用户体感的关键。平均 ping 30ms 但抖动 ±50ms 的网络,比平均 80ms 但稳定的网络体验差得多。游戏、视频会议、在线协作场景尤其明显。
排查抖动一定要用持续 Ping(至少 100 个包)而不是默认的 4 个包。
7.4 排查清单(可以收藏)
下次遇到"用户说慢"的时候,按这个顺序:
- ✅ 自己访问试试(建立基准)
- ✅ 多节点 Ping(看是否区域性故障)
- ✅ TCPing 业务端口(绕开 ICMP 干扰)
- ✅ HTTP 测速看瀑布流(定位是哪一阶段慢)
- ✅ Traceroute 对比正常/异常路径(定位故障跳)
- ✅ DNS 多地查询(排除 DNS 问题)
- ✅ 应用日志 + APM(最后回到应用层验证)
八、写在最后
做后端/运维这么多年,我越来越觉得:网络故障最怕的不是难,而是"看不见"。
一个 SRE 的能力差距,往往不在于知道多少深奥原理,而在于能不能用对的工具,把"看不见的网络"变成"看得见的数据"。
希望这篇排障复盘能帮到你。下次告警群再炸的时候,不要慌,泡杯咖啡,按照清单一项项排——大部分故障都没有想象中那么神秘。
互动一下:你遇到过最离奇的网络故障是什么?欢迎评论区交流,我会一一回复。
如果觉得文章对你有帮助,点个赞+收藏,下次找起来方便 🙏