<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

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

    VSole2022-07-19 22:55:16

    后來呢,隨著 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 站已經把問題給解決了。

    服務器類型電腦服務器
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    nmap -PN -sS -sV --script=vulscan –script-args vulscancorrelation=1 -p80 target. nmap -PN -sS -sV --script=all –script-args vulscancorrelation=1 target. NetCat,它的實際可運行的名字叫nc,應該早很就被提供,就象另一個沒有公開但是標準的Unix工具。
    遠程桌面對了解內網滲透的人來說可能再熟悉不過了。在滲透測試中,拿下一臺主機后有時候會選擇開 3389 進遠程桌面查看一下對方主機內有無一些有價值的東西可以利用。但是遠程桌面的利用不僅如此,本節我們便來初步匯總一下遠程桌面在內網滲透中的各種利用姿勢。
    移動設備的安全性通常高于電腦的安全性,但很多用戶仍然可能被迷惑,智能手機仍然可能被黑客入侵。人們需要注意安全使用手機的一些事項。
    別急,今天這篇文章就帶你從寫第一行代碼開始,一步步教你把程序放到 K8s 跑起來。這次咱們先用 Go 做個例子,后面再寫一篇怎么把 Spring Boot 應用放到 K8s 上運行。K8s 本機環境安裝在個人電腦上安裝 K8s 可選的軟件,主要有這么幾種:minikube。Docker 桌面應用自帶的 K8s 集群。
    在滲透測試的過程中,我們可以通過常見的漏洞來獲取shell,我們獲取到的shell通常是各個公司對外開放的網站以及APP應用等屬于外網(可以通過計算機直接訪問),如果我們想要獲取該公司內部的一些內部信息就要進入該公司的內部網絡(內網)本文將會對內網進行簡單介紹并且搭建一個簡單地內部網絡環境,來熟悉了解什么是內網。
    100 個網絡基礎知識普及,看完成半個網絡高手!
    100 個網絡基礎知識普及,看完成半個網絡高手!
    可能涉及的部件市電環境;電源、主板、CPU、內存、顯示卡、其它可能的板卡;BIOS中的設置;開關及開關線、復位按鈕及復位線本身的故障。啟動與關閉類故障定義舉例與啟動、關閉過程有關的故障。顯示的內容的觀察:要注意屏幕報錯的內容、死機的位置,以確定故障可能發生的部位。以下檢查應在軟件最小系統下進行。
    可能涉及的部件市電環境;電源、主板、CPU、內存、顯示卡、其它可能的板卡;BIOS中的設置;開關及開關線、復位按鈕及復位線本身的故障。2) 萬用表; 3) 試電筆; 4) CPU負載。啟動與關閉類故障定義舉例與啟動、關閉過程有關的故障。4) 顯示的內容的觀察:要注意屏幕報錯的內容、死機的位置,以確定故障可能發生的部位。以下檢查應在軟件最小系統下進行。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类