CPU使用100%问题排查

2016年08月25日

最近在查线上问题时发现时有CPU使用达100%的情况发生, 这里使用下面这个简单的示例来说明下问题排查过程.

首先使用 top 命令, 查看耗费CPU资源的进程Id, 我这里是 19344

然后使用 top -H -p19344 查看该进程的所有线程情况(-H 是显示线程, -p 指定进程), 我这里耗费CPU资源的线程ID是 19345

最后使用 jstack -l 19344 > log.log 将进程的所有线程信息dump出来, 如果报错 Unable to open socket file: target process not responding or HotSpot VM not loaded , 则加上 -F 参数(即使用 jstack -F -l 19344 > log.log)

查看log.log中的线程信息, 通过第二步中查到的耗费CPU资源的线程 ID (可能需要装换成16进制,具体看log信息中的线程ID是10进制还是16进制), 查找该线程的栈信息 可以看到该线程主要是在JstackTest类中的第11行在耗费CPU.也就是最开始那个实例的 i++, 在耗费CPU.

最后说下我查的那个线上问题,栈信息查看为:

线程一直在 java.net.PlainSocketImpl.socketAvailable()这里耗费CPU.

查了一些博客,大概是说: Mysql服务器已经把链接断开了,而本机仍然一直在等待,未设置超时机制不停的等待.

解决方法是,在mysql连接url中增加 connectTimeOut 和 socketTimeOut 超时时间.

jdbc:mysql://xxx:6446/xxx?autoReconnect=true&connectTimeout=60000&socketTimeout=60000

查看自:传送门