线上CPU飙升问题查找总结
相干命令
- 查看cpu占用最大的过程:
top -c
- 查看过程下线程的cpu:
top -Hp {过程号(PID)}
获取线程号:
printf "%x\n" {线程的PID}
如果输入db1, 则线程号为 0xdb1
- 获取线程的状态和信息:
jstack {过程号} | grep {线程号(例如0xdb1)}
- 查看线程异样信息:
jstack -l {线程PID}
, 也能够保留到文件中查看:jstack -l {线程PID} > {文件名}.stack
获取过程持续时间的GC状况:
jstat -gcutil {过程号PID} {统计距离(毫秒)} {统计次数}
jmap -heap {过程PID}
查看过程堆内是否要溢出了导出过程的dump文件
jmap -dump:format=b,file={文件名}.dmp {过程PID}
体积和堆一样大,速度慢jmap -dump:live,format=b,file={文件名}.hprof {过程PID}
,堆内存活的dump文件,体积小于堆,hprof能够给MAT剖析用(举荐)Linux查看Java过程的启动参数(次要用来查看堆空间调配,和GC计划的采纳)
ps eww {过程PID}
jcmd {过程PID} VM.flags
jinfo -flags {过程PID}
jmap -heap {过程PID}
起因
- 内存耗费过大, 导致Full GC过多
- 代码中有大量耗费CPU的操作,导致CPU过高,零碎运行迟缓
- 因为锁使用不当,导致死锁
- 随机呈现大量线程拜访接口,导致迟缓
- 某个线程因为某种原因始终在WAITING状态,导致此时该性能不可用
方向
- 查看监控平台,看http申请和feign申请是否异样
- 查看满接口平台,查看工夫较长的申请接口
- 查看数据库拜访,找到查问数据量较大的sql或慢sql
- 查看JVM监控,查看堆内存的异样或GC异常情况
- 查看线程是否有异常情况