记一次线上CPU飙高异常排查和解决

2021/04/01 blog

最近接手一位离职同事的工作,

1. 找出CPU飙高的进程

使用TOP命令查看CPU飙高的进程

top

通过上图可以看到PID=2132的java进程CPU使用177.2%

2. 查看进程的哪个线程占用CPU比较高

通过第一步我们找到占用CPU较高的进程,第二步就是要找出这个进程下哪些线程占用CPU较高。

使用命令ps -mp {PID} -o THREAD,tid,time查看指定进程下所有线程活动情况

thread

通过上图发现线程2535和2558分别占用94.0和73.9,并且运行时间都非常长

3. 查看线程的内存信息

我们拿到了进程和线程信息,接下来就可以通过jstack命令来查看内存信息,查询之前需要先将线程号转为16进制,如2535的16进制值是0x9e7,那就需要拿这个0x9e7去grep一下 jstack 2132|grep 0x9e7 -A 30 -F

jstack

通过jstack命令已经非常清晰的发现了问题,翻代码

source

这里while(true)无限旋转调用delayQueue.take方法

Search

    Table of Contents