进学阁

业精于勤荒于嬉,行成于思毁于随

0%

Cpu使用率飙升如何排查?

第一步,使用 top 找到占用 CPU 最高的 Java 进程

1. 监控cpu运行状,显示进程运行信息列表

<font style="color:rgb(47, 48, 52);background-color:rgb(240, 240, 240);">top -c</font>

2. 按CPU使用率排序,键入大写的P

P

第二步,用 top -Hp 命令查看占用 CPU 最高的线程

上一步用 top命令找到了那个 Java 进程。那一个进程中有那么多线程,不可能所有线程都一直占着 CPU 不放,这一步要做的就是揪出这个罪魁祸首,当然有可能不止一个。

执行<font style="color:rgb(47, 48, 52);background-color:rgb(240, 240, 240);">top -Hp pid</font> 命令,pid 就是前面的 Java 进程,我这个例子中就是 16738 ,完整命令为:

<font style="color:rgb(47, 48, 52);background-color:rgb(240, 240, 240);">top -Hp 16738</font> ,然后键入P (大写p),线程按照CPU使用率排序

执行之后的效果如下

查到占用CPU最高的那个线程 PID 为 16756

第三步,查看堆栈信息,定位对应代码

通过printf命令将其转化成16进制,之所以需要转化为16进制,是因为堆栈里,线程id是用16进制表示的。(我当时就是忘记这个命令了~)

1
2
[root@review-dev ~]# printf "%x\n" 16756
4174

得到16进制的线程ID为4174。

通过jstack命令查看堆栈信息

1
jstack 16738 | grep '0x4174' -C10 --color

如上图,找到了耗CPU高的线程对应的线程名称“HighCpu”,以及看到了该线程正在执行代码的堆栈。

最后,根据堆栈里的信息,定位到对应死循环代码,搞定。