ARMS CPU熱點通過持續剖析技術定時採集正在執行CPU線程的方法棧快照,定位CPU使用率高的根因。當系統CPU使用率較高時,可快速定位導致CPU消耗高的商務邏輯方法棧。
前提條件
已為目標應用安裝 ARMS Agent 並接入應用監控。
已預留約 5% 的額外 CPU 資源裕量,以滿足持續剖析功能對效能的額外開銷需求。
開啟該功能會增加約5%額外CPU開銷,使用前請提前預留相應量可用資源。
開啟CPU熱點
登入,在左側導覽列中選擇應用監控 > 應用列表。
在應用列表頁面,在頂部導覽列選擇地區,單擊目標應用程式名稱。
在頁面上方單擊應用設定,然後單擊自訂配置頁簽。
在持續剖析地區開啟總開關,然後開啟CPU熱點開關,配置需要開啟的應用執行個體的IP地址或者一組執行個體所屬的網段地址。
在頁面底部單擊保存
無需重啟應用即可生效。
通過持續剖析查看CPU熱點資料
樣本:一個每秒在CPU上執行500 ms的方法。
public class CPUPressure {
//請求入口方法
public void runBusiness() {
long start = System.currentTimeMillis(), period = 0;
while (period <= 500L) {
period = System.currentTimeMillis() - start;
}
}
}登入,在左側導覽列中選擇應用監控 > 應用列表。
在應用列表頁面,在頂部導覽列選擇地區,單擊目標應用程式名稱。
在頁面上方單擊持續剖析,在執行個體列表中選擇目標執行個體,然後設定資料展示時間。
在右側查詢頁簽,篩選資料並查看彙總分析。
說明效能分析類型:
CPU Time:CPU申請量熱點剖析資料。
Allocated Memory:記憶體申請量熱點剖析資料。
Allocations:記憶體申請次數熱點剖析資料,可以查看哪些方法申請記憶體次數頻繁。

單擊彙總分析,在新頁面中選擇效能分析類型為CPU Time。

圖中左側為本次調用中涉及的所有方法CPU資源使用方式列表,右側為對應方法所有方法棧資訊繪製的火焰圖。其中:
Self 列表示方法在自身調用棧中消耗的時間或資源,不含子方法調用的消耗,用於識別在自身內部花費大量時間或資源的方法。
Total 列包含方法自身消耗的時間或資源及其所有子方法調用的消耗,用於瞭解整個方法調用棧中貢獻最多時間或資源的方法。
根據上圖,進行如下分析:
將Self值從大到小排列,找到並單擊Self值最大的方法java.lang.System.currentTimeMillis(),右側火焰圖中將會聚焦相關方法。

聚焦後可以發現,java.lang.System.currentTimeMillis()就是右側火焰圖中的最寬棧頂方法。
該棧頂是JDK庫函數,非業務方法。沿棧頂方法java.lang.System.currentTimeMillis()從下往上搜尋,依次經過java.lang.System.currentTimeMillis() > com.alibaba.cloud.pressure.memory.CPUPressure.runBusiness(),com.alibaba.cloud.pressure.memory.CPUPressure.runBusiness()屬於所分析應用的業務方法,耗時28.63 s,占整張火焰圖的91.44%。因此,com.alibaba.cloud.pressure.memory.CPUPressure.runBusiness()是該採集時段內資源佔用較高的顯著瓶頸,可根據方法名梳理商務邏輯,查看是否存在最佳化空間。
通過上述分析,可以看到在1分鐘內,com.alibaba.cloud.pressure.memory.CPUPressure.runBusiness()方法耗時28.63 s,與樣本情境邏輯吻合。
相關文檔
使用持續剖析功能排查慢調用鏈和記憶體使用量率較高問題的操作如下:
持續剖析功能使用過程中的常見問題,請參見常見問題。