某天下午运营群里炸了:江苏的用户说卡,广东的说没事

那天我正啃着面包看监控,运营拉我进群,说华东好几个客户反馈访问那台 BGP 多线服务器贼慢,打开页面要转三四秒,但同一批客户在广东、四川的反而正常。第一反应肯定是"服务器挂了",但服务器 CPU、内存、带宽全绿,本机 ping 网关也就 0.2ms。问题不在机器上,在路。

BGP 多线你可以理解成一个有好几个门的小区,电信、联通、移动各开一个门。正常情况下电信用户走电信门进来,联通走联通门,谁家近走谁家。route drift(路由漂移)就是某天电信那个门被物业临时封了,导致电信用户被迫绕到隔壁市的联通门再走回来,绕了一大圈,能不慢吗。

先确认是"去程"慢还是"回程"慢,别一上来就瞎猜

新人最容易犯的错就是只在服务器上 ping 用户,看着延迟正常就说"没问题啊"。离谱的是网络是双向的,去程和回程走的根本不是一条路。你得让用户那边也往服务器打一组数据,两边对一下。

我用的组合是 mtrbesttrace。mtr 比 traceroute 强在它是持续打的,能看出每一跳的丢包和延迟抖动,而不是只拍一张快照。让华东那个客户跑 mtr 到服务器 IP,我同时在服务器上跑 mtr 回客户 IP。结果一对比就很清楚了:

方向关键跳路径平均延迟丢包
用户→服务器(去程)江苏电信 → 上海电信骨干 → 直达11ms0%
服务器→用户(回程)本机 → 北京联通 → 绕回上海 → 江苏电信68ms1.2%

看到没,去程好好的,回程被甩到北京联通绕了一圈。这就是典型的回程路由漂移。服务器宣告路由的时候,本来电信的回程应该走电信优选路径,结果上游某个 AS 的 BGP 策略变了,把这段流量塞进了联通绕行的路。

怎么坐实是上游运营商在搞事,而不是你自己配的

这一步我一开始也懵,后来带我的师傅教了个笨办法:看 AS path。在 mtr 结果里把每一跳的 IP 拿去查归属 AS,正常的电信回程应该是 AS4134(中国电信)一路下去,结果我查出来中间突然冒出来 AS4837(联通骨干)。流量本该全程留在电信网内,硬生生被拐进了联通,这就是上游 peering(对等互联)策略调整或者某条线路拥塞后 BGP 自动切换导致的。

验证方法也简单粗暴:找几个公开的 Looking Glass 节点(很多运营商和 IDC 都提供),从江苏电信的视角反查到你服务器 IP 的 BGP 路由表。如果 best path 选的下一跳 AS 跟你期望的不一样,那基本就石锤了——不是你的锅,是上游路由漂了。

多打几个点,画一张"哪里疼"的地图

单看一个客户不够,漂移往往是区域性的。我写了个小脚本,从几个第三方测速平台调不同省份的节点,批量 ping + traceroute 服务器,把延迟铺成一张表,一眼就能看出哪片区域中招了:

探测点运营商正常基线故障时状态
江苏南京电信12ms69ms漂了
浙江杭州电信14ms71ms漂了
广东深圳电信28ms30ms正常
四川成都移动40ms41ms正常
北京联通22ms23ms正常

看出规律了吧,就华东电信这一片中招,其他全好。这种"局部疼"的特征,加上回程绕路的证据,定位结论就很扎实了:华东电信去往本机的某段回程被上游策略漂到了联通绕行路径上。范围一框定,跟机房提工单的时候底气都足,不会被一句"我们这边没问题"打发回来。

提工单怎么说才不被踢皮球

真的会谢,新人提工单最容易被回一句"请提供详细信息"然后石沉大海。我现在的模板是:附上双向 mtr 截图、标出漂移的那一跳 AS、列出受影响省份和对照正常省份、再贴 Looking Glass 的路由表证据。把"哪一跳、从哪个 AS 漂到了哪个 AS"直接喂给机房网络组,他们改 BGP 路由策略或者调 local-preference 也就十几分钟的事。怕就怕你只说"我这慢",那就等吧。

临时绕不开的时候,线路本身的底子才是关键

话说回来,路由漂移这种事,普通 BGP 多线是真没法 100% 避免,毕竟你管不了上游运营商的脾气。但优质回国线路抗漂移的能力是真的不一样。普通线路漂一下可能直接绕半个中国,而 CN2 GIA、CMIN2 这类精品线路因为是运营商精品网,节点优先级高、绕行概率低,同样的网络波动下延迟稳得多。

我们后来给那批对延迟敏感的华东客户专门换了走精品网的机器,那段时间正好在选型。如果你也在找这种回国稳、抗抖动的配置,可以看看 129 云(idc129.net)的产品线,他们家几条线我实测过,列几个我印象深的:

产品配置线路适合场景
美国精品网-B型4C / 4G DDR4 ECC / 70G SSD / 70Mbps 峰值CMIN2 高速回国海外业务但要照顾国内访问
金华电信-B型8C / 8G DDR4 ECC / 1TB 盘 / 100Mbps 独享 / 1TB 流量电信单线 + 100Gbps 防御电信用户多、又怕 DDoS 的
新加坡大宽带1-2C / 1-2G / 5-20G SSD / 1-2Gbps 峰值普通线路超大带宽纯走量、不指望大陆优化的

这里多嘴一句,新加坡那款是普通线路、不保证大陆网络访问,纯堆带宽用的,别拿它去扛延迟敏感的国内业务,那就是用错地方了。真要回国稳就选 CMIN2 那条,要扛攻击又是电信用户为主就上金华电信那台带 100Gbps 防御的。拿不准配置直接打他们客服 400-9177118 问就行,比自己瞎猜省事,我当时选型也是直接问的。

最后那个漂移问题,到底怎么收场的

机房网络组那边收到我整理的证据,确认是上游一条线路拥塞触发了 BGP 自动切换,把华东电信回程甩到了联通。他们手动调了下 best path 的 local-preference,把回程拉回电信骨干,二十分钟后我再让客户跑 mtr,回程延迟从 68ms 掉回 13ms,那一跳的 AS4837 也消失了。运营群里一片"快了快了",那一刻是真舒服。