十萬。
屏幕上的數字跳了。
九萬九千九百九十九,變成了一零零零。
六位數。
宴會廳里有人看見了,拍了一下桌子喊:「破了!十萬了!」
陳天宇把香檳瓶舉起來,拇指頂住瓶塞,使勁一推。
瓶塞沒彈出來。
因為他的眼睛看見了另一個東西。
屏幕左邊,在線人數的數字,從十萬零一,跳到了十萬零三。然後停了。
不是停了。
是整個屏幕卡了。
數字不跳了。曲線不動了。狀態欄上那個綠色的「正常運行」字樣,閃了一下。
變成了紅色。
「伺服器異常」。
運維主管從椅子上彈起來。手機已經貼在耳朵上了。那頭沒人接。
他撥了第二個電話。機房值班。響了兩聲,接了。
對面的聲音帶著慌:「主管,CPU全滿了!所有節點,百分之百!」
「什麼時候的事?」
「就剛才!一秒鐘之內,從百分之三十七直接拉滿!」
運維主管看了眼屏幕。《魔途》的在線人數定在十萬零三,一動不動。
他又問:「內存呢?」
「溢出了。所有進程互相鎖著,殺不掉。我試了kill -9,沒反應。作業系統層面就卡死了。」
運維主管把手機從耳朵邊拿開,轉頭看向陳天宇。
陳天宇還舉著香檳瓶。
「陳總,伺服器全掛了。」
陳天宇沒動。
宴會廳里的人開始議論。有人還在鼓掌,沒反應過來。有人已經看見屏幕上那行紅字了。
LED大屏上,《魔途》的狀態面板一個接一個變紅。
第一集群。紅。
第二集群。紅。
第三集群。紅。
全紅了。
底下有人掏出手機試著登錄《魔途》。進不去。客戶端卡在加載界面,轉圈。
趙磊從座位上站起來,臉上的笑還沒收回去。他掏出筆記本電腦,當場打開,連上酒店WiFi,遠程登了一台跳板機。
敲了兩行命令。
沒有回應。
他又敲了一行。屏幕上吐出一行錯誤日誌。
「deadlock detected: process A waiting for lock held by process B, process B waiting for lock held by process A…」
死鎖。
邏輯死鎖。
趙磊盯著那行日誌,手指懸在鍵盤上方。
他認識這個。不是系統級的死鎖。是業務邏輯層面的。寫在遊戲引擎底層的。
他回頭看了一眼李棟。李棟也打開了電腦,臉色不對。
「趙哥,我查了一下觸發條件。是並發連接數等於一十萬的時候,底層有一段代碼會把所有線程的鎖標記同時翻轉。」
趙磊湊過去看。
一段藏在內存管理模塊最深處的條件判斷。if concurrent_connections >= 1000,執行一個函數。
那個函數做的事情是:把所有共享資源的互斥鎖全部置為占用狀態。然後讓每個線程去等待其他線程釋放鎖。
沒有人會釋放。因為所有人都在等。
死循環。
「這段代碼誰寫的?」趙磊問。
李棟看了眼提交記錄。沒有提交記錄。這段代碼不在版本管理里。它是直接寫在編譯後的二進位文件里的。
硬體指令層面。
趙磊的臉白了。
他想起來了。這套引擎,是從際華那邊帶出來的。底層架構是際華的人搭的。
他們帶走的是源碼。但編譯好的核心庫,是用際華提供的工具鏈生成的。
工具鏈里動了手腳。
編譯的時候,自動把這段死鎖邏輯注入到二進位文件里。源碼層面看不到。代碼審查查不出來。只有反彙編才能發現。
陳天宇走過來了。香檳瓶放下了。臉上什麼表情都沒有。
「怎麼回事。」
趙磊抬頭看他。嘴巴張了張,說不出話。
李棟替他說了:「陳總,底層引擎被下了套。並發到十萬的時候自動觸發邏輯死鎖。不是軟體bug,是編譯層面注入的。查不到,改不掉。」
「重啟呢?」
「重啟沒用。服務一起來,玩家重新連接,並發數一到十萬,又死。」
「那把並發限制在十萬以下。」
趙磊搖頭:「來不及。限流邏輯要改源碼重新編譯,但編譯工具鏈本身就有問題。用它編譯出來的東西,還是帶那段代碼。」
「換編譯器。」
「換了也沒用。核心庫的二進位已經污染了。除非把整個底層引擎推翻重寫。」
陳天宇站在那裡。
宴會廳里的人已經不聊天了。所有人都在看著他。
老沈放下酒杯,站起來,走了。沒跟任何人打招呼。
IDG的兩個副總裁對視了一眼,也站起來了。
記者們在拍照。閃光燈一下一下。
陳天宇沒看他們。
他盯著LED屏上那排紅色的狀態燈。
「資料庫呢?」他問。聲音壓得很低。
運維主管查了一下:「資料庫還活著,但磁碟IO被鎖死進程占滿了,寫入隊列全堵了。如果持續下去,資料庫緩衝區會被寫滿,然後崩。」
「玩家的充值數據在裡面。」
「在。」
「充值記錄,七萬多人的消費流水,都在資料庫里。」
「對。」
陳天宇轉身就走。
西裝下擺帶著風。他推開宴會廳的側門,進了走廊。電梯。地下一層。酒店機房。
盛騰租了國貿酒店地下一層的半個機櫃間當臨時監控中心。
他衝進去的時候,三個值班的運維人員正對著屏幕發呆。屏幕上全是紅色告警。
「拔電源。」陳天宇說。
三個人轉頭看他。
「把應用伺服器的電源全拔了。只留資料庫伺服器。」
運維人員沒動。
「你聾了?拔!現在!」
一個人站起來,走到機櫃前面。手伸到伺服器後面,握住了電源線。
停了一下。
「陳總,強行斷電的話,資料庫那邊正在寫的事務會丟。緩衝區里沒落盤的數據也會丟。」
「丟多少?」
「不好說。最壞情況,最近二十分鐘的交易記錄全沒。」
陳天宇閉了一下眼睛。
「拔。」
電源線被拽出來了。
一台。兩台。三台。
應用伺服器的指示燈一盞接一盞滅了。風扇聲停了。
機房裡安靜下來。
只剩資料庫伺服器還亮著。硬碟燈瘋狂閃爍,在拼命把緩衝區裡的數據往磁碟上寫。
陳天宇站在機櫃前面。
LED屏上,《魔途》在線人數的位置,變成了一個灰色的橫槓。
服務不可用。
他站了很久。
樓上宴會廳里,座位已經空了一半。