专栏首页麒思妙想怎么排查CPU飙升

怎么排查CPU飙升

怎么排查CPU飙升

线上有些系统,本来跑的好好的,突然有一天就会出现报警,CPU使用率飙升,然后重启之后就好了。例如,多线程操作一个线程不安全的list往往就会出现这种现象。那么怎么定位到具体的代码范围呢?今天笔者就教大家一个小技巧

代码准备

这次,笔者准备了一个demo代码,大致线程模型是这样的:

代码下所示:

public class CpuHighExample {

    public static void cpuHigh() {
        final List<String> list = new LinkedList<>();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                int count = 1;
                while (true) {
                    // 构造thread1为消耗很高cpu的线程
                    count = count + 1;
                }
            }
        });
        thread1.setName("thread1");
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    try {
                        // 构造thread2为消耗很低cpu的线程
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
        thread2.setName("thread2");
        thread1.start();
        thread2.start();
    }
}

案例运行

这个案例一运行,就听见笔者的电脑风扇起飞了,呼呼作响。直接top一下

果然是java进程,占用最高,CPU 100%了(占用了一个核),而其PID是2717,正是我们跑的例子。那么下一步,我们就需要定位到底是那一个线程在耗CPU

top -H
Threads toggle
            Starts top with the last remembered ’H’ state reversed.  When this
            toggle  is  On,  all individual threads will be displayed.  Other-
            wise, top displays a summation of all threads in a process.

如man文档所描述,top -H可以打印出线程信息,我们就top -H一下。

图中可以看到,占用最高的线程PID是2727,同时线程名是thread1。

继续jstack

我们知道jstack可以dump出jvm所有线程运行的快照,然后我们就可以通过刚才获取的PID去定位到jstack那个进程。

// 注意,这边用top出来的进程号2717,而不是top -H出来的2727
jstack 2717 > 1.txt

由于jstack打印出的线程号是以16进制的形式表现的,所以我们对2727的线程号做一次转换,得到aa7。

然后我们在1.txt中搜索2727,这里用的是less然后进去后搜索,而不是用grep。因为这样比较直观的能看出之前和之后的信息。less下

我们找到aa7后,就直接能发现代码一直跑在CpuHighExample.java第19行上面。

当然了,我们需要多jstack几次,如果每次jstack出来都刚好在这段代码左右,那么基本可以证明,是这段代码导致CPU飙升了。

总结

CPU突然飙升这个问题,我们很容易通过top -H和jstack找到对应的代码范围,这无疑极大的缩小了我们的定位范围。

关注 【 麒思妙想】解锁更多硬核。

本文分享自微信公众号 - 麒思妙想(qicai1612)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-10-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JDK10居然都发布了

    今天突然发现JDK10居然都发布了,真的感觉JDK9发布没几天啊,下面是介绍具体内容的链接,我就不复制了....

    麒思妙想
  • 如何成为一个成功的首席数据官

    首席数据官(Chief Data Officer,CDO)为组织内的数据“带盐”,并将其表示为战略性企业资产(strategic enterprise asse...

    麒思妙想
  • 再谈Flink

    前一阵痴迷于calcite,打算写一些streaming sql相关的东西,正好时逢置办年货,就买了本书《Flink基础教程》,打开看了一下,就放不下了,一口气...

    麒思妙想
  • 21 | IDS:当黑客绕过了防火墙,你该如何发现?

    在前面两节课中,我们讲了防火墙和 WAF 的工作模式,以及它们是如何作为内外网的隔离设备,在网络边界进行安全防护的。

    斑马
  • 数据分析师不是“数羊”的!

    咨询业内有一个经典的故事: 一个农民赶着羊群在草原上走,迎面碰到一个人对他说:“我可以告诉你,你的羊群有几只羊。”随即,他用卫星定位技术和网络...

    小莹莹
  • QtCreator代码对齐的方法

    Qt君
  • FFmpeg + OpenGLES 实现视频解码播放和视频滤镜

    前面 Android FFmpeg 开发系列文章中,我们已经利用 FFmpeg 的解码功能和 ANativeWindow 的渲染功能,实现了的视频的解码播放。

    字节流动
  • 企业上云——从0到145+门店,乐凯撒做了什么?

    据最新国内比萨市场发展的趋势分析,目前市场上的比萨产品门店约4000家,涵盖大大小小不同品牌及类型,随着西式快餐消费需求的快速增长,预计到2020年各类比萨门店...

    金蝶云社区
  • Arduino1.8.13+ESP32初体验

    设备就是个surface pro3 ,也没有安装arduino所以就连安装的过程也写一下

    云深无际
  • 云计算力助自动化产业再升级

    云计算是分布式处理、并行处理和网格计算的发展,或者说是这些计算机科学概念的商业实现。它的核心是海量数据的存储和计算,特别强调虚拟化技术的应用。简言之,云计算就是...

    静一

扫码关注云+社区

领取腾讯云代金券