如何排查线上环境CPU100%问题

如何排查线上环境CPU100%问题
cpu爆满的原因可能:1、形成了死锁。2、形成了死循环

死锁的检查:
方式一:

  1. 可通过jps或者ps -ef | grep java的命令查看到运行程序的PID
  2. 使用jstack -l pid 命令查看线程的堆栈信息,-l是小写L
    方式二:
    可通过jvm的jconsole或者jvisualvm工具检查死锁

分析CPU过高问题:
使用top命令查找出使用率比较高的进程 pid
比如这里的4049,可通过P以CPU的使用资源排序显示
如何排查线上环境CPU100%问题_第1张图片

根据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 

如何排查线上环境CPU100%问题_第2张图片

这里就可以看出代码异常的地方,查看源代码,和堆栈信息一样,代码的21行出现问题
如何排查线上环境CPU100%问题_第3张图片

jstack -l 4049 > /tmp/error.log,将堆栈信息导到日志文件
分析堆栈文件,日志里面的nid对应的值就是进程下最耗资源的线程ID转换的十六进制,然后可能根据这个nid排查具体的内容

你可能感兴趣的:(服务器,大后端,jvm,java,linux)