今天面试的时候被面试官问到在Linux系统中,CPU占用率过高该如何排查和解决,可我并没有答上来……因为自己确实没有去了解过,也没有遇到过这个情况。
不过在此之前也听别人讨论过这个问题,这应该是开发运维中常见的一个典型故障吧,因此查阅了相关资料,在自己的云服务器上操作了一下,有了一点浅显的了解。
第一步:使用top命令,然后按下shift+p,使进程按CPU占有率进行排序,从而找到占用CPU过高的进程PID;
第二步:使用ps -mp pid -o THREAD,tid,time | sort -rn 获取线程信息,并找到占用CPU最高的线程TID ;
第三步:使用printf “%x\n” [线程id] 将需要的线程TID转换为16进制格式;
第四步:使用jstack pid |grep tid -A 30 [线程id的16进制] 打印线程的堆栈信息,并根据堆栈信息定位和排查故障具体原因。
PS:需要注意的是,直接调用jstack是会报错的,jstack文件存在于java_home的bin目录下,因此,需要在该目录下执行jstack才可以。
另外,似乎也看到有些文章提到,手动的方式定位太慢,有大神已经写好了一个可以自动排查故障的脚本,应该会使排查过程变得更快吧~