如何排查线上环境CPU100%问题
cpu爆满的原因可能:1、形成了死锁。2、形成了死循环
1.使用arthas
2.使用命令的方式
死锁的检查:
方式一:
- 可通过jps或者ps -ef | grep java的命令查看到运行程序的PID
- 使用jstack -l pid 命令查看线程的堆栈信息,-l是小写L
方式二:
可通过jvm的jconsole或者jvisualvm工具检查死锁
分析CPU过高问题:
● 使用top命令查找出使用率比较高的进程 pid
比如这里的4049,可通过P以CPU的使用资源排序显示
● 根据top -Hp pid (这个pid就是上一步top命令找到的pid),查找耗资源的线程ID
比如4049进程下面耗资源的线程ID是4050
● 将查询到的线程ID转成十六进制
#可直接在服务器执行这个命令转换,也可以通过其他转换工具转换
printf "%x\n" 4050
执行后打印的fd2就是4050对应的十六进制
● 拿到线程ID对应的十六进制后,通过 jstack 进程ID | grep 十六进制 -A 30 查看对应的堆栈信息
比如上面查询到进程ID4049下耗资源的线程ID4050转换的十六进制fd2使用命令为:
jstack 4049 | grep fd2 -A 30
这里就可以看出代码异常的地方,查看源代码,和堆栈信息一样,代码的21行出现问题
● jstack -l 4049 > /tmp/error.log,将堆栈信息导到日志文件
● 分析堆栈文件,日志里面的nid对应的值就是进程下最耗资源的线程ID转换的十六进制,然后可能根据这个nid排查具体的内容