91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

字符串“0”引發(fā)的“血案”

算法與數(shù)據(jù)結(jié)構 ? 來源:AI新媒體量子位 ? 作者:AI新媒體量子位 ? 2022-08-03 11:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一個小小字符“0”,竟引得B站全面崩潰。

不知你是否還記得那一夜,B站“大樓停電”、“服務器爆炸”、“程序員刪庫跑路”的徹夜狂歡。(手動狗頭)

時隔一年,背后“真兇”現(xiàn)在終于被阿B披露出來——

376e1b9e-12db-11ed-ba43-dac502259ad0.png

沒想到吧,就是這么簡單幾行代碼,直接干趴B站兩三個小時,搞得B站程序員徹夜無眠頭發(fā)狂掉

你可能會問,這不就是個普普通通用來求最大公約數(shù)的函數(shù)嗎,怎么就有如此大的威力?

背后一樁樁一件件,歸根結(jié)底其實就一句話:0,它真的不興除啊。

具體詳情,咱們還是一起來看看“事故報告”。

字符串“0”引發(fā)的“血案”

先來說道說道引發(fā)慘案的根本原因,也就是開頭貼出的這個gcd函數(shù)

學過一點編程知識的小伙伴應該都知道,這是一種用輾轉(zhuǎn)相除法來計算最大公約數(shù)的遞歸函數(shù)

跟我們手算最大公約數(shù)的方法不同,這個算法是醬嬸的:

舉個簡單的例子,a=24,b=18,求a和b的最大公約數(shù);

a除以b,得到的余數(shù)是6,那么就讓a=18,b=6,然后接著往下算;

18除以6,這回余數(shù)是0,那么6也就是24和18的最大公約數(shù)了。

也就是說,a和b反復相除取余數(shù),直到b=0,函數(shù)中:

if b==0 then return a end

這個判斷語句生效,結(jié)果就算出來了。

基于這樣的數(shù)學原理,我們再來看這段代碼,似乎沒什么問題:

376e1b9e-12db-11ed-ba43-dac502259ad0.png

但如果輸入的b是個字符串“0”呢?

B站的技術解析文章中提到,這段出事的代碼是用Lua寫的。Lua具有這么幾個特點:

  • 這是一種動態(tài)類型語言,常用習慣里變量不需要定義類型,直接給變量賦值就行。

  • Lua在對一個數(shù)字字符串進行算術操作時,會嘗試將這個數(shù)字字符串轉(zhuǎn)成一個數(shù)字。

  • 在Lua語言中,數(shù)學運算n%0的結(jié)果是nan(Not A Number)

我們來模擬一下這個過程:

1、當b是一個字符串“0”時,由于這個gcd函數(shù)沒有對其進行類型校驗,因此在碰上判定語句時,“0”不等于0,代碼中“return _gcd(b, a%b)”觸發(fā),返回_gcd(“0”, nan)。

2、_gcd(“0”, nan)再次被執(zhí)行,于是返回值變成了_gcd(nan, nan)。

這下就完犢子了,判定語句中b=0的條件永遠沒法達到,于是,死循環(huán)出現(xiàn)了。

也就是說,這個程序開始瘋狂地原地轉(zhuǎn)圈,并且為了一個永遠得不到的結(jié)果,把CPU占了個100%,別的用戶請求自然就處理不了了。

那么問題來了,這個“0”它到底是怎么進去的呢?

官方說法是:

在某種發(fā)布模式中,應用的實例權重會短暫地調(diào)整為0,此時注冊中心返回給SLB(負載均衡)的權重是字符串類型的“0”。此發(fā)布環(huán)境只有生產(chǎn)環(huán)境會用到,同時使用的頻率極低,在SLB前期灰度過程中未觸發(fā)此問題。

SLB在balance_by_lua階段,會將共享內(nèi)存中保存的服務IP、Port、Weight作為參數(shù)傳給lua-resty-balancer模塊用于選擇upstream server,在節(jié)點weight=“0”時,balancer模塊中的_gcd函數(shù)收到的入?yún)可能為“0”。

bug是如何定位的

以“事后諸葛亮”的視角來看,這個引發(fā)B站全面崩潰的根本原因多少有點讓人直呼“就這”。

但從當事程序員的視角來看,事情確實沒有辣么簡單。

當天晚上22:52分——大部分程序員才剛下班或者還沒下班的節(jié)骨眼(doge),B站運維收到服務不可用的報警,第一時間懷疑機房、網(wǎng)絡、四層LB、七層SLB等基礎設施出現(xiàn)問題。

然后立馬和相關技術人員拉了個緊急語音會議開始處理。

