第46章 《山海》的壓力測試

投票推薦 加入書籤 小說報錯

  二月七日,凌晨一點。深圳南山,創新大廈五樓東側的玻璃房裡,空氣凝固得像一塊冰。十六台高配電腦屏幕亮著,十六雙眼睛盯著屏幕,但沒人說話。只有伺服器風扇全速運轉的轟鳴聲,像某種巨大野獸垂死前的喘息,在密閉空間裡迴蕩。

  屏幕上是「山海」壓力測試的監控面板。左側是實時數據:在線人數 8,427,還在緩慢增長;幀率 28 FPS,勉強可玩;網絡延遲 112 ms,偏高但可接受。右側是資源占用:CPU 97%,內存 89%,資料庫連接池占用 100%。所有指標都在危險邊緣跳舞。

  阿坤坐在監控台前,背挺得筆直,但手在抖。他眼鏡片上反射著屏幕的光,那些跳動的數字像心電圖,顯示著「山海」這個新生世界的脈搏——虛弱,但還在跳。他已經四十八小時沒合眼,下巴的胡茬青黑一片,眼裡的血絲像蛛網。

  「一萬了。」王磊的聲音從身後傳來,很輕,但在一片死寂中像炸雷。

  在線人數突破一萬。這是「山海」偽3D引擎的第一次萬人同圖測試,目標是在簡陋硬體(模擬2003年主流配置:賽揚1.7GHz,256MB內存,英特爾845G集顯)上,跑出流暢的體驗。測試用戶是浩宇從《血戰天下》老玩家裡招募的志願者,兩千人,加上八千個模擬機器人。伺服器是剛採購的戴爾PowerEdge 2650,四路至強,16GB內存,在2004年算是頂配。

  但現在,頂配伺服器在呻吟。

  「資料庫響應時間突破500毫秒了。」張一鳴盯著另一個監控界面,聲音平靜,但眉頭緊鎖,「索引命中率在下降,有全表掃描的跡象。我們的查詢優化器可能有問題。」

  「關掉非核心服務。」阿坤說,聲音嘶啞,「郵件系統、排行榜、聊天頻道,全部停掉。集中資源保核心玩法。」

  「已經在做了。」趙永在另一台機器上快速操作,「但資料庫連接池滿了,新請求在排隊。等待隊列已經積壓了三千多個查詢。」

  「清連接。把閒置超過三十秒的連接踢掉。」

  「踢了,但新連接建立需要時間,玩家會感覺卡。」

  「顧不上了,先保住伺服器不崩。」

  玻璃房裡鍵盤聲密集起來,像暴雨敲打鐵皮屋頂。每個人都在自己的終端上操作,關服務,調參數,殺進程。但屏幕上的數字還在惡化:CPU 99%,內存 92%,資料庫響應時間突破800毫秒。

  凌晨一點四十七分,第一波玩家掉線。世界聊天頻道(還沒關掉的部分)開始刷屏:

  「卡死了!」

  「動不了!」

  「技能放不出來!」

  「伺服器炸了?」

  阿坤的手指在鍵盤上飛舞,調出資料庫慢查詢日誌。日誌在瘋狂滾動,每秒新增幾百條。他快速掃描,鎖定一個查詢:

  SELECT * FROM player_items WHERE player_id = ? AND item_type IN (?,?,?,?,?,?,?,?,?,?) ORDER BY created_at DESC LIMIT 50

  「這個查詢,」他指著屏幕,「player_items表有千萬級數據,item_type有十個可能值,索引是(player_id, item_type),但IN查詢讓索引失效了。全表掃描,每秒執行幾千次,資料庫不崩才怪。」

  「誰寫的?」王磊問。

  「我。」陳默的聲音從角落傳來,很小,「物品系統我負責的。我想一次查出玩家所有類型的物品,減少查詢次數……」

  「想法沒錯,但實現錯了。」阿坤快速改代碼,「拆成十個查詢,用UNION,或者用臨時表。但現在來不及了,先加force index強制走索引。」

  他改完,部署。三分鐘後,資料庫壓力稍降,但CPU還是99%。

  凌晨兩點零八分,在線人數突破一萬二。伺服器開始出現周期性卡頓:每三十秒,幀率掉到5以下,持續五秒,然後恢復。玩家罵得更凶了。

  「是GC(垃圾回收)。」張一鳴調出JVM監控,「老年代內存滿了,每次Full GC要五秒。我們的對象創建太頻繁,特別是技能特效和傷害數字,每個都是獨立對象,用完就丟。」

  「用對象池。」阿坤說,「但現在改不了,先加大堆內存。」


  「已經最大了,16G全給了Java。物理內存不夠了。」

  「那就砍特效。同屏技能特效超過十個,後面的不顯示。」

  「在做了。」

  凌晨兩點三十三分,在線人數一萬三千五百。伺服器CPU曲線出現鋸齒狀波動,從99%掉到60%,又飆回99%。這是死鎖的典型特徵——某個資源被競爭,線程在等待中休眠,然後被喚醒,繼續競爭。

  「資料庫死鎖。」趙永調出死鎖日誌,屏幕上一片紅,「事務A鎖了玩家表行1,等待物品表行2;事務B鎖了物品表行2,等待玩家表行1。循環等待,超時後自動回滾,但新請求又來,繼續死鎖。」

  「事務隔離級別是RR(可重複讀)?」阿坤問。

  「是。我們之前為了數據一致性,設的RR。」

  「改成RC(讀已提交)。先活下來,再談一致性。」

  「改了,需要重啟資料庫。」

  「重啟。」

  資料庫重啟花了三分鐘。這三分鐘,所有玩家掉線。世界頻道最後一條消息是:「浩宇牛逼,把伺服器測炸了!」後面跟了一串笑哭的表情。

  凌晨兩點四十一分,資料庫重啟完成。玩家重新連接,在線人數慢慢爬回八千。但所有人都知道,測試已經失敗了。萬人同圖的目標,在現實面前碎了一地。

  玻璃房裡死寂。只有伺服器風扇還在響,但聲音聽起來像嘲諷。

  阿坤摘下眼鏡,用力揉著眉心。手指在抖。他想起三個月前,林浩在白板上畫「山海」的架構圖,眼神堅定地說「我們要做中國人自己的3D MMO」。想起團隊加班加點,寫了幾十萬行代碼,調了幾千個參數。想起今天測試前,大家眼裡那種期待的光。

  現在,光滅了。

  「是我的問題。」阿坤開口,聲音很乾,「資料庫中間件是我寫的,事務隔離級別我設的,對象創建策略我定的。崩了,我負責。」

  「現在不是追責的時候。」王磊說,「問題是,接下來怎麼辦?測試失敗了,消息傳出去,玩家會失望,投資方會質疑,盛大會看笑話。」

  「重寫。」另一個聲音從門口傳來。

  所有人回頭。林浩站在玻璃房門口,穿著簡單的灰色衛衣,頭髮亂糟糟的,看起來也一夜沒睡。他手裡拿著一個保溫杯,走到阿坤身邊,看著監控屏幕。

  「資料庫中間件的線程調度模塊,要重寫。」林浩說,聲音很平靜,「現在的調度算法是簡單的輪詢,高並發下會有飢餓現象。要改成帶優先級的搶占式調度,高優先級事務(比如戰鬥、交易)優先執行,低優先級(比如郵件、成就)排隊。死鎖檢測要從被動等超時,改成主動檢測,發現死鎖立即拆,而不是等十分鐘。」

  阿坤看著他:「現在重寫?來得及嗎?」

  「來得及。」林浩把保溫杯放在桌上,拉過一把椅子坐下,「你們去睡,我寫。天亮前,新模塊上線,重新測試。」

  「你一個人?」

  「嗯。」林浩已經打開了代碼編輯器,調出資料庫中間件的源碼,「這個模塊我熟。當初設計的時候,就留了後手——調度算法是插件化的,換掉核心文件就行。你們去休息,養足精神,早上八點,第二輪測試。」

  沒人動。所有人都看著他,這個十八歲的創始人,在伺服器崩了、測試失敗、團隊士氣跌到谷底的時候,沒有罵人,沒有抱怨,只是平靜地說「我重寫」。

  「我陪你。」阿坤重新戴上眼鏡。

  「我也在。」趙永說。

  「加我一個。」張一鳴坐回座位。

  王磊笑了,是那種疲憊但釋然的笑:「行,那都別睡了。林浩寫調度,阿坤調資料庫,一鳴優化GC,我盯著伺服器。陳默,你帶美術組去睡,明天還要改特效。」

  陳默點頭,帶著美術組的人離開了。玻璃房裡剩下九個技術核心,九台電腦,九雙盯著屏幕的眼睛。

  林浩已經開始寫了。手指在鍵盤上快速敲擊,幾乎不用思考。他寫的是一個全新的線程調度器,基於時間片輪轉加優先級搶占。高優先級事務(戰鬥、移動、技能)分配大時間片,低優先級事務分配小時間片。死鎖檢測模塊獨立成一個守護線程,每100毫秒掃描一次事務圖,發現環就強制回滾優先級最低的事務。

  代碼像流水一樣從他指尖淌出。變量命名規範,注釋清晰,邏輯嚴謹。阿坤在旁邊看著,心裡越來越驚。這種代碼,不像現場寫的,像在腦子裡醞釀了很久,只是現在倒出來。調度算法的數學證明,死鎖檢測的圖論算法,都是研究生級別的難度,但林浩寫得行雲流水,像寫hello world。


  凌晨四點二十,新調度模塊寫完。林浩敲下最後一行注釋,保存,編譯。沒有錯誤。

  「部署。」他說。

  阿坤接過編譯好的jar包,替換掉原來的中間件,重啟服務。伺服器再次轟鳴起來,監控屏幕上的數字開始跳動。

  凌晨四點五十,玩家重新連接。在線人數慢慢爬升:五千,八千,一萬……突破一萬二,穩住了。

  CPU占用降到85%,內存80%,資料庫響應時間200毫秒。幀率穩在30以上。

  世界頻道又開始刷屏,但這次是:

  「不卡了?」

  「流暢了!」

  「浩宇牛逼!」

  「剛才是不是在偷偷優化?」

  玻璃房裡,九個人盯著屏幕,沒人說話。直到在線人數突破一萬五,所有指標依然平穩,王磊才長出一口氣,癱在椅子上。

  「過了。」他說,聲音發虛。

  「過了。」阿坤重複,摘下眼鏡,這次是真的哭了,眼淚無聲地流下來。不是難過,是釋放,是這四十八小時緊繃的神經終於松下來的生理反應。

  林浩也靠在椅背上,看著屏幕。窗外,天快亮了,深藍色的天幕邊緣泛起魚肚白。他拿起保溫杯,喝了一口水,很涼。

  「但這只是第一關。」他說,聲音很輕,但每個人都聽見了,「資料庫中間件的問題解決了,但偽3D渲染的瓶頸還在。萬人同圖,集顯跑不動,這是硬體天花板。我們要做的不是突破天花板,是在天花板底下,找到能讓玩家覺得『爽』的平衡點。」

  「怎麼找?」張一鳴問。

  「數據。」林浩說,「這次壓力測試,產生了十億條玩家行為日誌。一鳴,你分析這些數據,找出玩家的核心行為路徑:他們大部分時間在幹什麼?是打怪,是社交,是探索,還是發呆?然後我們優化核心路徑的體驗,非核心路徑可以簡化甚至砍掉。我們要做的不是讓遊戲在所有方面都完美,是讓玩家在意的方面,做到極致。」

  張一鳴點頭,手指已經在鍵盤上敲起來了。

  窗外,天徹底亮了。晨光照進玻璃房,照在九張疲憊但興奮的臉上。

  伺服器還在跑,在線人數穩在一萬六千。

  「山海」的第一場壓力測試,在崩潰邊緣被拉回來了。

  但所有人都知道,真正的戰爭還沒開始。

  這只是第一次衝鋒。

  後面還有更難的:性能優化,內容填充,商業模式,市場競爭,以及……盛大的虎視眈眈。

  但至少今夜,他們贏了。

  贏了一小局。

  林浩站起身,走到窗邊,看著外面漸漸甦醒的深圳。

  城市在晨光中輪廓分明,像一頭剛睡醒的巨獸。

  而浩宇,剛剛在這頭巨獸的腳邊,點亮了一盞小小的燈。

  燈很弱,但亮著。

  而且,會一直亮下去。

章節目錄