怎么排查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找到对应的代码范围,这无疑极大的缩小了我们的定位范围。

转:https://mp.weixin.qq.com/s/ykCKfVX6S6CJJpUcqc4cDg

 

CPU飙升排查的更多相关文章

  1. 记一次CPU飙升BUG

    图文地址:https://mp.weixin.qq.com/s?__biz=Mzg3NjEzODQ4NQ==&mid=2247483690&idx=1&sn=7c926f400 ...

  2. 线上CPU飙升100%问题排查,一篇足矣

    一.引子 对于互联网公司,线上CPU飙升的问题很常见(例如某个活动开始,流量突然飙升时),按照本文的步骤排查,基本1分钟即可搞定!特此整理排查方法一篇,供大家参考讨论提高. 二.问题复现 线上系统突然 ...

  3. 面试连环炮系列(八):服务器CPU飙升100%怎么排查

    服务器CPU飙升100%怎么排查 执行"top"命令,查看当前进程CPU占用的实时情况,PID列是进程号,确定是哪个应用程序的问题. 如果是Java应用导致的,怎么定位故障原因 执 ...

  4. 线上CPU飙升100%问题排查

    本文转载自线上CPU飙升100%问题排查 引子 对于互联网公司,线上CPU飙升的问题很常见(例如某个活动开始,流量突然飙升时),按照本文的步骤排查,基本1分钟即可搞定!特此整理排查方法一篇,供大家参考 ...

  5. 【转】Java程序CPU飙升问题排查方法

    windows环境下cpu飙升问题 线上某台runtime机器(windows Server)cpu报警,这种情况初步就是代码里面死循环了,先把机器下线了保证不再有新的任务分配进来,然而cpu使用依然 ...

  6. 【原创】记一次MySQL大表高并发写入引发CPU飙升的排障过程

    目录 一.故障现象... 1 二.初步分析... 2 三.排障过程... 2 1.排查是否QPS或insert并发请求上升导致问题发生... 2 2.排查是否锁资源等待或block导致了insert变 ...

  7. .dhpcd导致cpu飙升问题

    因公司有业务服务器在阿里云上面,阿里云后台报警说,“有恶意程序在挖矿”,引起了高度重视,于是我登陆服务器进行排查. 登陆云服务器:系统centos7.5 第一步使用top查看资源情况. top 可以清 ...

  8. pt-kill--- MySQL数据库CPU飙升紧急处理方法

    MySQL数据库CPU飙升紧急处理方法 [日期:2014-01-22] 来源:Linux社区  作者:hcymysql [字体:大 中 小]       运行平稳的数据库,如果遇到CPU狂飙,到80% ...

  9. MySQL数据库CPU飙升紧急处理方法

    MySQL数据库CPU飙升紧急处理方法 运行平稳的数据库,如果遇到CPU狂飙,到80%左右,那一定是开发写的烂SQL导致的,DBA首先要保证的是,数据库别跑挂了,所以我们要把那些运行慢的SQL杀死并记 ...

随机推荐

  1. 【九度OJ】题目1474:矩阵幂 解题报告

    [九度OJ]题目1474:矩阵幂 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1474 题目描述: 给定一个n*n的矩阵,求该矩阵的 ...

  2. 【LeetCode】725. Split Linked List in Parts 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  3. 小白自制Linux开发板(第二季 V3s篇) 一. 换个核心再来一次

    1.前言 大家心心念念(个人认为)的小白自制开发板全新系列正式来了,之前我们使用全志的F1C200s芯片制作了一个小电脑,众所周知,调试很艰难,坑也很多,以至于墨云到现在还是没找到对应的补救方案,为了 ...

  4. 分布式(CAP)

    1. Consistency  ------->C---------->一致性[写操作之后的读操作,必须返回该值] 2. Availability-------->A-------- ...

  5. wiodows /linux CMD

    windows : netstat -ano      查看所有端口使用情况 netstat -ano |findstr "端口号"     查看特定端口号 tasklist |f ...

  6. 第十六个知识点:描述DSA,Schnorr,RSA-FDH的密钥生成,签名和验证

    第十六个知识点:描述DSA,Schnorr,RSA-FDH的密钥生成,签名和验证 这是密码学52件事系列中第16篇,这周我们描述关于DSA,Schnorr和RSA-FDH的密钥生成,签名和验证. 1. ...

  7. element 表格只展开一行(点击下一行上一行关闭)

    源码:第一步 <el-table :data="tableData" border :row-class-name="tableRowClassName" ...

  8. JVM垃圾收集器专题

    垃圾收集器:利用垃圾收集算法,实现垃圾回收的实践落地. 1 HotSpot垃圾回收器 HotSpot垃圾回收器有多个,可以配合使用. 1.1 垃圾回收的一些术语 术语: Stop the world ...

  9. Django_环境配置(一)

    一.安装Django # 在CMD中运行 pip install django # 查看djangp版本 python manage.py version 二.创建项目 # 在CMD中运行django ...

  10. Nginx日志配置及日志分析脚本案例

    https://blog.csdn.net/bbwangj/article/details/82186162 nginx的log日志分为access log 和 error log 其中access ...