5分鐘后,運維發(fā)現(xiàn)承載全部在線業(yè)務的主機房七層SLB的CPU占用率達到了100%,無法處理用戶請求,排除其他設施后,鎖定故障為該層。

(七層SLB是指基于URL等應用層信息的負載均衡。負載均衡通過算法把客戶請求分配到服務器集群,從而減少服務器壓力。)

萬般緊急之時,小插曲還現(xiàn)了:遠程在家的程序員登上VPN卻沒法進入內(nèi)網(wǎng),只好又去call了一遍內(nèi)網(wǎng)負責人,走了個綠色通道才全部上線(因為其中一個域名是由故障的SLB代理的)

37980cb0-12db-11ed-ba43-dac502259ad0.png

此時已經(jīng)過去了25分鐘,搶修正式開始。

首先,運維先熱重啟了一遍SLB,未恢復;然后嘗試拒絕用戶流量冷重啟SLB,CPU依然100%,還是未恢復。

接著,運維發(fā)現(xiàn)多活機房SLB請求大量超時,但CPU未過載,正準備重啟多活機房SLB時,內(nèi)部群反應主站服務已恢復,視頻播放、推薦、評論、動態(tài)等功能已基本正常。

此時是23點23分,距離事故發(fā)生31分鐘

值得一提的是,這些功能恢復其實是事發(fā)之時被網(wǎng)友們吐槽的“高可用容災架構”發(fā)揮了作用。

37a6903c-12db-11ed-ba43-dac502259ad0.png

至于這道防線為啥一開始沒發(fā)揮作用,里頭可能還有你我一點鍋。

簡單來說,就是大家伙點不開B站就開始瘋狂刷新,CDN流量回源重試 + 用戶重試,直接讓B站流量突增4倍以上,連接數(shù)突增100倍到千萬級別,多活SLB就給整過載了。

不過,并不是所有服務都搞了多活架構,至此事情并沒完全解決。

接下來的半個小時里,大家做了很多操作,回滾了最近兩周左右上線的Lua代碼,都沒把剩余的服務恢復。

時間來到了12點,沒有辦法了,“先不管bug是怎么出來的,把服務全恢復了再說”。

簡單+粗暴:運維直接耗時一小時重建了一組全新的SLB集群

凌晨1點,新集群終于建好:

一邊,有人負責陸續(xù)將直播、電商、漫畫、支付等核心業(yè)務流量切換到新集群,恢復全部服務(凌晨1點50分全部搞定,暫時結(jié)束了崩了逼近3個小時的事故)

另一邊,繼續(xù)分析bug原因。

在他們用分析工具跑出一份詳細的火焰圖數(shù)據(jù)后,那個搞事的“0”才終于露出了一點端倪:

CPU熱點明顯集中在一個對lua-resty-balancer模塊的調(diào)用中。而該模塊的_gcd函數(shù)在某次執(zhí)行后返回了一個預期外的值:NaN。

同時,他們也發(fā)現(xiàn)了觸發(fā)誘因的條件:某個容器IP的weight=0。

他們懷疑是該函數(shù)觸發(fā)了jit編譯器的某個bug,運行出錯陷入死循環(huán)導致SLB CPU 100%。

于是就全局關閉了jit編譯,暫時規(guī)避了風險。一切都解決完后,已經(jīng)快4點,大家終于暫時睡了個好覺。

第二天大家也沒閑著,馬不停蹄地在線下環(huán)境復現(xiàn)了bug后,發(fā)現(xiàn)并不是jit編譯器的問題,而是服務的某種特殊發(fā)布模式會出現(xiàn)容器實例權重為0的情況,而這個0是個字符串形式。

正如前面所說,這個字符串“0”在動態(tài)語言Lua中的算術操作中,被轉(zhuǎn)成了數(shù)字,走到了不該走的分支,造成了死循環(huán),引發(fā)了b站此次前所未見的大崩潰事件。

遞歸的鍋還是弱類型語言的鍋?

不少網(wǎng)友都還對這次事故記憶猶新,有回想起自己就是以為手機不行換電腦也不行的,也有人還記得當時5分鐘后此事就上了熱搜。

大家都很詫異,就這么一個簡單的死循環(huán)就能造成如此大的網(wǎng)站崩服。

不過,有人指出,死循環(huán)不罕見,罕見的是在SLB層、在分發(fā)過程出問題,它還不像在后臺出問題很快能重啟解決。

37b0daa6-12db-11ed-ba43-dac502259ad0.png

為了避免這種情況發(fā)生, 有人認為要慎用遞歸,硬要用還是設置一個計數(shù)器,達到一個業(yè)務不太可能達到的值后直接return掉。

