CPU高问题定位排查
当生产环境出现程序占用CPU过高的时候,该如何排查呢?
查看CPU高的进程ID
通过top
命令即可查看cpu占用过高的进程ID,如下图:
查看CPU高的线程ID
通过ps H -eo pid,tid,%cpu | grep ${进程ID}
命令即可查看cpu占用过高的线程ID,命令说明:
ps: 显示进程状态
H: 显示这台机器的所有进程
eo: 要输出的内容
命令执行效果如下:
通过ps命令可以看到其中的2591线程的cpu占用最高
将十进制的线程ID转成十六进制
通过printf "%x\n" ${线程ID}
即可将十进制的线程ID转成十六进制,如下图:
通过上图得出十六进制的进程id为a1f
用jstack查看线程情况
jstack命令是用于查看Java进程、核心文件或远程调试服务器的Java线程的Java堆栈跟踪信息的,本例子可使用jstack ${进程ID} | grep ${线程ID} -A20
命令来查看线程情况,其中-A20标识查看后20行数据,如下图:
通过上图即可查看导致CPU高的位置是CpuTestService方法的24行,查看源码如下:
结束
到此即可排查出导致CPU高的罪魁祸首
最后
最后分享一个快速定位CPU高的开源脚本 点击访问, 直接下载脚本点击下载
直接执行
sh show-busy-java-threads ${进程ID}
即可定位CPU高的位置,如下如: