vlambda博客
学习文章列表

记录一次线上tomcat失去响应问题处理

问题描述:网站失去响应,进程还在。

  1. 首先判断是否出现频繁报错,排除运行时异常导致的失败。

  2. 使用jps 找出对应的进程pid

  3. 使用top -Hp [pid]命令查看当前进程下的所有线程信息。

  4. 查找cpu负载最高的线程 如上图 load average代表负载系数(1分钟,5分钟,15分钟)。负载系数<=1*cpu核数属于正常范围。之前进程总占用一直是200%。

  5. 通过 jstack -l [pid] | >1.txt打印栈信息找出占用cpu最大的线程对应的方法。

  6. 将线程pid转16进制,找出Thead.state:BLOCKED 的线程进行优化。

  7. 这里我们使用了任务队列存取数据,对线程内部while(true)进行wait和notify操作(注意:sleep不会释放cpu的使用权)等一系列优化后cpu稳定下来。

  8. 运行程序后经过3个小时tomcat再次失去响应。统计tcp连接信息发现出现大量的close_wait。想起之前给tomcat添加的线程池初始化参数(minSpareThreads)过大,tomcat线程难以回收导致,尝试修改后tcp连接正常。


ps:记录于此,以供参考。