摘要: 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 XRay 試用並獲取免費報告
關於作者
章亦春是開源 OpenResty® 項目創始人兼 OpenResty Inc. 公司 CEO 和創始人。
章亦春(Github ID:agentzh),出生於中國江蘇,現定居美國硅谷。他是中國早期開源技術和文化的倡導者和領軍人物,曾供職於多家國際知名的高科技企業,如 Cloudflare、Yahoo!、Alibaba, 是 “邊緣計算“、”動態追蹤 “和 “機器編程 “的先驅,擁有超過 22 年的編程及 16 年的開源經驗。作為擁有超過 4000 萬全球域名用户的開源項目的領導者,章亦春被許多業內開發者描述為開源領域的“傳奇“。他基於其 OpenResty® 開源項目打造的高科技企業 OpenResty Inc. 位於美國硅谷中心。其主打的三個產品 OpenResty XRay(利用動態追蹤技術的非侵入式的故障剖析和排除工具)、OpenResty Edge(最適合微服務和分佈式流量的全能型網關軟件)以及 OpenResty Plus(加強版 Web 應用服務器) ,廣受全球數十家上市及大型企業青睞。在 OpenResty 以外,章亦春為多個開源項目貢獻了累計超過百萬行代碼,其中包括,Linux 內核、Nginx、LuaJIT、GDB、SystemTap、LLVM、Perl 等,並編寫過 60 多個開源軟件庫。
關注我們
如果您喜歡本文,歡迎關注我們 OpenResty Inc. 公司的博客網站 。
我們也在 B 站上也有 OpenResty 官方的視頻分享空間,歡迎訂閲。
同時歡迎掃碼關注我們的微信公眾號: