记一次线上服务假死问题处理
记一次线上服务假死问题处理
首先 在服务器上下载arthas
官网
https://arthas.aliyun.com/doc/download.html
下载完成arthas-boot.jar
启动arthas
java -jar arthas-boot.jar
选择要分析的服务
1.首先我通过
dashboard
命令 观察内存gc情况和内存使用情况
结果 老年代 内存充足(可用4g 已用1g) gc时间也不长 (8次老年代gc 3000ms)
排除内存问题
2.thread命令
查看阻塞其他线程的线程
thread -b
结果显示没有 (正常)
然后查看所有线程
thread -all
结果显示有大量进程处于 WAITING 状态
WAITING 状态的线程:
为等待状态 并且不会释放的状态
因为有线程池 有这样的线程也正常 经测试 线程池中等待任务的线程也是这个状态
然后发现其中 有名字开头http-0.0.0.0的WAITING状态的线程
问题就在这
我找了几个线程id
使用
thread 线程id
查看阻塞线程的堆栈
结果显示卡在redis获取连接池资源
然后我去查看代码里连接池配置 没有配置最大等待时间 默认值为-1 即无限等待下去
果断添加最大等待时间 maxWaitMillis 重启服务 目前服务正常 没有假死现象