linux系统故障排查(一):CPU使用率过高
一、通过top命令定位占用cpu高的进程
执行top命令得到以下结果(P按照进程负载排序):
通过上图可以明显看出进程PID2221 明显存在问题,定位到了进程id。为了更好的排查问题,下面详细介绍top命令显示的含义。
1)第一行是任务队列信息 top - 14:06:34 up 537 days, 6 min, 6 users, load average: 0.41, 0.45, 0.43
2) 第二行为进程的信息
3)第三行为cpu信息
4)第四、五行为内存信息,内容如下:
二、通过top命令定位问题进程中每个线程占用cpu情况
top -Hp 2221
查看进程PID 2221的每一个线程占用CPU情况,如图。
由上图明显可以发现,线程PID2244CPU占用率最高,接下来定位该线程的代码是否出现异常导致cpu占用过高。
三、通过jstack 命令定位问题代码
上一步发现线程PID2244占用的CPU过高,就将这个PID转换成16进制
printf “%x ” 线程PID printf “%x ” 2244
PID 2244转化成16进制为8c4。使用如下命令命令定位问题代码:
jstack pid |grep tid -A 30(pid:进程id,tid:线程id) jstack 2221 | grep 8c4 -A 30 或者 jstack 2221| grep 8c4 -C5 --color
RUNNABLE 线程运行中或I/O等待 BLOCKED 线程在等待monitor锁(synchronized关键字) TIMED_WAITING 线程在等待唤醒,但设置了时限 WAITING 线程在无限等待唤醒
线程在等待的状态。查看代码
public String testCode(){
test();
return "success";
}
public void test(){
while(true){
for(int i=0;i<10;i++){
}
}
}
while循环无法结束,一直抢占cpu,导致程序cpu使用过高,修改代码即可。
