OpenResty XRay 分析和解決 B 站重大線上事故
摘要: OpenResty Inc. 團隊利用商業產品 OpenResty XRay 的動態追蹤技術,在介入 B 站《2021.07.13 我們是這樣崩的》文中所描述的重大線上事故後很短的時間內定位了導致 B 站線上服務不可用的問題根源,並幫助解決重大線上事故。
B 站(Bilibili.com)這兩天發表了一篇總結去年那場大事故的文章《2021.07.13 我們是這樣崩的》。文章發出後引發了廣泛的關注和討論,有不少關注 OpenResty 的朋友也因此聯絡到我想要了解更多的細節。所以我希望透過這篇文章,從 OpenResty 的角度還原此事件的解決過程,同更多感興趣的技術夥伴介紹我們所運用的技術手段和工具。
從前我們專注於產品和技術研發,較少與外界介紹我們的技術和產品。這篇文章也是我們一系列分享的開端,讓更多的企業知道我們的 OpenResty XRay 產品和服務,從而幫助更多企業發現和快速解決各種線上問題。
事故描述
背景:B 站基於開源 OpenResty 開發了他們的內部閘道器係統。
事故現場:B 站當時所有線上伺服器的 OpenResty 程序總是佔用 CPU 100%,但不能處理任何請求。重啟無法恢復,回滾他們最近的業務程式碼變更也無法恢復。所有伺服器都有這個問題。
B 站是我們的 OpenResty XRay 產品的商業客戶。OpenResty XRay 是一款基於動態追蹤技術的系統故障排查和效能最佳化軟體。事故發生一段時間後,B 站的運維團隊聯絡到我們,希望我們能幫助分析線上的一個嚴重問題。
事故分析過程
我們首先透過線上由 OpenResty XRay 產品自動取樣的 C 語言級別 CPU 火焰圖,確定了他們的 OpenResty 的 nginx 程序的幾乎所有 CPU 時間都花費在執行 Lua 程式碼上面。
出於對客戶的隱私保護和資料安全,這張圖裡只顯示了 OpenResty 開源軟體裡的函式幀,隱去了 B 站自己的 Lua 程式碼相關的資訊。
然後我們再透過 OpenResty XRay 自動取樣的 Lua 語言級別的 CPU 火焰圖確認了幾乎所有的 CPU 時間都花費在了單條 Lua 程式碼路徑上。看起來是那條 Lua 程式碼路徑發生了死迴圈。我們的 Lua CPU 火焰圖定位的 Lua 程式碼路徑可以精確到程式碼行級別。
同樣的,我們只保留了不敏感的開原始碼的函式幀。
B 站原文中提到的 Lua 火焰圖就是 OpenResty XRay 在 B 站生產伺服器上取樣有問題的 OpenResty 服務程序得到的。
OpenResty XRay 在 B 站線上生成火焰圖也就花費了幾十秒到幾分鐘的時間,因為使用 100% 非侵入的動態追蹤技術,整個過程不需要對 B 站的程序和應用進行任何修改。
根據 Lua 火焰圖最終確認根源問題是 B 站的業務往配置後設資料寫入了個字串型別的權重 0 值的壞資料(即 “0”),而 OpenResty 的 lua-resty-balancer 庫的 Lua API 期望的是數值型別的權重值,從而導致了無限遞迴和無限迴圈。
LuaJIT 的即時( JIT)編譯器在這裡並沒有 bug。之所以最初懷疑是 JIT 編譯器的問題是因為對應的 Lua 程式碼路徑乍一看並沒有任何問題,同時 B 站另一個業務團隊未告知的操作也對線上服務產生了影響。字串 0 和數值 0 的區別是非常微妙的。最終我們排除了 JIT 編譯器的 bug 可能性,確定了字串 0 這個問題根源。
事故後續修復和加固
B 站在業務層面確保不會再有字串型別的上游伺服器的權重值被寫入配置資料。
OpenResty XRay 新版也提供了列印 Lua 呼叫棧上所有區域性變數的值的新功能,可以讓類似問題被更快更直接地定位。
我們事後也對開源 OpenResty 的 lua-resty-balancer 庫針對這種 API 誤用進行特別加固,確保任何誤傳的字串型別的權重值總是會被強制轉成數值型別。
OpenResty XRay 產品和服務
OpenResty XRay 是由 OpenResty Inc. 公司提供的一款非侵入式的線上軟體分析系統,基於由 OpenResty Inc. 團隊顯著增強過的動態追蹤技術。目前可以自動針對 OpenResty、Nginx、LuaJIT、PHP、Python、Perl、Go、PostgreSQL、Redis 等各種不同的開源軟體以及執行在這些開源軟體之上的客戶業務程式碼進行深入的分析和監控。未來我們還會陸續加入對更多技術棧的支援,包括Java, Ruby等。使用者使用 OpenResty XRay,可以快速發現和精準定位各種效能問題、功能問題和安全問題, 從而保證應用的穩定性。
OpenResty XRay 的精準定位和問題排查無需對客戶應用作任何修改,無需加裝任何特殊外掛、模組或編譯選項,也不會向客戶程序空間注入任何程式碼。同時也可以穿透客戶現有的未經修改過的 Docker 或 Kubernetes(K8s)容器,透明地分析容器內的各種應用。
除了 B 站,OpenResty XRay 也曾經成功地幫助 Zoom、微軟、去哪兒網等很多公司線上上定位和最佳化了很多真實的線上問題,從高 CPU 波峰到高記憶體使用,再到記憶體洩漏、異常的請求延時、高硬碟 IO 等各種問題。
OpenResty XRay 也支援自動對很多問題進行追蹤和分析推理,直至定位問題根源。
結語
事故最終得到完美的解決,感謝 Bilibili.com 對我們公司產品和技術的信任和支援!感興趣的同學可以透過 OpenResty XRay 產品主頁 瞭解OpenResty XRay的更多資訊並申請試用。
OpenResty XRay 中使用的 Lua 語言級別的 CPU 火焰圖工具在這裡有中文教程介紹。OpenResty XRay 使用的是增強過的私有動態追蹤技術,感興趣的同學可以參考我年初時寫的這個系列文章:《Ylang: Universal Language for eBPF, Stap+, GDB, and More》。
關於作者
章亦春是開源 OpenResty® 專案創始人兼 OpenResty Inc. 公司 CEO 和創始人。
章亦春(Github ID: agentzh),生於中國江蘇,現定居美國灣區。他是中國早期開源技術和文化的倡導者和領軍人物,曾供職於多家國際知名的高科技企業,如 Cloudflare、雅虎、阿里巴巴, 是 “邊緣計算“、”動態追蹤 “和 “機器程式設計 “的先驅,擁有超過 22 年的程式設計及 16 年的開源經驗。作為擁有超過 4000 萬全球域名使用者的開源專案的領導者。他基於其 OpenResty® 開源專案打造的高科技企業 OpenResty Inc. 位於美國矽谷中心。其主打的兩個產品 OpenResty XRay(利用動態追蹤技術的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最適合微服務和分散式流量的全能型閘道器軟體),廣受全球眾多上市及大型企業青睞。在 OpenResty 以外,章亦春為多個開源專案貢獻了累計超過百萬行程式碼,其中包括,Linux 核心、Nginx、LuaJIT、GDB、SystemTap、LLVM、Perl 等,並編寫過 60 多個開源軟體庫。
關注我們
如果您喜歡本文,歡迎關注我們 OpenResty Inc. 公司的部落格網站 。
我們也在 B 站上也有 OpenResty 官方的影片分享空間,歡迎訂閱。
同時歡迎掃碼關注我們的微信公眾號: