线上CPU飙升问题查找总结

相干命令

  1. 查看cpu占用最大的过程:top -c
  2. 查看过程下线程的cpu: top -Hp {过程号(PID)}
  3. 获取线程号: printf "%x\n" {线程的PID}

    如果输入db1, 则线程号为 0xdb1
  4. 获取线程的状态和信息: jstack {过程号} | grep {线程号(例如0xdb1)}
  5. 查看线程异样信息: jstack -l {线程PID}, 也能够保留到文件中查看: jstack -l {线程PID} > {文件名}.stack
  6. 获取过程持续时间的GC状况: jstat -gcutil {过程号PID} {统计距离(毫秒)} {统计次数}

    jmap -heap {过程PID} 查看过程堆内是否要溢出了
  7. 导出过程的dump文件

    jmap -dump:format=b,file={文件名}.dmp {过程PID} 体积和堆一样大,速度慢
    jmap -dump:live,format=b,file={文件名}.hprof {过程PID},堆内存活的dump文件,体积小于堆,hprof能够给MAT剖析用(举荐)
  8. Linux查看Java过程的启动参数(次要用来查看堆空间调配,和GC计划的采纳)

    • ps eww {过程PID}
    • jcmd {过程PID} VM.flags
    • jinfo -flags {过程PID}
    • jmap -heap {过程PID}

起因

  1. 内存耗费过大, 导致Full GC过多
  2. 代码中有大量耗费CPU的操作,导致CPU过高,零碎运行迟缓
  3. 因为锁使用不当,导致死锁
  4. 随机呈现大量线程拜访接口,导致迟缓
  5. 某个线程因为某种原因始终在WAITING状态,导致此时该性能不可用

方向

  1. 查看监控平台,看http申请和feign申请是否异样
  2. 查看满接口平台,查看工夫较长的申请接口
  3. 查看数据库拜访,找到查问数据量较大的sql或慢sql
  4. 查看JVM监控,查看堆内存的异样或GC异常情况
  5. 查看线程是否有异常情况