OpenResty XRay 是一款 Java 應用效能剖析工具,它使用動態追蹤技術代替 JVM agent,來剖析生產環境中的 CPU 熱點、Off-CPU 阻塞和磁碟 I/O。由於不依賴 JVM 的 safepoint 機制,XRay 避免了傳統 Java 取樣分析器常見的 safepoint 偏差,能夠提供更準確、更全面的效能資料。它可以在不做任何修改的 OpenJDK 8/11/17/21 上執行,覆蓋從現代 Linux 發行版到 RHEL/CentOS 7(3.10 核心)等老系統。

在底層實現上,XRay 由我們自主改進的動態追蹤執行時驅動,例如 eBPF+ 和 Stap+。與基於 agent 的 Java 分析器相比,它具備以下優勢:

  1. 零侵入:無需修改程式碼、無需改配置、無需 agent JAR 包,也無需 -javaagent 引數。
  2. 無 Safepoint 偏差:XRay 不依賴 JVM 的 safepoint 機制,因此其 CPU 火焰圖比基於 agent 的取樣分析器更準確。
  3. 廣泛相容:同時支援 OpenJDK 8、11、17、21,覆蓋現代 Linux 與 CentOS 7 時代的 3.10 核心。
  4. 接近零開銷:取樣時開銷可忽略不計,不取樣時零開銷。

在這篇文章中,我們將帶你走過 OpenResty XRay 的三個 Java 應用剖析場景:CPU 熱點分析、Off-CPU/鎖等待分析,以及磁碟 I/O 剖析。如果你遇到的是記憶體問題,可以參考姊妹篇無需堆轉儲診斷生產環境 Java 記憶體洩漏

用火焰圖剖析 Java CPU 熱點

當 Java 應用的 CPU 使用率異常高時,通常意味著某些程式碼路徑消耗了過多的計算資源。透過 OpenResty XRay引導式分析可以幫助您快速定位這些熱點程式碼。

例如,這是由 OpenResty XRay 為一個壓測狀態下的 Java 應用(在這個例子中是 Tomcat HTTP 應用,但同樣適用於任何未經修改的 Java 應用)生成的 CPU 火焰圖:

在這個火焰圖中,每個條形代表一個函式呼叫,條形的寬度表示該函式佔用的 CPU 時間比例。條形越寬,表示該函式消耗的 CPU 時間越多。

仔細分析這張圖,我們可以清晰地看到 Java 函式 sun.nio.ch.FileDispatcherImpl:write0 佔據了最大的 CPU 時間份額。這是 Java 虛擬機器內部使用的一個本地方法,主要用於將資料寫入檔案或網路套接字。這一發現與我們的壓測場景高度吻合,因為在壓測過程中,大量的 CPU 資源被用於返回響應資料。值得注意的是,OpenResty XRay 能夠精確定位到具體的 .java 原始檔和行號級別,讓您能夠直接找到效能熱點的確切位置,大大提高了問題定位和最佳化的效率。

因為 OpenResty XRay 不依賴 JVM 的 safepoint 機制,這張 CPU 火焰圖不存在困擾傳統 Java 取樣分析器的 safepoint 偏差

Java CPU 剖析器細節檢視——火焰圖中高亮顯示的 .java 原始檔與行號

基於這些深入的分析結果,您可以有的放矢地最佳化這些效能熱點。可能的最佳化策略包括但不限於:改進演算法效率、減少不必要的計算、引入適當的快取機制,或者最佳化 I/O 操作等。透過這些有針對性的最佳化,您可以有效降低應用的 CPU 使用率,提升整體效能。

一旦火焰圖定位到了熱點方法,你還可以用非侵入式的 Java 函式探針實時抓取該方法的呼叫引數——無需 agent,無需位元組碼插樁,也無需重啟。

Off-CPU Java 效能分析:鎖等待與阻塞診斷

有時,Java 應用的 CPU 使用率上不去也可能是一個問題,通常是由 IO 阻塞、等待鎖或其他資源競爭導致的。OpenResty XRay 可以幫助您找出這些瓶頸。

