记录一次线上tomcat失去响应问题处理
问题描述:网站失去响应,进程还在。
首先判断是否出现频繁报错,排除运行时异常导致的失败。
使用jps 找出对应的进程pid
使用top -Hp [pid]命令查看当前进程下的所有线程信息。
查找cpu负载最高的线程 如上图 load average代表负载系数(1分钟,5分钟,15分钟)。负载系数<=1*cpu核数属于正常范围。之前进程总占用一直是200%。
通过 jstack -l [pid] | >1.txt打印栈信息找出占用cpu最大的线程对应的方法。
将线程pid转16进制,找出Thead.state:BLOCKED 的线程进行优化。
这里我们使用了任务队列存取数据,对线程内部while(true)进行wait和notify操作(注意:sleep不会释放cpu的使用权)等一系列优化后cpu稳定下来。
运行程序后经过3个小时tomcat再次失去响应。统计tcp连接信息发现出现大量的close_wait。想起之前给tomcat添加的线程池初始化参数(minSpareThreads)过大,tomcat线程难以回收导致,尝试修改后tcp连接正常。
ps:记录于此,以供参考。