一段死循环造成的服务器CUP高负载追溯
- 事故缘由:
- 线上服务器近期频繁出现某节点停止服务情况,且出问题的服务器不固定,当时检查发现磁盘被tomcat日志填满,以为是被恶意刷流量,于是删掉了日志,重启了服务解决,当第三次出现该问题时,我开始查找原因。
- 追溯步骤
-
进程号为10864
top -p 10864 -H
-
找到占用cpu最多的几个线程,分别是10867、10866、13595、13596
- jstack 10864 > stack.log,将占用cpu较多的线程号转为16进制,在stack.log中查找。
10867、10866两线程为gc线程
进一步找,发现线程13595在为RUNABLE状态,并且在调用数据库,根据堆栈信息,找到了父子关系查询部分自己为自己的父级情况下造成死循环的代码。