B站自曝去年服務器大崩潰原因 就因為這?


不知道差友們還記不記得,去年的7月13日,B站發生一件大事。它毫無征兆的崩……(如果忘的小夥伴,可以看 這篇文章 )至於為啥崩,當時大傢誰也心裡沒個底。不過吹起水來可是一套一套的,什麼停電啊,起火啊,程序員rm-rf/*跑路啊……說的是個天馬行空。

後來呢,隨著 B 站在凌晨兩點一頓修仙,把服務器問題給慢慢解決,這件事情也算是告一段落。

本以為這次 B 站崩會和微博上無數崩的網站一樣,成為我們沖浪生活中的一個笑談,僅留下一個大會員給我們 “ 緬懷 ”。

沒想到在今年的 7 月 13 日,B 站特意發一篇文章,刨開心窩子來給我們講一講,那個晚上,到底發生什麼。

咱也看一下這篇文章,好傢夥,讓整個 B 站崩潰的原因,竟然隻是一行代碼沒寫好???借著這篇文章,世超準備帶大傢從 B 站的角度來回顧一下這件事情。放心,不會有生澀難懂的名詞,不會有犀利糊塗的黑話,保證小白也能看明白。   案情回溯:  意外,發生在 2021 年 7 月 13 日的 22 時 52 分。

負責搞定站點可靠性的工程師(SRE)和B站的客服都收到大量網站打不開的報警。

而負責處理這些事故的同事已經下班,當即準備在傢裡通過 VPN 來登錄公司內網處理這些問題。

結果發現VPN 也崩……壓根進不去系統。最後,還是在公司的整個 “ 綠色通道 ” 才成功進去。你說這綠色通道不會是向日葵吧(一種遠程桌面軟件)

而在綠色通道成功打通,負責各種業務的團隊就位之後,B 站也開始對問題進行分析定位。出問題的模塊也很明顯,在線業務主機房的7層 SLB(負載均衡服務器,用來處理多用戶,多業務的情況)的 CPU 跑滿 100%。

簡單來說,就是 CPU 被不知道哪裡來的刺客給占用光算力,沒法處理業務。

系統未響應.exe ▼

B 站最開始的嘗試方法呢,和咱們平時手機電腦卡機後做的操作一樣。

重啟就完事,要相信重啟能解決 90% 的問題!

但很可惜,B 站這次是那個 10.5%。

說業務恢復嘛,也沒有,主機房重啟後還是出現CPU 跑滿 100%的問題。不過別的機房好起來,雖然會卡,但是沒出現 CPU 跑滿的問題。

有一部分做多活的業務(多站點同時提供服務)開始慢慢恢復。所以……重啟不能完全解決問題,但是這個問題既然過去沒出現過。

那會不會是新加入的代碼問題呢?隨著時間在一分一秒的過去,借助分析工具的幫助,問題被定位到最近新上線的 Lua (一種編程語言,類似 Python,Java 這些) 函數上。

隨後,B 站開始進行一波波緊張的回滾操作。

這一通工作弄下來,雖然好像找到幾個疑似出問題的部位,但服務器還是該掛掛,距離 “ 康復 ” 還有那麼一些距離。

沒辦法,總得讓業務先跑起來吧。於是團隊開始兵分兩路。一隊繼續堅持排查問題,尋找原因,另一隊則是開始重建一個新的 SLB 服務。

在緊張刺激的一小時後,新的 SLB 配置成功,原本導向主站的流量也慢慢的開始遷移過去。

好在這次行。

凌晨兩點,在崩潰三小時之後,B 站的業務總算得到恢復。   罪魁禍首:  上面這些,就是那個晚上 B 站發生的故事,雖然解決表面問題,讓業務恢復。

可是最根本的原因是啥呢?如果不找到根因,那遲早會二度暴雷。

負責排查問題的同學也沒讓人失望,在時間壓力大大放緩之後,找出真相。沒有外星人,沒有起火,沒有斷電,和網友們想象的大相徑庭。B 站這次崩的根因,僅僅是因為一個求最大公約數的函數沒寫好……

咱先盤一下這個 “ 萬惡之源 ” 哈。

這是一個典型的 “ 自己調用自己 ” 的遞歸函數。a b兩數字輾轉求餘,直到 b 等於 0 的時候函數終止。不然這個函數就會自己調用自己,重新再跑一遍。

看上去好像是一點點問題都沒有,既明確遞歸的終止條件(b = 0),也沒有太多復雜的邏輯處理。但是既然事情能發展到這地步……那就說明是出大問題。對編程有些解的差友可能發現不對:

你傳進去的 0,是個什麼 0?沒錯,在編程語言裡,數字 0 和字符串 ‘ 0 ’ 並不算是一個東西。為防止呆呆的計算機語言把事情給搞混,像 C 語言,Java 這些靜態語言都會要求我們在創建新變量的時候聲明這個變量的類型。

搞清楚它到底是整數,還是小數,或者是一個字符。然而 Lua 是個非常智慧的語言,它沒有這個要求。麻煩的臟活累活讓它自動來做就好,Lua 會根據程序的需求自動分配變量類型。

C語言示例:# 定義一個整型數據a,為它賦值1# 定義一個字符串數據b,為它賦值‘1’int a = 0;char a = '0';Lua示例:--定義 a 為數字0,b為字符串‘0’a = 0b = '0'

所以,我們給參數 b 傳進去的數值,是數字 0 呢,還是字符 ‘ 0 ’ ?一旦前面數據驗證沒把好關,在執行某個功能的時候,把字符 ‘ 0 ’ 給傳到這個函數裡。

地雷就被引爆。字符串 ‘ 0 ’ 不會等於數字 0,函數的終止條件判斷不通過。

所以程序進入遞歸模式,再次調用自己。在後續進行求餘預算的時候,Lua 的 “ 智慧 ” 又突然起到作用。Lua 一拍腦袋,咋會有人把字符 ‘ 0 ’ 拿來做計算啊,肯定是想把這個參數當數字用。

於是發生強制類型轉換。

所以咱們小學數學都會學到的…… 把 0 當除數的事情就發生。這要是古老的大哥 C 語言來幹這活,可能直接就給一個 Floating point exception 報錯。但是 Lua 不一樣,作為一個新時代的 “ 智慧 ” 的語言,它會優雅的返回一個 nan (Not A Numbewr)。

程序,繼續運行。更要命的是,nan 也不會等於0……程序的終止條件無法實現。這樣跑幾個循環之後,原本用來計算 a 和 b 的最大公約數的函數 _gcd(a,b) 就變成一個停不下來的函數 _gcd(nan,nan)。

在停不下來的路上根本停不下來,直接把 CPU 資源給吃滿。

太聰明也不是一件好事啊……

就這樣,被占滿的 CPU 一口氣把別的業務也帶崩。還得前面提到的在傢的 B 站程序員沒法在傢通過 VPN 來搶救網絡麼?沒錯,他們登錄內網的時候,其中有部分服務也需要通過內網來處理……

屬於是把鑰匙斷鎖眼裡,也是崩的理所當然。   崩完之後:  最後,如果差友們對相關技術細節更感興趣的話,世超建議你看看 B 站發佈的這篇2021.07.13 我們是這樣崩的除對事故的起承轉合,還對未來技術的更進與反思都做更加專業,全面的總結。

講道理,這樣的機會其實挺難得的。每年崩的應用何其多,但是願意發出來給同行學習,給普羅大眾看個樂子的寥寥無幾。

向上滑動 ▼

B 站這次願意分享,直面自己的 “ 傷疤 ” 。也讓我們看到互聯網運維上最真實的一面。這些經驗,可不會寫在任何教科書上。哦對,這篇文章發出來的晚上,B 站其實又偷偷小崩一次……

不知道是不是團隊好好總結去年經驗的緣故。這回還沒等大部分人反應過來……B 站已經把問題給解決。


相關推薦

2023-03-06

今晚8點半左右,B站突然出現大規模服務器崩潰,大量網友反饋無法正常刷新與播放視頻,將#B站#話題頂上熱搜。截止本文發稿,B站部分功能已經神速”恢復正常,但是仍然存在刷新、播放卡頓,容易出現報錯等一系列異常情況

2023-11-15

佈,ChatGPTPlus賬號暫停註冊,原因無他:訪問量激增超出服務器的承受能力。Altman在X上發文對此解釋道:由於OpenAI開發日後ChatGPT使用量的激增超出我們的承受能力,我們希望確保每個人都有良好的體驗。您仍然可以在app內註冊Ch

2022-07-24

崩潰。不知你是否還記得那一夜,B站“大樓停電”、“服務器爆炸”、“程序員刪庫跑路”的徹夜狂歡。(手動狗頭)時隔一年,背後“真兇”現在終於被阿B披露出來——沒想到吧,就是這麼簡單幾行代碼,直接幹趴B站兩三個

2023-11-10

方發佈多份文件實時跟蹤ChatGPT和API的網絡恢復情況。在去年ChatGPT剛發佈不久,也曾出現多次“嚴重宕機”,主要與平臺用戶量暴增有關。一位行業專傢此前曾對鈦媒體App表示,出現這種“宕機”現象,主要是算力不足、推理數

2023-04-25

場占比應該可以沖到35%,甚至更高。”沙利文報告顯示,去年中國國產操作系統行業裝機量達到401.2萬套,其中openEuler勢頭最猛,市場份額超過25%。但歐拉方面告訴雷峰網,具體數據應該遠超25%,估計能達到30%。因為統計過程中

2022-08-15

給你散華子,老板再沖過來點上。據 Stack Overflow 統計,去年美國 COBOL 程序員的平均工資漲 44%,達到年薪 76000 美元,雖然不算頂尖,但這漲幅實在誇張。可能年輕點的差友隻聽過 Java、Python,這 COBOL 語言是啥玩意,這麼火?說

2024-03-23

累積更新(2024-03)導致WindowsServer2012R2、2016、2019、2022域控服務器崩潰,該問題的根源在於Lsass.exe進程存在內存泄露問題,進而耗盡服務器上的物理內存和虛擬內存,導致系統出現計劃外的重啟。今天微軟發佈帶外更新 (OOB) 針對此

2023-01-10

的活。就像 2017 年,西南航空完成名為 Amadeus Altéa 客運服務系統的部署,結果就花費 5 億美元,相當於最近兩年的一整年花在資本支出( 包括技術上的投入 )的開銷。而且,即使 CEO 一狠心把這錢出,也沒法讓自己獲得

2022-06-29

瞭兩層身份認證。當你掃描二維碼的時候,相當於告訴瞭服務器:我是誰;而點擊確認之後,就是在和服務器確認,我真的是我。為瞭安全起見,這兩個步驟中任意一個拖太久瞭,系統就會判定你在騙它,讓二維碼失效,得重新

2023-03-03

據並進行分析。他發現的數據來自GunAuction.com網站,該網站自1998年以來允許人們將槍支放在網上進行拍賣。GunAuction.com的屏幕截圖TechCrunch分析被盜數據的樣本,並通過電子郵件聯系100人,通過電話聯系60人。其中,10人確認被盜

2024-04-08

周鴻禕免費課上,360集團創始人周鴻禕在談及雷軍造車時自曝“自己不會開車”。雷軍對臺下的聽課人表示:“在汽車方面我是絕對的小白,不像在座的人都是老司機,我到今天連駕照都沒有,連車都不會開。”周鴻禕認為,雷

2022-09-09

過聯運更多中大廠的優質新遊來獲得收入上的好轉。而 B 站自研以及獨占的遊戲,除要等版號外,還得取決於各工作室的研發進度。

2023-11-28

日早晨,滴滴官方稱經技術團隊連夜修復,滴滴網約車等服務已恢復,用戶可下載滴滴App使用打車服務。騎車等服務還在陸續修復中,所有可開鎖或未關鎖的青桔車輛均可免費騎行。不過,在滴滴發出公告的同時,《科創板日報

2023-11-29

當天23:19分緊急回應稱“由於系統故障,今天晚間滴滴App服務出現異常,經技術同學緊急修復,目前正陸續恢復11月28日早7點31分,滴滴出行官方微博再度致歉,並表示技術團隊已經連夜進行修復,滴滴的網約車服務已經恢復正常