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,与示例场景逻辑吻合。
相关文档
使用持续剖析功能排查慢调用链和内存使用率较高问题的操作如下:
持续剖析功能使用过程中的常见问题,请参见常见问题。