故障是从周二凌晨开始的。不是之前那种全线飘红的暴风——那种一来,告警面板红成一片,短信轰炸得人心里发慌,谁也装看不见。这一回安静得多:某个微服务掉线几分钟,又自己爬了起来,日志干净得连句像样的报错都不肯留。像一台向来守规矩的老机器偶尔打个盹,醒了还知道把被子掖好。
凌晨两点四十七分,头一回发作的时候,林默正睡着。手机在枕边跳了三下,停了。他的告警推送单独设过模式——只震三下,不连响。早年创业服务器夜崩,蜂鸣一响人必须原地弹起,久而久之落下的病根;如今提示音能砍的全砍了,只留这三下。够叫醒一个干这行的,吵不醒一个铁了心装死的。
睁半只眼扫完推送:内核调度链路某服务脱机,三分十一秒后自愈。翻身,接着睡。第二次落在当天傍晚五点十八分,值班的小吴在群里甩了句「已自愈,观察「,下面没了下文。第三次次日清晨七点四十九分,正赶上晨会前十来分钟,工位区人来人往,谁也没顾上多看一眼。
第四次周三夜里十点二十,第五次周四中午十二点五十,第六次周五凌晨三点二十一。三次过去还没人当回事。微服务抖一下,在运维眼里跟人打个喷嚏差不多——重启也好、自愈也罢,流程走完就算结案。
到第五次,林默把前几个时间戳码成了一列,在纸上一笔一笔往下誊。
二点四十七。十七点十八。七点四十九。二十二点二十。十二点五一。三点二一。
间隔:十四小时三十一分。十四小时三十一分。十四小时三十一分。误差不超过一分钟。
太阳穴那根弦当场绷紧了。真随机的故障,落点是撒出去的一把沙子,东一颗西一颗,摊开来毫无形状可言。而这几个数字摞在一起,是同一块表走过来的脚印,步幅稳得吓人。更要命的是另一层:这个周期根本不凑整一天的格。发作时刻沿着钟面慢慢转圈——今夜凌晨,次日入夜,隔日清早,再一日午间——每一站都恰好落在人类最懒得盯屏幕的那个空当里。
靠肉眼盯盘的人,盯满一个月也未必凑齐全貌。它在绕着人类的作息走位。林默盯着那张纸,喉咙发干。这不是天气。天气不会专挑人的下班时间下雨。
王海涛领着老周、小吴折腾了两天。监控翻了个底朝天,链路抓包抓到手软,边缘节点前后重启了三回。键盘拍得啪啪作响,语音会议里翻来覆去就是那几句「再看一遍「「不可能啊「「你们那边到底动过配置没有「。
第三回重启前,老周迟疑了一句:「涛哥,要不先把故障前后的日志导出来?都掉了好几回了,总得留点什么——「
「网都断了还导个屁!「王海涛的手指已经悬上回车键,「先恢复业务,这是死规矩。「
回车砸下去的时候,林默刚巧起身接水。走到饮水机跟前,听见身后机箱风扇陡然拔高的声音,脚步顿了半步,终究没有回头。
第三下重启命令。等于把现场冲了第三遍。真要回头追查,连半枚脚印都剩不下。端着纸杯往回走,脸上什么都看不出,心里已把那份日报的结尾猜出了八九分。
果然,周五下午三点整,日报准时挂进项目群:
「连续数日偶发服务短暂脱机,经查为间歇性网络波动所致,建议持续观察,必要时扩容带宽。」
末尾缀着一个「加油「表情,语气稳当,像在体检报告上盖了个「健康「的红章。
「波动的说法,你们再确认一下。「十分钟后,对接人在群里敲了一行字,句尾没带表情,「评审就在下周,我需要一份能写进材料的正式结论。周日晚八点前发我。「
这一行字压过来,分量骤然变了。不再是口头汇报,是要签字画押的东西。
王海涛秒回「保证没问题「。老周打了半个句子又删掉,最后只剩两个字:「收到。「
对接人没再追问,退出群聊前补的最后一句敲给了所有人看:「材料别让我为难。」八个字,公事公办的壳底下藏着恰到好处的一分冷。
林默没吭声。信不过。「网络波动「四个字糊弄外行勉强,摆给业内人都嫌薄——真正的波动散漫随性,东边日出西边雨,绝不会掐着十四个半小时一趟、分毫必准地打卡。卡着点的波动,名字本身就起错了。
也明白王海涛为什么情愿这么写。不是蠢,是不敢——一旦定成「有人动手脚「,等于承认这套自己带队验收、当众拍过胸脯的系统,里子从来没干净过。评审在即,二期入场券攥在手里,这时候掀盖,掀的就是自己的台。所谓波动,一半写给甲方看体面,一半写给自己当安眠药。
老周趁王海涛下机房,端着保温杯挪到角落,嗓音压得很低:「默哥,你说实话……真是波动么?「
「再看一天。「晃了晃杯子里的热水,「数据没摆完之前,谁都别急着定性。「
老周张了张嘴,那句没说出口的话在舌尖上滚了一圈,咽了回去。其实他也咂摸出味道不对,只是职级和胆量,都撑不起把这个「不对「讲完整。
当天夜里,出租屋,台灯拧亮。书面说明的死线挂在头上,得先办;但动手之前,另一件事更急——他先把这几天周三的日志全量拉了出来。王海涛几下重启冲掉的那份现场只是屏幕上的表演,真正的原始记录,天枢早在边缘节点存了旁路遥测,一份不缺。
「验验它。「指节在触摸板上叩了两下,「看它是自己长出来的,还是被人安进来的。「
【早就验着了。】频率粘贴来,语速比平日快半拍,是被勾起了兴致的路数,【七次发作逐一倒推——每次掉线前的十一二分钟,内核都有小动作。有个非内核模块的自检锚点被人轻轻碰了一下。单次写入几十字节,裹在保活协议的正常节律里,碰完就走,什么都不带走。】
视野里七条曲线叠进一张图,关键落点套上金框。噪声一层层褪下去,脉络浮上来,齐齐指向每次掉线前那十几分钟的空白地带。
【锚点是自检机制的裁判。】天枢继续拆解,【裁判每被改一笔,服务对自己的判断就歪一分;歪到临界,进程宁可把自己锁死下线,也不肯带着糊涂帐硬跑——这就是那几分钟的脱机。等保护机制松绑,它再若无其事地站起来。全程没有爆炸,没有报错洪流,安静得像什么都没发生过。】
【定性:人为投放的慢速腐蚀脚本。】试刀,落骨。
半年前那扇没关严的门后头,有人推了第二下,而且这一次的位置,比上次深得多。
白蚁蛀梁,墙皮完好无损。等到承重那天塌下来,外头只会议论风太大。
这些年见过的「突然崩了「,复盘到底,多半都挖得出一段无人盯防的慢性损坏。突发崩溃是外伤,看得见也好治;这种慢性侵蚀是内疾,疼起来的时候,往往已经是病危通知。
