線程分析功能提供線程粒度的CPU耗時和每類線程數量的統計,並且每5分鐘記錄一次線程的方法棧並彙總,可真實還原代碼執行過程,協助您快速定位線程問題。當發現叢集的CPU使用率過高,或者出現大量慢方法時,可以通過線程分析功能找到消耗CPU最多的線程或方法。
功能入口
登入ARMS控制台,在左側導覽列選擇。
在應用列表頁面頂部選擇目標地區,然後單擊目標應用程式名稱。
說明語言列的表徵圖含義如下:
:接入應用監控的Java應用。
:接入應用監控的Golang應用。
:接入應用監控的Python應用。-:接入Managed Service for OpenTelemetry的應用。
在左側導覽列中選擇。
進行線程分析
线程分析頁面的左側列表展示了應用的全部線程,您可以根據CPU耗時統計快速發現異常線程。選中某一異常線程後,再根據右側的CPU耗時和線程數曲線圖分析CPU耗時與線程數變化,例如分析每分鐘的線程總數是否過多。
其中線程數曲線圖按線程狀態分為 RUNNABLE、TIMED_WAITING、WAITING 三類分別展示趨勢。左側線程列表支援按線程數或CPU耗時排序,頂部可通過輸入主機 IP 進行搜尋篩選。
您還可以單擊異常線程的方法栈,查看指定時間內的真實運行方法棧,例如查看處於BLOCKED狀態的線程對應的方法,從而最佳化指定程式碼片段,以便降低CPU使用率。
例如,篩選 Scheduler Worker 線程後,方法棧分析結果樣本如下。
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.connectionPool.checkoutPooledConnection (C3P0PooledConnectionPool.java:525)
at xxx.dDataSource.getConnection (AbstractPoolBackedDataSource.java:128)
at xxx.tConnection (PoolingConnectionProvider.java:247)
at xxx.nnection (DBConnectionManager.java:108)
at xxx.rt.getConnection (JobStoreSupport.java:775)
at xxx.EnhanceJobStoreSupport.getNonManagedTXConnection (EnhanceJobStoreSupport.java:17)
at xxx.Support.executeInNonManagedTXLock (JobStoreSupport.java:3777)
at xxx.eSupport.retryExecuteInNonManagedTXLock (JobStoreSupport.java:3742)
at xxx.reSupport.triggeredJobComplete (JobStoreSupport.java:3039)
at xxx.ntifyJobStoreJobComplete (QuartzScheduler.java:1804)
at xxx.obRunShell.java:269)
at xxx.l$WorkerThread.run (SimpleThreadPool.java:573)
【BLOCKED】2/87(次) - 佔比2.30%
at xxx.checkinStatement (GooGooStatementCache.java:220)
at xxx.heckinStatement (NewPooledConnection.java:239)
at xxx.ement.close (NewProxyPreparedStatement.java:1807)
at xxx.seStatement (StdJDBCDelegate.java:3287)
at xxx.leteFiredTrigger (StdJDBCDelegate.java:2916)
at xxx.ggeredJobComplete (JobStoreSupport.java:3116)
at xxx.45.executeVoid (JobStoreSupport.java:3043)
at xxx.$VoidTransactionCallback.execute (JobStoreSupport.java:3703)
at xxx.$VoidTransactionCallback.execute (JobStoreSupport.java:3701)
at xxx.t.executeInNonManagedTXLock (JobStoreSupport.java:3787)
at xxx.rt.retryExecuteInNonManagedTXLock (JobStoreSupport.java:3742)
at xxx.ort.triggeredJobComplete (JobStoreSupport.java:3039)
at xxx.StoreJobComplete (QuartzScheduler.java:1804)
at xxx.Shell.java:269)
at xxx.kerThread.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熱點開關是否開啟。如未開啟,則無法記錄方法棧資訊。