線程分析功能提供線程粒度的CPU耗時和每類線程數量的統計,並且每5分鐘記錄一次線程的方法棧並彙總,可真實還原代碼執行過程,協助您快速定位線程問題。當發現叢集的CPU使用率過高,或者出現大量慢方法時,可以通過線程分析功能找到消耗CPU最多的線程或方法。
該功能目前僅支援Java應用。
前提條件
ARMS應用監控面向已開通新版計費的使用者提供全新的監控詳情頁面,新版計費詳情,請參見產品計費(新版)。
對於未開通新版計費的使用者,如需查看新版監控詳情頁面,可在應用列表頁面單擊切換新版。
已為應用安裝探針,具體操作,請參見應用監控接入概述。
功能入口
-
登入ARMS控制台,在左側導覽列選擇。
-
在应用列表頁面頂部選擇目標地區,然後單擊目標應用程式名稱。
說明语言列的表徵圖含義如下:
:接入應用監控的Java應用。
:接入應用監控的Golang應用。
:接入應用監控的Python應用。-:接入可觀測鏈路 OpenTelemetry 版的應用。
-
在上方導覽列中選擇。
進行線程分析
线程分析頁面的左側列表展示了應用的全部線程,您可以根據CPU耗時統計快速發現異常線程。選中某一異常線程後,再根據右側的CPU耗時和線程數曲線圖分析CPU耗時與線程數變化,例如分析每分鐘的線程總數是否過多。
您還可以單擊異常線程的方法栈,查看指定時間內的真實運行方法棧,例如查看處於BLOCKED狀態的線程對應的方法,從而最佳化指定程式碼片段,以便降低CPU使用率。
ALL: 365194 RUNNABLE: 986 BLOCKED: 87 WAITING: 1498 TIMED_WAITING: 362617
【BLOCKED】81/87(次) - 佔比93.10%
at java.lang.Object.wait (Native Method)
at xxx.awaitAvailable (BasicResourcePool.java:1315)
at xxx.prelimCheckoutResource (BasicResourcePool.java:557)
at xxx.checkoutResource (BasicResourcePool.java:477)
at xxx.checkoutPooledConnection (C3P0PooledConnectionPool.java:525)
at xxx.getConnection (AbstractPoolBackedDataSource.java:128)
at xxx.getConnection (PoolingConnectionProvider.java:247)
at xxx.getConnection (DBConnectionManager.java:108)
at xxx.getConnection (JobStoreSupport.java:775)
at com.alibaba.arms.alert.scheduler.xxx.EnhanceJobStoreSupport.getNonManagedTXConnection (EnhanceJobStoreSupport.java:17)
at xxx.executeInNonManagedTXLock (JobStoreSupport.java:3777)
at xxx.retryExecuteInNonManagedTXLock (JobStoreSupport.java:3742)
at xxx.triggeredJobComplete (JobStoreSupport.java:3039)
at xxx.notifyJobStoreJobComplete (QuartzScheduler.java:1804)
at xxx.JobRunShell.java:269)
at xxx$WorkerThread.run (SimpleThreadPool.java:573)
【BLOCKED】2/87(次) - 佔比2.30%
at xxx.checkinStatement (GooGooStatementCache.java:220)
at xxx.checkinStatement (NewPooledConnection.java:239)
at xxx.close (NewProxyPreparedStatement.java:1807)
at xxx.closeStatement (StdJDBCDelegate.java:3287)
at xxx.deleteFiredTrigger (StdJDBCDelegate.java:2916)
at xxx.triggeredJobComplete (JobStoreSupport.java:3116)
at xxx.executeVoid (JobStoreSupport.java:3043)
at xxx.$VoidTransactionCallback.execute (JobStoreSupport.java:3703)
at xxx.$VoidTransactionCallback.execute (JobStoreSupport.java:3701)
at xxx.executeInNonManagedTXLock (JobStoreSupport.java:3787)
at xxx.retryExecuteInNonManagedTXLock (JobStoreSupport.java:3742)
at xxx.triggeredJobComplete (JobStoreSupport.java:3039)
at xxx.notifyJobStoreJobComplete (QuartzScheduler.java:1804)
at xxx.JobRunShell.java:269)
at xxx.WorkerThread.run (SimpleThreadPool.java:573)
【BLOCKED】1/87(次) - 佔比1.15%
如果您的探針版本為2.7.3.5或以上版本,ARMS通過持續剖析能力提供了資料更準確的線程CPU使用方法棧資訊,效果如下圖所示,更多資訊,請參見持續剖析。

如果單擊方法栈後,顯示無資料,排查方法如下:
-
如果探針版本為2.7.3.5以下,則在頁簽的線程設定地區查看線程分析方法棧開關是否開啟。如未開啟,則無法記錄方法棧資訊;如已開啟,則每5分鐘採集一次方法棧資訊。
-
如果探針版本為2.7.3.5及以上,則在頁簽的持續剖析地區查看總開關和CPU熱點開關是否開啟。如未開啟,則無法記錄方法棧資訊。