java项目CPU占比异常排查

查找问题

使用top命令查找异常进程

使用命令排查CPU出问题的可能,关注的数据是右上方的Load Average和CPU占用排行;

1
top

Load Average有三个数值代表了一分钟、五分钟、十五分钟内的负载指标,这个指标在空闲时间是不到1的,
正常情况下也在5以下,超过5则代表以及不堪负重,但实际上笔者在生产环境中见过13~16的情况(阿里的金融云),
由于挂载了一些后台项目,数据查询计算导出较多,导致整体的负载偏高,但是未能影响其他项目在生产环境的表现,
所以即使数据异常也不能确定出现问题。

%CPU以及%MEM,查看有没有明显异常的占比,通过按键P进行CPU占比从高到低排序显示,按键M进行内存占比从高到低排序显示。
主要查看CPU,但是因为内存占用的切换比较方便,所以到这一步可以顺便看下。

当查询到明显异常的时候,记录对应的PID;

查询异常进程里的异常线程

使用

1
top -Hp pid

查询该进程下线程的CPU使用情况,同样是通过按键P进行CPU占比从高到低排序显示,当查询到明显异常的时候,记录对应的线程PID;

导出栈快照

根据获取到的异常进程PID,使用下面命令导出当前JVM的信息

1
jstack PID >PID.txt

转换异常线程

根据获取到的异常线程PID,使用下面命令将线程编号转化为16进制,方便在栈信息中定位

1
printf ‘%x\n’ pid

定位

使用下面的命令,定位到对应的线程以及该线程详细栈信息,并从中获取具体代码类名以及代码行数。

1
grep 线程16进制编号 PID.txt

重复操作

由于程序运行不可控性,单次操作并不能一定准确命中,需要从第二步查找异常线程开始重复执行,如果多次操作都指向同一段代码则表示基本可以确定问题来源。