該指南也適用于獨立的Java程序,但旨在幫助涉及Java EE企業日常生產支持的個人。 它還將包括最常見的高級CPU問題列表以及高級解決方案。
生產問題解決心態審查
在我們進行下一步之前,重要的是要檢查您的生產問題解決思路。 在我與Java EE生產支持團隊的經驗中,最常見的“反應”之一就是Java VM /中間件重啟通常是執行的第一個恢復操作。 雖然過早重啟可以快速消除業務影響,但也可能使您無法獲取所有技術事實。 降低了識別根本原因的能力,并使平臺在以后再次出現該問題。
在拉動觸發器并關閉Java VM進程之前,請問自己以下問題:我是否擁有所有可用數據以在重啟后執行根本原因分析? 如果答案是否定的,那么我對您的建議是查看并改進您當前的平臺監視和/或故障排除方法。 在出現高CPU問題之前和期間正確收集性能數據至關重要。
Java高CPU –究竟是什么?
現在回到我們的原始主題,一個高CPU問題是通過觀察一個或多個Java VM進程消耗了來自物理主機的過多CPU利用率來定義的。 過多的CPU也可以通過異常高的CPU使用率與已知和已建立的基準來描述。 例如:如果Java VM在峰值負載情況下的平均CPU利用率為40%,則可以將過多的CPU閾值設置為80%左右。

一個典型的Java VM進程包含多個Java線程,其中一些正在等待工作,而另一些正在執行任務。 如果只有一個Java程序,線程數可能會非常低,而對于處理大量并發事務的Java EE企業平臺,線程數可能會非常高。
為了了解和識別一個或多個Java進程的高CPU資源,您將需要了解并執行Java VM的所有線程的完整分解,以便您找出最大的貢獻者。 該分析練習可以按照下圖顯示。

了解您的平均CPU使用率
正如我在前面的部分中提到的,了解當前的平均CPU使用率(稱為基準)非常重要。 這是至關重要的數據,作為全面而持續的平臺容量規劃策略的一部分,需要定期對其進行監視。
正確理解和跟蹤從Java VM進程中觀察到的平均和“健康” CPU利用率,將使您能夠快速檢測異常CPU高峰情況,并與可能的根本原因(項目引入的問題,意外的負載增加等)相關聯。 最后,這將為您提供適當的閾值,以使用您選擇的監視工具來配置與CPU相關的主動警報。
了解您的生產環境和可用工具
作為中間件和/或應用程序支持的主要部分,您確實需要了解您的生產環境,包括可用于執行低級故障排除任務的現成工具。 對于某些人來說,這可能是微不足道的,但是如果您剛開始為新客戶使用新的Java或Java EE平臺,我的建議是您應該花足夠的時間了解客戶的環境規格和業務狀況,如下所示:
- 物理和虛擬主機配置和容量(分配的CPU內核,RAM等的總數)
- 操作系統供應商,版本和補丁程序級別
- 中間件供應商,版本和補丁程序級別
- Java供應商和版本(包括32位和64位); 包括補丁級別
- Java或Java EE應用程序中使用的第三方API
- 您可以利用其進行歷史數據和趨勢分析的現有監視工具
- 環境歷史,已知問題,資源利用等
- 每個應用程序的業務流量細分以及平臺的平均和峰值流量水平; 包括營業高峰期
收集上述所有正確的事實,絕對可以幫助您進行根本原因分析。 包括與CPU相關的問題。
跳到第二部分之前的功課
在我們跳至本CPU故障排除指南的第2部分之前,強烈建議您學習并理解以下各篇文章。 專注于適用于您的環境的環境。 這些文章中的每一篇都會為您提供有關如何對Java VM的每個線程分解CPU的技術方面的逐步指導。 為了調查與Java CPU相關的問題而獲得的關鍵故障排除技能。 該技術在某些方面很常見,具體取決于操作系統。
#Solaris上每個線程的CPU分析
http://javaeesupportpatterns.blogspot.com/2011/12/prstat-solaris-pinpoint-high-cpu-java.html
#Linux上每個線程的CPU分析
http://javaeesupportpatterns.blogspot.com/2012/02/prstat-linux-how-to-pinpoint-high-cpu.html
#AIX上每個線程分析的CPU
http://javaeesupportpatterns.blogspot.com/2011/12/prstat-aix-how-to-pinpoint-high-cpu.html
#Windows上每個線程的CPU分析
http://javaeesupportpatterns.blogspot.com/2012/04/java-thread-cpu-analysis-on-windows.html
我希望本文為Java CPU問題提供了一個很好的起點。 第2部分將為您提供故障排除指南,其中包括流程圖,可讓您根據問題情況選擇正確的調查路徑。
參考: Java High CPU故障排除指南–第1部分,來自我們的JCG合作伙伴 Pierre-Hugues Charbonneau,位于Java EE支持模式和Java教程博客上。
翻譯自: https://www.javacodegeeks.com/2012/05/java-high-cpu-troubleshooting-guide.html