线程分析

更新时间:
复制 MD 格式

线程分析功能提供线程粒度的CPU耗时和每类线程数量的统计,并且每5分钟记录一次线程的方法栈并聚合,可真实还原代码执行过程,帮助您快速定位线程问题。当发现集群的CPU使用率过高,或者出现大量慢方法时,可以通过线程分析功能找到消耗CPU最多的线程或方法。

功能入口

  1. 登录ARMS控制台,在左侧导航栏选择应用监控 > 应用列表

  2. 应用列表页面顶部选择目标地域,然后单击目标应用名称。

    说明

    语言列的图标含义如下:

    Java图标:接入应用监控的Java应用。

    image:接入应用监控的Golang应用。

    image:接入应用监控的Python应用。

    -:接入可观测链路 OpenTelemetry 版的应用。

  3. 在左侧导航栏中选择应用诊断 > 线程分析

进行线程分析

线程分析页面的左侧列表展示了应用的全部线程,您可以根据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使用方法栈信息,效果如下图所示,更多信息,请参见持续剖析

image

说明

如果单击方法栈后,显示无数据,排查方法如下:

  • 如果探针版本为2.7.3.5以下,则在应用配置 > 自定义配置页签的线程设置区域查看线程分析方法栈开关是否开启。如未开启,则无法记录方法栈信息;如已开启,则每5分钟采集一次方法栈信息。

  • 如果探针版本为2.7.3.5及以上,则在应用配置 > 自定义配置页签的持续剖析区域查看总开关CPU热点开关是否开启。如未开启,则无法记录方法栈信息。