线上 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 异常情况
- 查看线程是否有异常情况