线上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异常情况
- 查看线程是否有异常情况
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。