例如,這是由 OpenResty XRay 為一個低 CPU 使用率的 Java 應用生成的 off-CPU 火焰圖:

在這個火焰圖中,每個條形代表一個函式呼叫,條形的寬度表示該函式阻塞 CPU 的時間。條形越寬,表示該函式阻塞 CPU 的時間越多。

仔細觀察火焰圖中最寬的部分,我們可以發現在 BankSystem.java 的第 76 行呼叫了 java.util.concurrent.locks.ReentrantLock:lock 函式來獲取鎖。這裡的寬矩形表明多個執行緒在等待這個鎖,導致 CPU 使用率無法提高。

Off-CPU 火焰圖細節檢視——BankSystem.java 第 76 行的 ReentrantLock:lock 鎖競爭

透過分析這些詳細資訊,您可以快速識別出導致 CPU 利用率低的根本原因。根據具體情況,您可以採取相應的最佳化措施,如改進鎖策略、最佳化 IO 操作,或引入非同步程式設計技術,從而全面提升應用的效能表現。

如果想從請求維度檢視同樣的阻塞行為,可以參考如何用逐請求 PCAP 精確定位那個慢 Tomcat 請求

Java 磁碟 I/O 剖析:從系統呼叫到 Java 原始碼行

硬碟 IO 過高不僅會顯著影響應用效能,還可能導致整個系統執行緩慢。OpenResty XRay 是一款強大的工具,能夠幫助您精確定位 Java 應用中引起高硬碟 IO 的程式碼路徑。

下圖展示了一個高硬碟 IO 場景下的 Java 應用火焰圖:

仔細分析火焰圖中最寬的部分,我們可以清晰地看到,在 SaveCache.java 檔案的第 103 行呼叫的寫入函式 java.io.Writer:write 是導致硬碟 IO 壓力的主要來源。

磁碟 I/O 火焰圖細節檢視——SaveCache.java 第 103 行的 java.io.Writer:write

基於這些精確的資訊,您可以有針對性地最佳化硬碟 IO 密集的程式碼。例如,可以考慮使用緩衝技術、實現非同步 IO 操作,或採用批次處理等策略來有效降低硬碟 IO 壓力,從而提升整體系統效能。

如果想從一次 write() 系統呼叫一路還原出完整呼叫棧、追溯到發起寫入的業務方法,可以參考用時間穿梭呼叫棧除錯 Java 檔案 I/O

透過 OpenResty XRay 的深入分析,您可以更加高效地識別和解決效能瓶頸,確保您的 Java 應用在各種負載條件下都能保持卓越的效能表現。

支援 OpenJDK 8/11/17/21 應用剖析

OpenResty XRay 支援所有主流 OpenJDK 版本的 Java 應用剖析:

  • OpenJDK 8
  • OpenJDK 11
  • OpenJDK 17
  • OpenJDK 21

Oracle JDK 同樣支援,覆蓋相同的版本範圍,依靠的是我們的除錯符號重建技術。

同時,它也能執行在廣泛的 Linux 發行版上,從最新核心到 RHEL/CentOS 7(Linux 3.10)等老系統皆可覆蓋。

自動化取樣和專家分析

OpenResty XRay 不僅提供了強大的分析功能,還具備自動化的取樣和報告生成能力。為您的效能最佳化工作帶來更多便利:

  1. 自動線上按需取樣:XRay 能夠根據預設條件自動觸發取樣,無需人工干預。這意味著您可以在特定負載或效能指標達到某個閾值時自動開始採集資料,確保捕捉到最關鍵的效能問題。

  2. 自動生成分析報告:基於採集到的資料,XRay 能夠自動生成詳細的分析報告。這些報告包含了效能熱點、資源使用情況、潛在的最佳化建議等關鍵資訊,讓您能夠快速瞭解應用的效能狀況。

  3. 專家團隊支援:除了自動化功能,我們的專家團隊隨時準備為您提供更深入的支援:

    • 根據您的具體需求,我們可以為您定製新的分析器,以滿足特定的效能監控需求。
    • 我們的專家會協助您解讀自動生成的報告,提供專業的見解和最佳化建議。
    • 如遇到複雜的效能問題,我們的團隊可以提供更深入的分析和解決方案。

