线上问题排查:cpu100%

简单记录下排查过程

1.top找到tomcat进程

线上问题排查:cpu100%

2.假设把cpu吃满的tomcat进程pid是20172,ps -mp 20172 -o THREAD,tid,time查看线程情况,找到把cpu吃满的线程

线上问题排查:cpu100%

3.上图中的TID需要转成16进制,可以用printf  "%x\n",假设把cpu吃满的TheaddId为20174

线上问题排查:cpu100%

4.然后用jstack 20172|grep 4ece -A 30命令dump线程,20172是进程PID,4ece是16进制的TID,注意jstack需在java/bin目录下运行。

可以看到线程状态,一般有:unnable(正在运行)、waiting for monitor(主动等待)、waiting for monitor entry(死锁)

死锁需要额外注意,由于线程是动态变化的,可以每隔30秒dump一次。

但如果是线上问题,需要迅速解决问题,最直接的就是kill重启,这时需要先记录线程堆栈日志,恢复线上生产后再查找问题。可以先记录CPU100%的TID,再使用jstack pid > 20180919.log导出堆栈日志,后续再根据线程TID查找问题点,注意这里的TID也是16进制的。

线上问题排查:cpu100%