分析線上 Java 應用的 CPU,off-CPU 和硬碟 IO 使用情況(使用 OpenResty XRay)
OpenResty XRay 是一款 動態追蹤 產品,它可以讓您在不修改應用程式的情況下對線上應用程式進行分析。它的使用非常高效且安全。您可以在任何時候對任何執行中的程序進行深入的瞭解,就像對您的軟體進行 X 光檢查一樣。
與傳統的分析工具不同,OpenResty XRay 不依賴於 JVM 的 safepoint 機制,這意味著它可以在不影響 Java 應用效能的情況下進行分析。這種獨特的方法使得 XRay 能夠提供更準確、更全面的效能資料,同時最大限度地減少對被分析應用的干擾。
OpenResty XRay 的核心技術基於我們自主改進的動態追蹤技術,如 eBPF+ 和 Stap+。這些先進的技術使得 XRay 能夠提供更深入、更精確的分析能力,同時保持極低的系統開銷。值得一提的是,OpenResty XRay 同時支援 RHEL/CentOS Linux 7 的 3.10 老核心和 6.x 新核心,為使用者提供了廣泛的系統相容性。
OpenResty XRay 支援的應用之一是 Java。與傳統的 JVM agent 方式不同,OpenResty XRay 採用先進的動態追蹤技術,為您提供以下獨特優勢:
- 零侵入性:無需修改您的 Java 應用程式碼或配置,也無需新增新的外掛或庫。
- 無需特殊 JVM 選項:您可以使用現有的 OpenJDK 8/11/17,無需新增任何特殊的 JVM 啟動選項。
- 廣泛的系統相容性:支援從現代 Linux 發行版到老系統如 CentOS 7 在內的多種作業系統。
- 極低的效能損耗:取樣時對 Java 應用的額外負擔幾乎可以忽略不計,不取樣時則完全沒有影響。
這些特性使得 OpenResty XRay 成為一個真正的“即插即用”解決方案,讓您能夠在任何時候、任何環境下對 Java 應用進行深入分析,就像對您的軟體進行 X 光檢查一樣。
在這篇文章中,我們將向您展示如何使用 OpenResty XRay 來分析 Java 應用中的 CPU 和硬碟 IO 效能問題。
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 原始檔和行號級別,讓您能夠直接找到效能熱點的確切位置,大大提高了問題定位和最佳化的效率。
基於這些深入的分析結果,您可以有的放矢地最佳化這些效能熱點。可能的最佳化策略包括但不限於:改進演算法效率、減少不必要的計算、引入適當的快取機制,或者最佳化 I/O 操作等。透過這些有針對性的最佳化,您可以有效降低應用的 CPU 使用率,提升整體效能。
Java 應用中的 CPU 阻塞問題
有時,Java 應用的 CPU 使用率上不去也可能是一個問題,通常是由 IO 阻塞、等待鎖或其他資源競爭導致的。OpenResty XRay 可以幫助您找出這些瓶頸。
例如,這是由 OpenResty XRay 為一個低 CPU 使用率的 Java 應用生成的 off-CPU 火焰圖:
在這個火焰圖中,每個條形代表一個函式呼叫,條形的寬度表示該函式阻塞 CPU 的時間。條形越寬,表示該函式阻塞 CPU 的時間越多。
仔細觀察火焰圖中最寬的部分,我們可以發現在 BankSystem.java
的第 76 行呼叫了 java.util.concurrent.locks.ReentrantLock:lock
函式來獲取鎖。這裡的寬矩形表明多個執行緒在等待這個鎖,導致 CPU 使用率無法提高。
透過分析這些詳細資訊,您可以快速識別出導致 CPU 利用率低的根本原因。根據具體情況,您可以採取相應的最佳化措施,如改進鎖策略、最佳化 IO 操作,或引入非同步程式設計技術,從而全面提升應用的效能表現。
Java 應用中的高硬碟 IO 問題
硬碟 IO 過高不僅會顯著影響應用效能,還可能導致整個系統執行緩慢。OpenResty XRay 是一款強大的工具,能夠幫助您精確定位 Java 應用中引起高硬碟 IO 的程式碼路徑。
下圖展示了一個高硬碟 IO 場景下的 Java 應用火焰圖:
仔細分析火焰圖中最寬的部分,我們可以清晰地看到,在 SaveCache.java
檔案的第 103 行呼叫的寫入函式 java.io.Writer:write
是導致硬碟 IO 壓力的主要來源。
基於這些精確的資訊,您可以有針對性地最佳化硬碟 IO 密集的程式碼。例如,可以考慮使用緩衝技術、實現非同步 IO 操作,或採用批次處理等策略來有效降低硬碟 IO 壓力,從而提升整體系統效能。
透過 OpenResty XRay 的深入分析,您可以更加高效地識別和解決效能瓶頸,確保您的 Java 應用在各種負載條件下都能保持卓越的效能表現。
支援的 Java 版本和作業系統
OpenResty XRay 支援主流的 OpenJDK Java 版本,包括:
- Java 8
- Java 11
- Java 17
同時,OpenResty XRay 也支援多種 Linux 作業系統,從最新的發行版到老系統如 CentOS 7,為您提供最大的靈活性和相容性。
自動化取樣和專家分析
OpenResty XRay 不僅提供了強大的分析功能,還具備自動化的取樣和報告生成能力。為您的效能最佳化工作帶來更多便利:
-
自動線上按需取樣:XRay 能夠根據預設條件自動觸發取樣,無需人工干預。這意味著您可以在特定負載或效能指標達到某個閾值時自動開始採集資料,確保捕捉到最關鍵的效能問題。
-
自動生成分析報告:基於採集到的資料,XRay 能夠自動生成詳細的分析報告。這些報告包含了效能熱點、資源使用情況、潛在的最佳化建議等關鍵資訊,讓您能夠快速瞭解應用的效能狀況。
-
專家團隊支援:除了自動化功能,我們的專家團隊隨時準備為您提供更深入的支援:
- 根據您的具體需求,我們可以為您定製新的分析器,以滿足特定的效能監控需求。
- 我們的專家會協助您解讀自動生成的報告,提供專業的見解和最佳化建議。
- 如遇到複雜的效能問題,我們的團隊可以提供更深入的分析和解決方案。
這是一份由 OpenResty XRay 生成的示例報告:
透過結合自動化工具和專家支援,OpenResty XRay 為您提供了一個全面的效能最佳化解決方案,幫助您的 Java 應用始終保持最佳效能狀態。
效能影響和額外負擔
OpenResty XRay 的設計理念是非侵入性和輕量級的。在取樣時,新增到 Java 應用程序的額外負擔通常非常小,可以忽略不計。而在不取樣的時候,程序執行速度則完全不受任何影響。
這種低開銷的特性使得 OpenResty XRay 成為理想的生產環境監控工具,讓您可以隨時隨地進行效能分析,而不必擔心對應用造成顯著影響。
下一步的計劃
我們並未止步於此。未來還有更多讓 OpenResty XRay 對您來說更加強大和有用的計劃。我們正在開發的一些功能包括:
- 統計 Java 應用網路請求的延時情況,智慧抓取問題請求的資料包。
- 支援其他技術棧和開源軟體。我們希望使 OpenResty XRay 成為一種通用工具,可以分析任何線上應用程式,無論底層技術是甚麼。我們考慮的一些目標包括 Nginx 模組,Envoy 擴充套件,PostgreSQL 擴充套件,Perl/Python/Ruby 模組和庫,以及更多。
如果您有任何建議或對更多指標或功能的需求,請告訴我們。我們一直在傾聽您的反饋,並持續改進我們的產品以滿足您的需求。
結論
在本文中,我們向您展示瞭如何使用 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、LuaJIT、GDB、SystemTap、LLVM、Perl 等,並編寫過 60 多個開源軟體庫。
關注我們
如果您喜歡本文,歡迎關注我們 OpenResty Inc. 公司的 部落格網站 。也歡迎掃碼關注我們的微信公眾號:
翻譯
我們提供了 英文版 原文和中譯版(本文)。我們也歡迎讀者提供其他語言的翻譯版本,只要是全文翻譯不帶省略,我們都將會考慮採用,非常感謝!