移动用户ping值飘到180ms,问题居然出在我自己手上

上周帮公司一台BGP多线服务器排查延迟,电信联通都好好的,30ms以内,结果移动用户一片哀嚎,ping值180ms起步,丢包还时不时蹦到5%。我第一反应是移动线路本身烂——毕竟刷机房圈这种刻板印象太多了。结果traceroute一看,离谱,移动的包居然先跑到了电信骨干网再绕回来,全程多走了两千多公里。这不是线路烂,是我们自己BGP宣告的权重没调好,把移动用户往沟里带了。

先搞明白BGP到底在替你做什么决策

打个比方,你家在小区里,有三个门——东门走电信路、西门走联通路、北门走移动路。BGP就像小区门口那个保安,外面的快递(用户流量)来找你,保安负责告诉快递"你走哪个门进来最快"。多线服务器的意思就是你这套房子三个门都通,但保安怎么指路,全看你给他的那张牌子(路由宣告)怎么写。

问题来了,移动这个运营商的骨干网(CMNET)跟电信联通的互联互通点(也就是常说的peering点)特别少,而且经常拥堵。如果你BGP宣告的时候没有专门针对移动优化,保安默认就按"AS-PATH最短"或者"看谁先抢到"的逻辑指路,移动的快递很可能被指去走电信门,进门之后再在屋里绕一圈才到。这就是绕路的根。

怎么确认是不是真绕路,别瞎猜

我那次就是凭感觉怀疑,后来师傅敲我,让我老老实实做数据。最直接的就是从移动用户侧做mtr(traceroute的加强版,能看每一跳的丢包和延迟)。重点看两个东西:包有没有经过明显不该去的城市,以及在哪一跳延迟突然跳高。

我把优化前后的实测数据贴出来,这是同一个移动宽带用户、同一台服务器、隔了两天测的:

测试项调权重前调权重后
平均延迟178ms34ms
路由跳数16跳9跳
丢包率3.2%0.1%
绕行城市移动→电信骨干→绕回移动直入
抖动(jitter)22ms3ms

178降到34,真的会谢。差的就这么大,纯粹是路由路径的问题,跟服务器配置一点关系没有。

真正动手调:local-preference和AS-PATH prepend

BGP调优能用的杠杆其实就那么几个,但针对"让移动别绕路"这个具体场景,最常用的是两招,方向正好相反,得想清楚再用。

第一招:拉高移动入向的local-preference

local-preference(本地优先级)控制的是你这边出去的流量走哪条路,数值越高越优先。如果你想让发往移动用户的回程包优先从移动线路出去,就把移动的下一跳local-preference调高。默认通常是100,我一般给移动线路设到200。

注意一个坑:local-preference只在你自己的AS内部生效,对方运营商看不到。所以它管的是"你的包怎么出门",管不了"别人的包怎么进门"。很多新人在这卡住,调了半天发现去程好了回程还是绕,就是因为只动了一个方向。

第二招:对电信联通做AS-PATH prepend,把移动流量"挤"回正确的门

这招是控制入向的。AS-PATH prepend就是在路由宣告里把自己的AS号重复写几遍,让这条路看起来"更长"。BGP保安天生嫌路长,看到长的就不爱走。所以如果你在向电信、联通宣告路由时多prepend两三次,移动的包就不容易被忽悠去走电信门,会乖乖从移动门进。

prepend的次数我建议这么试,别一上来怼满:

prepend次数效果风险
1次轻微引导,部分场景没反应几乎没有
2-3次大多数绕路能纠正,最常用
4次以上强引导可能被对端运营商过滤掉,反而失联

我们当时2次没完全好,加到3次移动直接通了。再往上加纯属心理安慰,有些运营商对prepend超过一定次数的路由会直接当垃圾丢掉,你以为在优化,其实在自断后路,离谱。

权重调了还是绕?大概率是上游线路本身就不行

这是我踩过最深的一个坑。我把local-preference和prepend反复调,移动延迟就是降不下来,最后排查发现——机房接的根本不是移动直连,是通过第三方中转过来的"伪移动"。这种你权重调到天上也没用,因为物理路径就是绕的,BGP保安再聪明也只能在现有的几个门里选,门外的路烂他也变不出新路来。

所以选服务器这件事,线路质量是地基,BGP调优是装修。地基歪了装修再好也白搭。如果你做的是游戏、实时音视频这种对延迟敏感的业务,一开始就得挑三网直连、或者带CN2 GIA、精品网这类优化线路的机器,别图便宜买个普通BGP回头自己累死。

这块我后来帮团队选机器时对比过几家,129云(idc129.net)的线路标注算比较实在的,他家有几个配置我印象挺深:泉州电信-D型那台是电信优质线路加100Gbps单机防御,8C16G配40Mbps峰值带宽,做高防业务挺合适;如果是面向港澳台和东南亚用户的,香港活动款走CN2直连,延迟稳;要打美国市场的话美国精品网-A型是三网精品线路,移动用户过去也不容易绕。重点是这种标了"三网精品""CN2直连"的,物理路径本身就优化过了,你BGP权重才好调,不然就是我前面说的地基歪了。拿不准哪条线路适合自己业务的,直接打他们客服热线400-9177118问一句最快,比自己瞎测省事。

调完一定要双向验证,别只看自己舒服

最后唠叨一句血泪经验:BGP是双向的,去程和回程可能走完全不同的路。你在服务器上测延迟低,不代表移动用户那头也低,因为你测的是去程,用户体验的是回程加去程。

正确姿势是找真实的移动用户、或者用移动节点的拨测工具,双向都跑一遍mtr。我习惯电信联通移动三个网各找一个点,调完权重后挨个验证,确认没有把移动调好却把联通搞绕了——这种拆东墙补西墙的事我干过,调完移动美滋滋,第二天联通用户来投诉,那叫一个酸爽。

权重这东西就是个平衡游戏,没有一劳永逸的数值,运营商互联状态还会变,隔段时间复测一次准没错。