OpenResty XRay 是一個基於經過我們改進的動態追蹤技術開發的效能分析和問題診斷平臺。它可以分析和診斷各種技術棧和軟體,包括 Linux 核心、Go、OpenResty/Nginx、PHP、Python、Perl 等。在開發和測試 OpenResty XRay 的過程中,我們經常發現開源軟體和工具鏈中的許多 bug。畢竟,OpenResty XRay動態追蹤技術提高到了前所未有的水平。我們針對各種技術棧和軟體的分析工具比那些針對 SystemTap, DTrace, 和 eBPF 的開源工具要複雜得多。因此,我們的測試集經常對 Linux 核心、eBPF, LLVM, SystemTap, GDB 等造成前所未有的壓力。高壓力自然能捕捉到更深的 bug。

在本文中,我們打算介紹 Linux 核心追蹤子系統中的兩個 bug。這兩個 bug 會影響 Linux 中與動態追蹤相關的所有工具和框架。幸運的是,OpenResty XRay 可以繞過其中一個 bug,也可以保護我們的客戶不踩另一個 bug 的坑。

讀取使用者空間記憶體時的核心死鎖

Linux 的官方主線核心從 5.19 到 6.2 的系列上有一個相對較嚴重的衰退。mm 子系統的一個核心開發者改變了使用者空間記憶體讀取的實現方式,導致在 NMI 上下文(如 perf 事件)中追蹤子系統讀取使用者空間記憶體時出現死鎖,這個 bug 在 6.3 系列中被修復。開源的 eBPF 工具鏈(包括 perf 和 bcc)都受此影響。我們向開源的 SystemTap 提交了一個繞過這個 bug 的補丁,並在我們的 OpenResty XRay 平臺的 eBPF+ 執行時中解決了這個問題。這個 bug 可以透過執行我們的 OpenResty XRay 測試集來複現。

由此可見,我們必須更積極地測試最新的主線核心;否則,這樣一個嚴重的衰退就會影響很多的核心版本系列。

根據我們的經驗,Ubuntu 和 Debian 通常不會向後移植補丁。相反,Red Hat 會非常勤快地向後移植這些補丁(當然,有時 Red Hat 也向後移植有問題的補丁,引入新的 bug,下面我們將會看到這樣一個案例。

核心中 x86 斷點插入的資料競爭

從 5.2 到 5.4 系列,Linux 的官方主線核心有一個嚴重的衰退。一個開發者在重構 x86(包括 x86_64)上的動態斷點插入程式碼時,腦子抽了一下。他根本沒有考慮併發和並行訪問的情況,而是直接將多執行緒場景當作單執行緒場景來程式設計,並在核心上下文中不加保護地讀寫全域性變數,這就相當於裸奔。

有趣的是,原本不受影響的 CentOS/RHEL 7 的 3.10 核心也受到了影響,因為 Red Hat 勤快地向後移植了這個有問題的補丁。幸運的是,過了一段時間,Red Hat 也勤快地向後移植了這個衰退的修復。Ubuntu 和 Debian 的 5.2 ~ 5.4 核心不會像往常一樣向後移植修復。幸運的是,這個 bug 通常發生在有很多 CPU 核心的情況下。我們在我們的 OpenResty XRay 產品中將所有有這個 bug 的核心列入黑名單,但使用者依然可以透過強制選項繞過我們的保護。

這個 bug 會影響所有涉及動態追蹤、eBPF、SytemTap、Dtrace 等的 x86 工具。沒有(已知的)方法可以繞過它,因為它太底層了,直接出現在特定架構的機器彙編指令級別上。

結論

在本文中,我們介紹了兩個我們使用 OpenResty XRay 發現的 Linux 核心中的追蹤 bug。這些 bug 有著深遠的影響,影響了許多依賴動態追蹤技術實現的工具和框架。我們解釋了這些 bug 產生的原因和影響,以及它們在主線核心中被修復的時間。希望這篇文章能夠幫助其他遇到類似問題的開發者和使用者,並提高對定期測試和更新核心重要性的認識。

關於 OpenResty XRay

OpenResty XRay 是一個動態追蹤產品,它可以自動分析執行中的應用程式,以解決效能問題、行為問題和安全漏洞,並提供可行的建議。在底層實現上,OpenResty XRay 由我們的 Y 語言驅動,可以在不同環境下支援多種不同的執行時,如 Stap+、eBPF+、GDB 和 ODB。

關於作者

章亦春是開源 OpenResty® 專案創始人兼 OpenResty Inc. 公司 CEO 和創始人。

章亦春(Github ID: agentzh),生於中國江蘇,現定居美國灣區。他是中國早期開源技術和文化的倡導者和領軍人物,曾供職於多家國際知名的高科技企業,如 Cloudflare、雅虎、阿里巴巴, 是 “邊緣計算“、”動態追蹤 “和 “機器程式設計 “的先驅,擁有超過 22 年的程式設計及 16 年的開源經驗。作為擁有超過 4000 萬全球域名使用者的開源專案的領導者。他基於其 OpenResty® 開源專案打造的高科技企業 OpenResty Inc. 位於美國矽谷中心。其主打的兩個產品 OpenResty XRay(利用動態追蹤技術的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最適合微服務和分散式流量的全能型閘道器軟體),廣受全球眾多上市及大型企業青睞。在 OpenResty 以外,章亦春為多個開源專案貢獻了累計超過百萬行程式碼,其中包括,Linux 核心、Nginx、LuaJITGDBSystemTapLLVM、Perl 等,並編寫過 60 多個開源軟體庫。

關注我們

如果您喜歡本文,歡迎關注我們 OpenResty Inc. 公司的部落格網站 。也歡迎掃碼關注我們的微信公眾號:

我們的微信公眾號

翻譯

我們提供了英文版原文和中譯版(本文)。我們也歡迎讀者提供其他語言的翻譯版本,只要是全文翻譯不帶省略,我們都將會考慮採用,非常感謝!