
一個小小字符“0”,竟引得B站全面崩潰。
不知你是否還記得那一夜,B站“大樓停電”、“服務器爆炸”、“程序員刪庫跑路”的徹夜狂歡。(手動狗頭)
時隔一年,背后“真兇”現在終于被阿B披露出來——
(資料圖片)
沒想到吧,就是這么簡單幾行代碼,直接干趴B站兩三個小時,搞得B站程序員徹夜無眠頭發狂掉。
你可能會問,這不就是個普普通通用來求最大公約數的函數嗎,怎么就有如此大的威力?
背后一樁樁一件件,歸根結底其實就一句話:0,它真的不興除啊。
具體詳情,咱們還是一起來看看“事故報告”。
字符串“0”引發的“血案”
先來說道說道引發慘案的根本原因,也就是開頭貼出的這個gcd函數。
學過一點編程知識的小伙伴應該都知道,這是一種用輾轉相除法來計算最大公約數的遞歸函數。
跟我們手算最大公約數的方法不同,這個算法是醬嬸的:
舉個簡單的例子,a=24,b=18,求a和b的最大公約數;
a除以b,得到的余數是6,那么就讓a=18,b=6,然后接著往下算;
18除以6,這回余數是0,那么6也就是24和18的最大公約數了。
也就是說,a和b反復相除取余數,直到b=0,函數中:
if b==0 then return a end
這個判斷語句生效,結果就算出來了。
基于這樣的數學原理,我們再來看這段代碼,似乎沒什么問題:
但如果輸入的b是個字符串“0”呢?
B站的技術解析文章中提到,這段出事的代碼是用Lua寫的。Lua具有這么幾個特點:
這是一種動態類型語言,常用習慣里變量不需要定義類型,直接給變量賦值就行。
Lua在對一個數字字符串進行算術操作時,會嘗試將這個數字字符串轉成一個數字。
在Lua語言中,數學運算n%0的結果是nan(Not A Number)。
我們來模擬一下這個過程:
1、當b是一個字符串“0”時,由于這個gcd函數沒有對其進行類型校驗,因此在碰上判定語句時,“0”不等于0,代碼中“return _gcd(b, a%b)”觸發,返回_gcd(“0”, nan)。
2、_gcd(“0”, nan)再次被執行,于是返回值變成了_gcd(nan, nan)。
這下就完犢子了,判定語句中b=0的條件永遠沒法達到,于是,死循環出現了。
也就是說,這個程序開始瘋狂地原地轉圈,并且為了一個永遠得不到的結果,把CPU占了個100%,別的用戶請求自然就處理不了了。
那么問題來了,這個“0”它到底是怎么進去的呢?
官方說法是:
在某種發布模式中,應用的實例權重會短暫地調整為0,此時注冊中心返回給SLB(負載均衡)的權重是字符串類型的“0”。此發布環境只有生產環境會用到,同時使用的頻率極低,在SLB前期灰度過程中未觸發此問題。
SLB在balance_by_lua階段,會將共享內存中保存的服務IP、Port、Weight作為參數傳給lua-resty-balancer模塊用于選擇upstream server,在節點weight=“0”時,balancer模塊中的_gcd函數收到的入參b可能為“0”。
bug是如何定位的
以“事后諸葛亮”的視角來看,這個引發B站全面崩潰的根本原因多少有點讓人直呼“就這”。
但從當事程序員的視角來看,事情確實沒有辣么簡單。
當天晚上22:52分——大部分程序員才剛下班或者還沒下班的節骨眼(doge),B站運維收到服務不可用的報警,第一時間懷疑機房、網絡、四層LB、七層SLB等基礎設施出現問題。
然后立馬和相關技術人員拉了個緊急語音會議開始處理。
5分鐘后,運維發現承載全部在線業務的主機房七層SLB的CPU占用率達到了100%,無法處理用戶請求,排除其他設施后,鎖定故障為該層。
(七層SLB是指基于URL等應用層信息的負載均衡。負載均衡通過算法把客戶請求分配到服務器集群,從而減少服務器壓力。)
萬般緊急之時,小插曲還現了:遠程在家的程序員登上VPN卻沒法進入內網,只好又去call了一遍內網負責人,走了個綠色通道才全部上線(因為其中一個域名是由故障的SLB代理的)。
此時已經過去了25分鐘,搶修正式開始。
首先,運維先熱重啟了一遍SLB,未恢復;然后嘗試拒絕用戶流量冷重啟SLB,CPU依然100%,還是未恢復。
接著,運維發現多活機房SLB請求大量超時,但CPU未過載,正準備重啟多活機房SLB時,內部群反應主站服務已恢復,視頻播放、推薦、評論、動態等功能已基本正常。
此時是23點23分,距離事故發生31分鐘。
值得一提的是,這些功能恢復其實是事發之時被網友們吐槽的“高可用容災架構”發揮了作用。
至于這道防線為啥一開始沒發揮作用,里頭可能還有你我一點鍋。
簡單來說,就是大家伙點不開B站就開始瘋狂刷新,CDN流量回源重試 + 用戶重試,直接讓B站流量突增4倍以上,連接數突增100倍到千萬級別,多活SLB就給整過載了。
不過,并不是所有服務都搞了多活架構,至此事情并沒完全解決。
接下來的半個小時里,大家做了很多操作,回滾了最近兩周左右上線的Lua代碼,都沒把剩余的服務恢復。
時間來到了12點,沒有辦法了,“先不管bug是怎么出來的,把服務全恢復了再說”。
簡單+粗暴:運維直接耗時一小時重建了一組全新的SLB集群。
凌晨1點,新集群終于建好:
一邊,有人負責陸續將直播、電商、漫畫、支付等核心業務流量切換到新集群,恢復全部服務(凌晨1點50分全部搞定,暫時結束了崩了逼近3個小時的事故);
另一邊,繼續分析bug原因。
在他們用分析工具跑出一份詳細的火焰圖數據后,那個搞事的“0”才終于露出了一點端倪:
CPU熱點明顯集中在一個對lua-resty-balancer模塊的調用中。而該模塊的_gcd函數在某次執行后返回了一個預期外的值:NaN。
同時,他們也發現了觸發誘因的條件:某個容器IP的weight=0。
他們懷疑是該函數觸發了jit編譯器的某個bug,運行出錯陷入死循環導致SLB CPU 100%。
于是就全局關閉了jit編譯,暫時規避了風險。一切都解決完后,已經快4點,大家終于暫時睡了個好覺。
第二天大家也沒閑著,馬不停蹄地在線下環境復現了bug后,發現并不是jit編譯器的問題,而是服務的某種特殊發布模式會出現容器實例權重為0的情況,而這個0是個字符串形式。
正如前面所說,這個字符串“0”在動態語言Lua中的算術操作中,被轉成了數字,走到了不該走的分支,造成了死循環,引發了b站此次前所未見的大崩潰事件。
遞歸的鍋還是弱類型語言的鍋?
不少網友都還對這次事故記憶猶新,有回想起自己就是以為手機不行換電腦也不行的,也有人還記得當時5分鐘后此事就上了熱搜。
大家都很詫異,就這么一個簡單的死循環就能造成如此大的網站崩服。
不過,有人指出,死循環不罕見,罕見的是在SLB層、在分發過程出問題,它還不像在后臺出問題很快能重啟解決。
為了避免這種情況發生, 有人認為要慎用遞歸,硬要用還是設置一個計數器,達到一個業務不太可能達到的值后直接return掉。
還有人認為這不怪遞歸,主要還是弱類型語言的鍋。
以此還導致了“詭計多端的‘0’”這一打趣的說法。
另外,由于事故實在是耽誤了太久、太多事兒,當時B站給所有用戶補了一天大會員。
有人就在此算了一筆賬,稱就是這7行代碼,讓b站老板一下虧了大約1,5750,0000元。(手動狗頭)
對于這個bug,你有什么想吐槽的?
參考鏈接:
[1]《2021.07.13 我們是這樣崩的》by 嗶哩嗶哩技術
https://mp.weixin.qq.com/s/nGtC5lBX_Iaj57HIdXq3Qg
關鍵詞: 7行代碼讓B站崩潰3小時 竟因一個詭計多
網站首頁 |網站簡介 | 關于我們 | 廣告業務 | 投稿信箱
Copyright © 2000-2020 www.yjkq2010.com All Rights Reserved.
中國網絡消費網 版權所有 未經書面授權 不得復制或建立鏡像
聯系郵箱:920 891 263@qq.com
欧美色综合网_狠狠色狠色综合曰曰_麻豆精品一区二区av白丝在线_久久精品综合一区 国内精品嫩模私拍在线| 精品久久久久一区| 欧美亚洲国产bt| 国产精品视频在线看| 韩国av一区二区三区在线观看| 这里只有精品视频在线观看| 首页综合国产亚洲丝袜| 在线观看一区二区精品视频| 亚洲一区中文在线| 欧美日韩亚洲综合在线| 日韩**一区毛片| 精品国偷自产国产一区| 国产精品影音先锋| 国产精品另类一区| 91在线无精精品入口| 亚洲一区二区综合| 日韩一区二区三区视频在线| 国产一区免费电影| 亚洲精品免费视频| 欧美一级黄色片| 高清国产一区二区| 天堂资源在线中文精品| 久久久久久久久久电影| 91在线免费看| 另类中文字幕网| 国产精品进线69影院| 欧美精品v日韩精品v韩国精品v| 国产在线视频精品一区| 亚洲精选一二三| 26uuu国产电影一区二区| 色视频欧美一区二区三区| 美女免费视频一区二区| 国产精品久久国产精麻豆99网站| 欧美久久一二区| www.激情成人| 精品在线免费观看| 亚洲欧美日韩一区二区| 久久综合精品国产一区二区三区| 91麻豆免费看片| 国产精品白丝jk白祙喷水网站| 亚洲美女免费视频| 国产午夜精品一区二区三区视频| 欧美性生活一区| 99久久国产综合精品麻豆| 国产综合久久久久久鬼色| 亚洲最新视频在线播放| 国产精品视频一二| 精品国产一区二区三区久久影院 | 精品国产第一区二区三区观看体验| 色综合久久中文字幕综合网| 国产精品一区二区三区四区| 秋霞av亚洲一区二区三| 一区二区三区久久| 最新不卡av在线| 久久九九99视频| 欧美mv和日韩mv国产网站| 宅男噜噜噜66一区二区66| 在线视频欧美区| 91福利资源站| 欧洲av一区二区嗯嗯嗯啊| av在线不卡电影| 成人app网站| 成人永久aaa| 成人午夜在线免费| 成年人国产精品| 成人动漫一区二区| 99国产精品99久久久久久| av中文字幕不卡| 97国产一区二区| 欧美性xxxxxxxx| 欧美日韩电影一区| 91精品国产综合久久久久久漫画| 制服丝袜亚洲色图| 日韩欧美资源站| 2020日本不卡一区二区视频| 精品999久久久| 欧美精品一区视频| 精品黑人一区二区三区久久| 久久久亚洲精品一区二区三区| 久久伊99综合婷婷久久伊| 欧美国产一区在线| 亚洲综合久久av| 日韩精彩视频在线观看| 免费观看在线综合| 黄色日韩三级电影| 日韩在线一区二区三区| 捆绑紧缚一区二区三区视频| 成人高清免费观看| 欧美日韩亚洲国产综合| 精品国产百合女同互慰| 国产精品久久久久久亚洲伦| 亚洲一区二区三区视频在线播放| 男女性色大片免费观看一区二区 | 亚洲第一福利视频在线| 蜜桃av噜噜一区| 不卡在线视频中文字幕| 欧美日韩一区二区在线视频| 精品国产91九色蝌蚪| 亚洲日本在线a| 麻豆精品一区二区av白丝在线| 国产盗摄一区二区三区| 欧美日韩中字一区| 国产人成亚洲第一网站在线播放| 亚洲综合色噜噜狠狠| 国产激情偷乱视频一区二区三区| 欧美丝袜第三区| 久久九九久久九九| 日本va欧美va欧美va精品| 成人高清伦理免费影院在线观看| 欧美一级淫片007| 亚洲黄一区二区三区| 国产成人精品亚洲777人妖| 亚洲成人av一区| 亚洲高清一区二区三区| 天堂影院一区二区| 国产成人精品免费看| 欧美三电影在线| 久久久久久久一区| 午夜影院久久久| 99在线精品免费| www激情久久| 日日欢夜夜爽一区| 99国产精品久| 亚洲国产成人私人影院tom| 美女尤物国产一区| 精品视频在线免费看| 亚洲视频一区二区在线| 国产精品99久久久| 精品国产乱码久久久久久影片| 亚洲成av人片在线观看无码| 91丨九色丨尤物| 国产精品久久久久精k8| 国产麻豆精品theporn| 日韩一区二区三区高清免费看看| 亚洲午夜免费电影| 欧美亚州韩日在线看免费版国语版| 自拍偷拍亚洲激情| 99v久久综合狠狠综合久久| 中文字幕在线一区免费| 波多野结衣一区二区三区| 国产亚洲精品aa| 国产 日韩 欧美大片| 国产精品色在线| 99精品欧美一区| 亚洲已满18点击进入久久| 欧美日韩国产乱码电影| 五月婷婷久久综合| 欧美一级精品大片| 国产一区二区久久| 国产欧美一二三区| 99精品视频在线播放观看| 亚洲品质自拍视频网站| 欧美在线观看一区二区| 天堂va蜜桃一区二区三区漫画版| 欧美日韩国产天堂| 精品无人区卡一卡二卡三乱码免费卡| 日韩欧美精品三级| 国产一区在线看| 国产精品免费网站在线观看| 99久久久无码国产精品| 亚洲一区二区综合| 精品国产网站在线观看| 成人激情午夜影院| 亚洲一区二区三区不卡国产欧美| 欧美日韩一二三区| 国产美女精品在线| 亚洲人精品一区| 91精品国产高清一区二区三区 | 亚洲午夜在线观看视频在线| 欧美一二区视频| 暴力调教一区二区三区| 亚洲高清不卡在线观看| 久久这里只有精品视频网| 99久久er热在这里只有精品15| 亚洲国产综合视频在线观看| 精品精品欲导航| 一本久久综合亚洲鲁鲁五月天| 日韩激情视频在线观看| 国产精品嫩草影院av蜜臀| 91精品国产色综合久久ai换脸| 国产麻豆精品95视频| 偷拍与自拍一区| 亚洲一区二区视频| 久久人人爽人人爽| 欧美日韩电影一区| 99国产欧美久久久精品| 久久电影网站中文字幕| 亚洲免费观看在线视频| 久久精品欧美一区二区三区麻豆 | 欧美老年两性高潮| 福利一区二区在线| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产美女精品人人做人人爽| 午夜精品福利在线| 亚洲精品视频一区二区| 欧美韩国日本一区| 久久精品一区蜜桃臀影院| 欧美一区二区三区视频免费| 欧美色综合久久| 日本道免费精品一区二区三区|