還有人認為這不怪遞歸,主要還是弱類型語言的鍋。

以此還導致了“詭計多端的‘0’”這一打趣的說法。

37bc89e6-12db-11ed-ba43-dac502259ad0.png

另外,由于事故實在是耽誤了太久、太多事兒,當時B站給所有用戶補了一天大會員。

有人就在此算了一筆賬,稱就是這7行代碼,讓b站老板一下虧了大約1,5750,0000元。(手動狗頭)

37caf58a-12db-11ed-ba43-dac502259ad0.png

對于這個bug,你有什么想吐槽的?

參考鏈接:

[1]《2021.07.13 我們是這樣崩的》by 嗶哩嗶哩技術
https://mp.weixin.qq.com/s/nGtC5lBX_Iaj57HIdXq3Q

審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 字符串
    +關注

    關注

    1

    文章

    590

    瀏覽量

    22301
  • 函數(shù)
    +關注

    關注

    3

    文章

    4381

    瀏覽量

    64921
  • 代碼
    +關注

    關注

    30

    文章

    4900

    瀏覽量

    70768

原文標題:7行代碼讓B站崩潰3小時

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數(shù)據(jù)結(jié)構】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    harmony-utils之StrUtil,字符串工具類

    harmony-utils之StrUtil,字符串工具類 harmony-utils 簡介與說明 [harmony-utils] 一款功能豐富且極易上手的HarmonyOS工具庫,借助眾多實用工具類
    的頭像 發(fā)表于 07-03 11:32 ?100次閱讀

    字符串在數(shù)據(jù)庫中的存儲方式

    數(shù)據(jù)庫是現(xiàn)代信息技術中存儲和管理數(shù)據(jù)的核心組件。字符串作為最常見的數(shù)據(jù)類型之一,在數(shù)據(jù)庫中的存儲方式對其性能和可擴展性有著重要影響。 數(shù)據(jù)類型 固定長度字符串 :如CHAR類型,它為每個字符串分配
    的頭像 發(fā)表于 01-07 15:41 ?829次閱讀

    字符串在編程中的應用實例

    字符串在編程中有著廣泛的應用,它們被用于表示文本數(shù)據(jù)、處理用戶輸入、構建動態(tài)內(nèi)容等。以下是一些字符串在編程中的應用實例: 1. 用戶輸入與輸出 用戶輸入 :程序通常需要從用戶那里獲取輸入,這些輸入通
    的頭像 發(fā)表于 01-07 15:33 ?717次閱讀

    字符串字符數(shù)組的區(qū)別

    在編程語言中,字符串字符數(shù)組是兩種基本的數(shù)據(jù)結(jié)構,它們都用于存儲和處理文本數(shù)據(jù)。盡管它們在功能上有一定的重疊,但在內(nèi)部表示、操作方式和使用場景上存在顯著差異。 1. 內(nèi)部表示 字符串 字符串
    的頭像 發(fā)表于 01-07 15:29 ?1145次閱讀

    字符串反轉(zhuǎn)的實現(xiàn)方式

    在編程中,字符串反轉(zhuǎn)是一個基礎而重要的操作,它涉及到將一個字符串中的字符順序顛倒過來。這個操作在多種編程語言中都有不同的實現(xiàn)方式,本文將探討幾種常見的字符串反轉(zhuǎn)方法。 1. 遞歸方法
    的頭像 發(fā)表于 01-07 15:27 ?820次閱讀

    字符串處理方法 字符串轉(zhuǎn)數(shù)字的實現(xiàn)

    在編程中,將字符串轉(zhuǎn)換為數(shù)字是一個常見的需求。不同的編程語言有不同的方法來實現(xiàn)這一功能。以下是一些常見編程語言中的字符串轉(zhuǎn)數(shù)字的實現(xiàn)方法: Python 在Python中,可以使用內(nèi)置的 int
    的頭像 發(fā)表于 01-07 15:26 ?937次閱讀

    字符串處理:4G模組軟件指南精要!

    最近一直有朋友咨詢我關于4G模組的字符串處理,今天我便把相關指南展示給大家。
    的頭像 發(fā)表于 11-17 09:57 ?531次閱讀
    <b class='flag-5'>字符串</b>處理:4G模組軟件指南精要!

    base64字符串轉(zhuǎn)換為二進制文件

    Base64是一種編碼方法,用于將二進制數(shù)據(jù)轉(zhuǎn)換為ASCII字符串。這種編碼通常用于在不支持二進制數(shù)據(jù)的系統(tǒng)中傳輸數(shù)據(jù),例如電子郵件或網(wǎng)頁。將Base64字符串轉(zhuǎn)換為二進制文件的過程相對簡單,但需要
    的頭像 發(fā)表于 11-10 10:55 ?2844次閱讀

    MATLAB(5)--字符串處理

    :兩個字符串里的每個字符依次按ASCII值大小逐個進行比較,比較的結(jié)果是一個數(shù)值向量,向量中的元素為1或者0字符串比較函數(shù)用于判斷字符串
    發(fā)表于 09-06 10:22

    labview字符串數(shù)組轉(zhuǎn)化為數(shù)值數(shù)組

    在LabVIEW中,將字符串數(shù)組轉(zhuǎn)換為數(shù)值數(shù)組是一項常見的任務,尤其是在處理數(shù)據(jù)采集、信號處理或用戶輸入時。 1. 理解LabVIEW的數(shù)據(jù)類型 在開始之前,了解LabVIEW中的數(shù)據(jù)類型是非
    的頭像 發(fā)表于 09-04 17:47 ?5688次閱讀

    labview字符串如何轉(zhuǎn)換為16進制字符串

    在LabVIEW中,將字符串轉(zhuǎn)換為16進制字符串是一個常見的需求,尤其是在處理數(shù)據(jù)通信和硬件接口時。LabVIEW提供了多種方法來實現(xiàn)這一轉(zhuǎn)換,包括使用內(nèi)置函數(shù)、編寫VI(Virtual
    的頭像 發(fā)表于 09-04 15:54 ?5343次閱讀

    labview中如何實現(xiàn)字符串換行

    1. 字符串換行的基本概念 在LabVIEW中,字符串換行通常指的是在字符串中插入換行符,使得字符串在顯示或輸出時能夠自動換行。這在創(chuàng)建用戶界面或處理文本數(shù)據(jù)時非常有用。 2.
    的頭像 發(fā)表于 09-04 15:47 ?3927次閱讀

    labview中如何實現(xiàn)字符串選擇輸出

    在LabVIEW中實現(xiàn)字符串選擇輸出是一項常見的任務,它涉及到字符串處理、條件判斷和用戶界面設計等多個方面。由于LabVIEW是一種圖形化編程語言,其編程方式與傳統(tǒng)的文本編程語言有所不同,因此實現(xiàn)
    的頭像 發(fā)表于 09-04 15:44 ?2214次閱讀

    labview中常用的字符串函數(shù)有哪些?

    在LabVIEW中,常用的字符串函數(shù)廣泛覆蓋了對字符串的各種操作,包括但不限于格式化、搜索、替換、連接、計算長度等。以下是一些常用的字符串函數(shù)及其簡要說明: 字符串長度(String
    的頭像 發(fā)表于 09-04 15:43 ?1856次閱讀

    labview字符串的四種表示各有什么特點

    。在LabVIEW中,字符串是一種基本的數(shù)據(jù)類型,用于表示文本信息。字符串在LabVIEW中有多種表示方式,每種方式都有其特定的應用場景和特點。以下是對LabVIEW中四種字符串表示方式的分析: 1.
    的頭像 發(fā)表于 09-04 15:40 ?1428次閱讀
    主站蜘蛛池模板: 岛国毛片一级一级特级毛片 | 国产精品视频久久久久久 | 香蕉爱爱视频 | 一级a爰片久久毛片 | 国内啪啪 | 色综合色狠狠天天综合色hd | 男人cao女人视频在线观看 | 日韩特黄 | 美女视频很黄很暴黄是免费的 | 免费看一级黄色录像 | 六月丁香激情综合成人 | 台湾黄色毛片 | 亚洲zscs综合网站 | 91成人免费视频 | 激情久久久久久久久久久 | 国产精品14p | 在线亚洲精品 | 欧美簧片 | 天堂视频在线观看 | 欧美人与z0xxxx另类 | 热99re久久精品2久久久 | 美女拍拍拍爽爽爽爽爽爽 | 免费一级毛片私人影院a行 免费一级毛片无毒不卡 | 国产又色 | 天天看天天爽天天摸天天添 | 狠狠亚洲狠狠欧洲2019 | 天天爽天天狼久久久综合 | 黄色成人毛片 | 黄色的视频网站在线观看 | 美女扒开腿让男生桶爽网站 | 一色屋成人免费精品网站 | 网全大全黄 | 天天色综合三 | 天堂在线网 | 色综合久久综合欧美综合图片 | 狠狠色噜噜噜噜狠狠狠狠狠狠奇米 | 久久性久久性久久久爽 | 天天干天天拍天天射天天添天天爱 | 理论片午夜 | 夜夜夜精品视频免费 | 午夜三级网|