這是一份由 OpenResty XRay 生成的示例報告:

OpenResty XRay 生成的 Java 應用效能剖析報告——CPU、Off-CPU 與磁碟 I/O 總覽

透過結合自動化工具和專家支援,OpenResty XRay 為您提供了一個全面的效能最佳化解決方案,幫助您的 Java 應用始終保持最佳效能狀態。

效能影響和額外負擔

OpenResty XRay 的設計理念是非侵入性和輕量級的。在取樣時,新增到 Java 應用程序的額外負擔通常非常小,可以忽略不計。而在不取樣的時候,程序執行速度則完全不受任何影響。

這種低開銷的特性使得 OpenResty XRay 成為理想的生產環境監控工具,讓您可以隨時隨地進行效能分析,而不必擔心對應用造成顯著影響。

下一步的計劃

我們並未止步於此。未來還有更多讓 OpenResty XRay 對您來說更加強大和有用的計劃。我們正在開發的一些功能包括:

  • 統計 Java 應用網路請求的延時情況,智慧抓取問題請求的資料包。
  • 支援其他技術棧和開源軟體。我們希望使 OpenResty XRay 成為一種通用工具,可以分析任何線上應用,無論底層技術是甚麼。我們考慮的一些目標包括 Nginx 模組,Envoy 擴充套件,PostgreSQL 擴充套件,Perl/Python/Ruby 模組和庫,以及更多。

如果您有任何建議或對更多指標或功能的需求,請告訴我們。我們一直在傾聽您的反饋,並持續改進我們的產品以滿足您的需求。

常見問題

OpenResty XRay 需要 JVM agent 或 safepoint 嗎?

不需要。OpenResty XRay 使用 eBPF+、Stap+ 等動態追蹤執行時,而不是傳統的 JVM agent,並且不依賴 JVM 的 safepoint 機制。因此,它生成的 CPU 火焰圖不存在困擾傳統 Java 取樣分析器的 safepoint 偏差,也無需修改程式碼或新增特殊的 JVM 啟動引數。

甚麼情況下需要為 Java 應用生成 Off-CPU 火焰圖?

當 Java 應用的 CPU 使用率異常低時,原因通常是 I/O 阻塞、等待鎖或其他資源競爭。OpenResty XRay 會為這類場景生成 Off-CPU 火焰圖——例如,展示多個執行緒正在等待 BankSystem.java 第 76 行的 ReentrantLock:lock 呼叫。

支援哪些 OpenJDK 版本和 Linux 核心?

支援 OpenJDK 8、11、17 和 21,同樣版本範圍的 Oracle JDK 也支援,依靠的是我們的除錯符號重建技術。在作業系統方面,OpenResty XRay 既能執行在現代 Linux 發行版上,也能執行在 RHEL/CentOS 7(3.10 核心)等較舊的系統棧上。

結論

在本文中,我們向您展示瞭如何使用 OpenResty XRay 來分析 Java 應用的 CPU 和硬碟 IO 使用情況。我們還向您展示了一些結果的示例,並解釋了它們的含義。

透過使用 OpenResty XRay,您可以輕鬆找出那些消耗 CPU 和硬碟資源的程式碼路徑,以及它們對整體效能有多大的影響。然後,您可以使用這些資訊來最佳化您的 Java 應用,使其執行得更快更順暢。

如果您想更多地瞭解 OpenResty XRay 產品以及它能夠如何幫助您處理線上應用的其他方面的資訊,請訪問 我們的網站聯絡我們 以瞭解更多細節。

關於 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. 公司的 部落格網站 。也歡迎掃碼關注我們的微信公眾號:

我們的微信公眾號

翻譯

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