线上问题排查总结

Cpu飙高可能的原因

  1. CAS自旋 没有控制自旋次数;乐观锁
  2. 死循环----cpu飙高的问题;控制循环次数
  3. 云服务器redis被注入挖矿程序;端口像公网暴露;Redis端口不要被外网访问,ip黑名单
  4. 服务器被DDOS攻击导致cpu飙高。限流ip、黑名单,图形验证码。

Windows系统排查cpu飙高方法

  1. 制造死循环让cpu飙高的代码

    package com.company;
    
    /**
     * @author 晓果冻
     * @version 1.0
     * @date 2021/6/23 7:45
     */
    public class Demo {
        public static void main(String[] args) {
            new Thread(()->{
                while(true){
                    System.out.println("11111");
                }
            },"晓果冻").start();
        }
    }
    
  2. 指定线程名称

    创建新的线程的时候最好指定它的名称不然默认的都是Thread-0、Thread-1这样的,指定名称,在排查问题时也方便在直接在项目
    中搜索是哪段代码出了问题。
    
  3. jvisualvm排查

    jvisualvm是jdk自带的工具,在bin目录下,jvisualvm.exe
    

    image-20210812224319469
    image-20210812224729322

  4. 锁定犯罪线程-晓果冻,这就是第二步为什么指定线程名称的原因

  5. 根据jvisualvm中显示的线程在代码中搜索即可。具体代码具体分析。

Linux环境下排查cpu飙高的问题

  1. 先模拟一种死锁的情况,让cpu飙高

    /**
     * @author 晓果冻
     * @version 1.0
     * @date 2021/6/23 7:45
     */
    public class Demo {
        public static void main(String[] args) {
            new Thread(()->{
                while(true){
                    System.out.println("11111");
                }
            },"晓果冻").start();
        }
    }
    
  2. 上传到我们的服务器,测试下
    image-20210819224313188

    arthas-boot.jar  我们的分析工具  阿狸的
    Demo.java  模拟死循环让cpu飙升的代码
    
  3. 编译,运行
    image-20210819224635587

  4. 启动arthas分析哪个进程占用cpu
    image-20210819224830995

    [1]:序号
    8781 Demo:进程号,项目名
    
  5. 通过arthas的命令分析cpu飙高的问题
    image-20210819225617580

    进程号改变是因为我又重启了程序
    通过打印出的信息可以在代码中搜索晓果冻线程名来查询到底是哪段代码出了问题
    
    在线实验学习arthas

Q.E.D.


一个热爱生活的95后精神小伙