排查cpu飚高问题-两种方案

本文通过模拟代码展示了如何使用arthas工具快速定位由频繁计算引起的CPU飚高问题,并对比了传统的top命令方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

cpu 飚高原因

  1. 频繁创建线程

  2. 线程内进行频繁计算

  3. 模拟代码

     @SpringBootApplication
           @EnableScheduling
           public class CrawlBigDataApplication {
               public static void main(String[] args) {
    /*19*/         SpringApplication.run(CrawlBigDataApplication.class, (String[])args);
                   new Thread(() -> {
    /*21*/             int i = 0;
                       while (true) {
    /*23*/                 i++;
                       }
                   }).start();
               }
           }
    
    

    在springboot 启动项添加如上代码即可模拟,由于频繁计算导致的cpu 飚高问题。

linux 原始方法

  1. top

    image-20221212114847244

  2. top -Hp

    image-20221212114938212

  3. 导出jstack

    jstack 29858 > thread_log.log

    image-20221212115146014

  4. 对top -Hp 查出的cpu 飚高线程id 转成十六进制

    十进制 十六进制

    30019 -> 7543

  5. 编辑 jstack 导出的日志,查找 cpu 飚高线程id 的十六进制对应的线程

在这里插入图片描述

​ 这种方式也可以定位到具体出现问题的代码位置

借助开源工具arthas

  1. 启动arthas

    java -jar arthas-boot.jar

    image-20221212113919770

  2. 使用thread 查看cpu飚高的线程

    image-20221212114024475

  3. 使用thread id 查看具体哪行代码导致cpu飚高的

image-20221212114132158

可以看到在启动项的第23 行导致的CPU 飚高,我们可以使用jad 对启动项进行反编译。如下

image-20221212114310998

可以看到在thread 线程里有一个 ++i的计算在 死循环里,所以这里是由于频繁计算导致的cpu飚高问题。

关于arthas 还有很多高阶用法,请参考如下文档

简介 | arthas (aliyun.com)

总结

arthas 相比原始的top 命令,小编还是比较推荐使用arthas进行分析比较方便。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

康世行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值