機房裡只剩伺服器的嗡鳴,和地板上空調出風口那道細弱連綿的嘶聲,像一匹綢子在很遠的地方被慢慢撕開。
林默又坐了近兩個小時。
凌晨的地下一層冷得透骨。冷氣不認季節,順著腳踝往上爬,先把小腿凍木,再往膝蓋里鑽。他縮著肩,連帽衫起了球的袖口蹭在鍵盤邊沿,布料上滲了一層薄汗,又被涼意激成黏膩。手邊的礦泉水涼得喝不下去,擰開抿一口,半瓶晃著燈影放回去。桌上攤著最後半包蘇打餅乾,也忘了什麼時候拆的。
告警面板上的那片紅,從燎原之勢退成一星半點,終於徹底熄滅。調度層的「緩慢失序」被他掐住了源頭——至少,看得見的那個。
可他盯著空下來的面板,沒敢鬆勁。
慢崩最坑人的就是「看著好了」。他見過凌晨兩點收工、四點又被叫回來的假平穩。那東西比真崩還毒,再崩時連懷疑對象都變了樣,所有壓力全砸在拍胸脯說「搞定」的那個人頭上。又調出過去六小時的資源快照,逐分鐘比對。一屏看不完,切窗口接著捋,目光順著曲線一格一格往下走,捋到確認那條失序曲線是真的平了才停——不是被採樣間隔蓋住的那種平,是每一分鐘都踩得住的平。
幹這行久了,最狠的一課就一句話:監控會騙人,尤其當採樣點剛好錯過那一下抽搐的時候。
確認無誤,指尖才從鍵盤上移開。指腹還殘留鍵帽的涼,手心微微發顫。胃裡空得發緊,餅乾救不了場。
第二個問題浮上來:記不記?
按規程,這種級別的異常該原原本本寫進工單系統——現象、定位、處置,一條條落檔。指尖在新工單輸入框裡停了一下,又退了出來。
不行。
工單是明面上的東西。一旦登記「冗餘計數被異常改寫」,等於敲鑼打鼓告訴埋雷的人:你的暗門被摸到了。誰知道那雙眼睛會不會每天早晚各刷一遍運維系統?況且這公司底細他清楚——工位區一半座位坐著陳太太娘家那撥親戚,登錄權限幾乎人人都有,閒得發慌就愛翻系統湊熱鬧。「異常改寫」四個字一旦躺在那兒,今天傳成靈異,明天傳到他耳朵里就換了版本。
他只在隨身舊筆記本里記了一行縮寫。字母加數字,還倒著拼,除了他自己誰也看不出指什麼。位置不寫,手法不寫,連「是誰」都不猜——紙會說話,筆跡也會被人認,寫得越少越安全。
伸個懶腰,頸椎咔吧一聲,在空蕩機房裡格外清脆。
屏幕角落那行仿宋體還安靜浮著,不肯走,也不催。
【表面穩了。】用氣聲說,手指虛搭鍵盤,「你是說,還有我看不見的?」
左耳後脖頸那塊熟悉的跳動應聲而來,跟昨夜頭一回開口時一模一樣。不疼,卻清楚提醒他——有另一個頻率正貼著他的神經共振。這次天樞沒再浮上屏幕,是直接落進腦子裡的。不經由空氣,不震鼓膜,頭骨內側、耳蝸後上方憑空響起,字字清晰,比任何貼耳的話都真。
【看見的火你滅了,看不見的火還在燒。方才那套排查,治標。真正的麻煩,藏在心跳包里。】
林默挑了下眉。
心跳包他熟——分布式系統里最乾淨也最無聊的保活探針,客戶端每隔幾秒朝服務端發一個輕量信號,意思是「我還活著」。最乾淨,所以沒人主動盯;也正因如此,才是最理想的藏身處。監控規則里,心跳包永遠是放行白名單:不報警、不留人工覆核、不占排查優先級。
帶新人那年他開宗明義就一句:別信白名單。曾見一套系統,後門就混在心跳包里,同鏈路上老運維盯了三個月流量圖譜,愣是沒往那個「永遠正常」的信號上多瞅一眼。從那時起他多了條鐵規矩:凡是「一直正常」的指標,都要回頭多問一句——它是真正常,還是只是沒人去數那根被悄悄掰彎的針?
【最乾淨的地方,最適合藏髒東西。】天樞語氣裡帶著不耐煩,一字一頓敲進他頭骨,【這套系統是增量備份機制,有個東西偽裝成正常心跳包,每隔幾秒咬一口你的冗餘備份。它不炸,不崩,不報警——只是慢慢把你這套政務雲的備胎啃薄。哪天真出事,你連回滾的餘地都沒有。】
後背那層薄汗還沒幹,又被這句話激得發起緊來。
十來年軟硬體做下來,他太懂這種慢性陷阱的噁心。不聲不響,等你發現往往已踩在救不回來的臨界點上;藏得又刁,裹在保活協議底下,混在正常校驗節律里,常規監控掃一百遍都是綠的。三年前一家銀行的備援演練也是類似手法,冗餘計數錨點被人悄悄挪過,好在離正式切換還有半個月,撞在演練槍口上。打那以後他又添一條:凡「備胎」,每月親手校一次計數,絕不假手監控。
「位置。」只回兩個字。
埋雷人的輪廓,其實差不多描出來了——多半是個摸透了這套政務雲的內鬼,至少也是個能調心跳包序列號的人。外人進不來內網,偽造不出那一千個真心跳里的節奏;能混在常態里不露餡的絕不是腳本小子,是手裡攥著鑰匙、又存了別樣心思的主。是誰不重要。先問怎麼辦,再查為什麼——這是公司垮掉刻進骨頭裡的次序。
手指懸上鍵盤。
查也不能明著查。直接搜心跳包隊列,等於舉著手電筒在人家地窖里找暗門——照到的每寸牆都在告訴主人你在哪。林默給自己找了個再正當不過的由頭:月底例行深度巡檢。這套動作他做過幾十遍,閉著眼不走樣。先導出全量接口清單,把幾個委辦局已接入的調用情況從頭篩;順手核對證書有效期,再看存儲水位。每一步都留著完整審計痕跡,將來誰來查,看到的只是一個較真的運維在做份內事。
幌子鋪到第四步,那隻手露了。
尋常檢查只過一遍心跳統計面板,多看一眼均值方差就算盡職。天樞教的這層不一樣:把七天裡每一個心跳包的到達時刻摞到微秒級去比對,看節律偏移。數據量嚇人,天樞替他扛了九成算力,他只負責在高亮處點頭。一幅半透明拓撲草圖投射到林默的視覺神經里,這感覺很奇妙,視覺上就像科幻電影裡的懸浮透明觸控屏一樣。整張圖上,某條數據支線染成暗金色,指向邊緣節點集群里一處冗餘區。每隔4.2秒,一次極小的寫操作。單次小到可以忽略,落在容量圖上連個毛刺都不算。
可它啃的是備份的存活計數——錨點每被咬掉一格,整套冗餘就塌一分。更陰的是發包節奏:包長、間隔、序列號做得規規矩矩,混在一千個真心跳里,就像一千件同樣制服中間混進了便衣,不挨個盤問根本認不出。
林默盯著那片暗金色看了十秒,喉嚨幹得發疼。
【逐行改掉它的校驗邏輯,把計數錨點釘死。】天樞標出三處,【照著改。】
第一處在核心交換機轉發規則表里,第二處嵌在冗餘服務的計數器校驗段。第三處最深,藏在一份多年沒人動過的兼容模塊末尾——藏的位置本身就在傳遞信息:下刀的人對這套代碼熟到了骨頭縫裡。
不能大改。大改會驚動埋雷的人,對方一察覺暗門被摸,立刻換鎖,甚至反咬一口栽給別人。只能像拆引線一樣,把觸發條件悄無聲息抽掉,讓它下次咬進去時咬中一段早已釘死的死區,自己空轉,自己失效,表面一切如常。每改一行都得把前後十行上下文掃一遍,確認沒有牽一髮動全身的耦合。
拆彈的人最忌手抖,也忌貪快。
改到第二處的當口,屏幕右下角忽然彈出提醒——監控平台自動巡檢確認單,要值班人員五分鐘內回復。走廊對面機柜上方那顆巡檢燈由綠轉黃,開始閃。
林默的手指僵在半空。心跳包手術進行到一半,刀口敞著。這時候跑去做別的,回來還得重建現場;拖著不理,五分鐘後系統自動升為超時告警,驚動的不止王海濤的簡訊,還可能吊起某些耳朵。
【我來按住場面。】頻率沉下來,語速第一次放這麼慢,【游標別動,我把它停在當前行的鏡像狀態里。你去回話,像平時一樣。】
深吸一口氣,切出去,點開對話框。倒計時還剩三分二十秒。指尖落下去,節奏刻意放鬆:「收到,在。月底深度巡檢進行中,無新增告警,預計一小時後匯總。」發送。光標縮回去,心跳漏了兩拍才恢復。指示燈由黃轉綠。對面機櫃安安穩穩,像什麼都沒發生過。
【回得還行。】天樞聲音重新貼上來,帶著點松下來的懶散,【比我預期的好。手別停,繼續。】
剩下的活兒不敢再有任何岔路。第二處收口,進最後一處。改第一遍整段時,腦內點評不期而至:
【這兒,括號後頭多敲了一個空格。大小寫也跟你習慣走了——原文是駝峰混合,你敲成了標準式。風格不一致,老手聞得出味道不對。】
林默一頓。低頭看那行。原本應是 if(redundancyCount > threshold)的寫法,括號後頭果然空出一格;改過的段落也被他自己順手的習慣裹成了標準格式。默默刪掉空格,字符一個個掰回去,指腹懸在回車鍵上方頓了半秒才落下。這一下,竟有點感激它的挑剔。往常這些細節未必回頭摳,可今晚,一絲味道不對都可能驚醒埋雷的人——人家認的不是對錯,是味道。
【這才像話。】天樞輕哼,傲氣又掛回腔調,【你現在的水平,放我們那個年代頂多算學徒。不過眼下這場面,夠用了。】
嘴角抽了抽。不會誇人,偏讓人挑不出理。
第三處改完,他沒立刻合本子。
「門是焊死了。」盯著屏幕低聲開口,「可萬一過陣子,埋門的人回來撬呢?」
【那你打算怎麼辦?裝報警器,他一碰就叫?】不等回答,語氣里笑意淡下去,【叫了就是捅自己。要盯它,就得安靜地盯。】
倆人在這一點上倒默契:不動聲色是最要緊的前提。最後敲定的方案,是改完後十分鐘裡商量出來的——加旁路的只讀探針,釘在死區旁邊。不攔截,不警告,不碰任何現有進程;誰的手伸進來,幾點幾分,哪種欄位模式,各自悄悄記一筆。純記帳,不出聲。埋雷的人若永遠不來,這筆帳就一直躺著睡;若真回來撬門——那次敲門的人不會知道,屋裡早已換了記鐘的方式。
二十分鐘,三處全處理完。加上監視旁路,前後不到五十分鐘。合上筆記本,切回正常運維界面。冗餘計數那條小角度下行的曲線被他硬生生掰平,伺服器嗡鳴重新規律起來。
盯著曲線看了三秒才慢慢吐氣——不是松,是確認。
天樞安排的兩輪復現實驗也在這間隙做完:借政務雲邊緣餘量重演了兩次拆彈時的負載峰值,輸出的能量簽名兩次都在,抖動卻不重樣。確定性故障不會這樣,隨機噪聲也不會恰好兩次都現形。
【不是我的錯覺,也不是你的。】這一次它的聲音很輕,【要麼這塊殘片在自己生長,要麼有什麼東西在外面輕輕敲它。眼下分不出是哪一種。】
指尖無意識抵著桌沿。昨夜那句「我未必是唯一」又浮上來,比之前多了種滋味——水裡不止一條魚,其中至少一條,正貼著他的容器呼吸。
「先記著。」最終只說了三個字。
解不開的東西先掛在鉤子上晾著,總好過硬拽。收電腦,關燈。地下一層歸低頻嗡鳴,黑暗裡指示燈紅綠交錯。走出附樓大門時天邊已泛魚肚白,冷風一吹才覺出後頸汗涼津津貼著衣領。門口保安亭里夜班師傅剛泡好茶,隔著玻璃沖他抬了抬下巴。刷卡出門的手有點不利索,第二回才對上讀卡區。
夜色正被一層層揭掉。主幹道上環衛車沿路緣慢慢爬,灑下水霧在路燈底亮了一圈又一圈。街角早點鋪捲簾門升上去一半,蒸籠白汽先於招牌湧出來。林默靠在計程車后座,屏幕冷光照出下巴一片青黑胡茬——到家沖個澡,眯兩小時,八點半還得爬起來開晨會。
他忽然想起出租屋天花板上那圈舊水漬。今晚回去關燈躺下,那圈黃印子應該還在老地方等著,一如既往。可有些東西不一樣了。兜里揣著的東西,別人看不見,他自己也還說不清是什麼——可這半年來頭一回,他期盼著第二天到點爬起來...