CPU高问题定位排查

当生产环境出现程序占用CPU过高的时候,该如何排查呢?

查看CPU高的进程ID

通过top命令即可查看cpu占用过高的进程ID,如下图:

1

查看CPU高的线程ID

通过ps H -eo pid,tid,%cpu | grep ${进程ID}命令即可查看cpu占用过高的线程ID,命令说明:

ps: 显示进程状态

H: 显示这台机器的所有进程

eo: 要输出的内容

命令执行效果如下:

1

通过ps命令可以看到其中的2591线程的cpu占用最高

将十进制的线程ID转成十六进制

通过printf "%x\n" ${线程ID}即可将十进制的线程ID转成十六进制,如下图:

1

通过上图得出十六进制的进程id为a1f

用jstack查看线程情况

jstack命令是用于查看Java进程、核心文件或远程调试服务器的Java线程的Java堆栈跟踪信息的,本例子可使用jstack ${进程ID} | grep ${线程ID} -A20命令来查看线程情况,其中-A20标识查看后20行数据,如下图:

1

通过上图即可查看导致CPU高的位置是CpuTestService方法的24行,查看源码如下:

1

结束

到此即可排查出导致CPU高的罪魁祸首

最后

最后分享一个快速定位CPU高的开源脚本 点击访问, 直接下载脚本点击下载

直接执行sh show-busy-java-threads ${进程ID}即可定位CPU高的位置,如下如:

1