A. 我服了,B站果然是一個成人學習網站
B站,這座知識的海洋,果然不簡單,它以其獨特的魅力,將成人學習的邊界拓展到了意想不到的領域。我,機哥,常被發布會的精彩所吸引,而B站似乎洞察了我的興趣,竟在首頁推送了蘋果和Windows11的發布會內容,讓人意外又驚喜。
畫面中,一個靈動的孩子,以其標準的全英文發音,解讀著新品發布會的精彩瞬間。他不僅對數碼新品如數家珍,更對編程世界有所涉獵。這位8歲的小朋友,竟然錄制教學視頻,從基礎的txt文檔開始,一步步講解代碼,帶領我們理解搭建網站的奧秘。他的課堂並不復雜,卻能讓人感到驚奇,一個小小年紀的孩子,竟然能有如此的教學熱情和才華。
在B站的知識區,諸如「小學生教你學編程」這樣的系列視頻,播放量破百萬,顯示出成千上萬的學習者在其中。這些年輕的「老師」,如6歲的小up主,用Swift Playgrounds這款編程工具,教授While循環,讓老程序員們在評論區里驚嘆不已。他們用寓教於樂的方式,將枯燥的知識轉化為生動的課堂,讓人感嘆知識的傳承無界限。
不僅僅是編程,數學、物理、歷史等傳統學科,也都有小朋友的身影。12歲的小女孩講解定積分,初中的小同學講解歷史,他們用稚嫩的聲音,傳遞出深厚的知識。盡管偶爾會有小錯誤,但那份真摯和熱情,讓人感受到教育的魅力所在。
在知識區,車迷劉同學以其對汽車的熱愛和專業講解,吸引了大批粉絲,被親切地稱為「劉教授」。他的課堂生動有趣,彷彿讓人穿越回大學課堂,體驗知識的力量。他的成功,提醒我們,年齡不是學習的障礙,分享和熱愛才是真正的驅動力。
然而,質疑的聲音也隨之而來。小朋友們真的能理解這些深奧的知識嗎?答案在於,他們通過「費曼學習法」,將知識轉化為自己的理解,這種學習方式本身就是一種成長。他們的分享,不僅激發了我們的學習熱情,也提醒我們,無論年齡大小,只要有熱愛,就能成為他人的老師。
機哥深感,B站的知識區正在經歷一場革新,每個人都有可能成為知識的傳播者。無論出於興趣還是交流,小朋友們的視頻都讓我們受益匪淺。如果你也想分享你的知識,現在正是時候,就像我的好友陸師傅那樣,他的【果味挖掘機】系列視頻,等待著你的探索。
觀看這些視頻,我不僅收獲了對蘋果產品的新見解,更對學習有了新的認識。在B站,我們都能找到屬於自己的學習舞台,一起開啟知識的探索之旅吧。
B. win7系統奔潰
win7系統奔潰
(win7系統崩潰怎麼辦?
魚羊 豐色 發自 凹非寺
量子位 | 公眾號 QbitAI
一個小字元0實際上導致了B站的全面崩潰。
我不知道你是否還記得那天晚上,B站在大樓停電、伺服器爆炸、程序員刪跑路的徹夜狂歡。(手動狗頭)
時隔一年,背後的真凶終於被阿B披露了——
沒想到,就是這么簡單的幾行代碼,直接幹了B站兩三個小時,讓B站程序員徹夜無眠,頭發瘋了。
你可能會問,這不是一個普通的函數來尋求最大的公約數嗎?為什麼它如此強大?
歸根結底,背後的一個接一個,其實是一句話:0,它真的不興除啊。
讓我們來看看事故報告。
字元串「0」引發的「血案」先說說悲劇的根本原因,也就是開頭貼的。gcd函數。
學過一點編程知識的朋友應該知道,這是一種用途輾轉相除法計算最大公約數遞歸函數。
不同於我們手算最大公約數的方法,這個演算法是醬阿姨的:
舉個簡單的例子,a=24,b=18,求a和b最大公約數;
a除以b,得到的余數是6,然後讓a=18,b=然後往下算;
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是怎麼進去的?
官方說法是:
bug如何定位?在某種發布模式下,應用程序的實例權重將短暫調整為0,注冊中心將返回SLB(負載均衡)權重為字元串類型的0。本發布環境僅用於生產環境,使用頻率極低SLB這個問題在早期灰度過程中沒有觸發。
SLB在balance_by_lua在共享內存中保存的服務階段IP、Port、Weight作為參數傳遞lua-resty-balancer選擇模塊upstream server,在節點weight=「0」時,balancer模塊中的_gcd函數收到的入參b可能是0。
從事後諸葛亮的角度來看,造成嗶哩嗶哩全面崩潰的根本原因有點僅此而已。
bug如何定位?從事後諸葛亮的角度來看,造成嗶哩嗶哩全面崩潰的根本原因有點僅此而已。但從程序員的角度來看,事情真的不辣嗎?當晚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到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站此次前所未見的大崩潰事件。遞歸鍋還是弱型語言鍋?許多網民仍然記得這次事故。他們回憶說,他們認為手機不能更換電腦。有些人還記得五分鍾後,這件事就被熱搜了。大家都很驚訝,這么簡單的死循環會導致這么大的網站崩潰。
然而,有人指出,死循環並不少見,而是罕見的SLB在分發過程中出現問題,不像在後台出現問題,很快就能重啟解決。
為避免這種情況, 有些人認為應該謹慎使用遞歸,堅持使用或設置計數器,直接達到業務不可能達到的值return掉。還有人認為這不怪遞歸,主要是弱語言的鍋。
這也導致了詭計多端的『0』這搞笑。
另外,因為事故耽誤了太久,事情太多,B站給所有用戶補了一天大會員。
有人在這里算了一筆賬,說是這七行代碼,讓嗶哩嗶哩老闆一下子虧了1.575萬元左右。(手動狗頭)
對於這個bug,你想吐槽什麼?
參考鏈接:
https://mp.weixin.qq.com/s/nGtC5lBX_Iaj57HIdXq3Qg
— 完 —量子位 QbitAI · 頭條號簽約關注我們,第一次了解前沿科技動態C. 緗戝弸鑷縐癈璇璦澶т漿鐨勬楁簮鑷鍝閲岋紵
鍦˙絝欏師紲炵浉鍏寵ㄨ哄尯涓錛屼竴浣嶇綉鍙嬬殑涓鐣璦璁哄紩璧蜂簡鐑璁銆備粬琛ㄧず錛氣滃傛灉鑵捐鏁㈠圭背鍝堟父鍑烘墜錛岄偅鎴戣繖涓狢璇璦鐨勫ぇ浣灝卞皢鐜嬭呰崳鑰鐨勬簮浠g爜鍏寮錛岃╁ぇ瀹惰佽瘑涓涓嬨傗濊繖鍙ヨ瘽涓鐨勨淐璇璦澶т漿鈥濇楃敱姝よ癁鐢燂紝鎴愪負浜嗙綉鍙嬩滑璋冧緝娓告垙緙栫▼鎶鏈鏃剁殑嫻佽岀敤璇銆侰璇璦浣滀負涓闂ㄩ潰鍚戣繃紼嬬殑緙栫▼璇璦錛屼互鍏舵晥鐜囬珮銆佹棤闇榪愯岀幆澧冩敮鎸併佷唬鐮佺畝媧佸拰鍙縐繪嶆х瓑鐗圭偣鑰岀煡鍚嶃傚畠浣垮緱紼嬪簭鍛樿兘澶熷揩閫熺紪鍐欏嚭楂樻晥涓旀槗浜庣淮鎶ょ殑浠g爜錛屼笌奼囩紪璇璦鐩告瘮錛孋璇璦鐨勬弿榪版洿鐩磋傦紝宸ヤ綔閲忔洿灝忥紝璋冭瘯鍜屼慨鏀規洿涓烘柟渚褲傝繖涓姊楁簮浜庣綉緇滐紝涔熸椿璺冨湪緗戠粶絀洪棿錛屽師浣滆呯殑鏅烘収鍜岃礎鐚鍊煎緱鎴戜滑灝婇噸銆