背景
日常运维过程中,收到“应用A”突然挂起没有处理请求的告警,然后触发“存活检查”不通过,自动重启了。
问题
为什么“应用A”突然挂起?
分析
排查过程很长,走了很多弯路,这里只列出本案例有效行动:
- jstack 1 > /tmp/1.log 反复dump 出多个java线程文件进行分析。
- netstat -anp | grep CLOSE_WAIT 统计CLOSE_WAIT
发现一个规律,端口8085 CLOSE_WAIT 出现的次数与java线程文件的“"http-nio-8085-exec-7" #109 daemon prio=5 os prio=0 tid=0x00007f90ced37000 nid=0x77 in Object.wait() [0x00007f9074965000]” 次数一致
进一步分析,java出现Object.wait()是一个对象锁,让线程进入“等待状态”
行动
与开发沟通,通过检查代码没有显式声明object.wait() , 经过反复排查,最后怀疑是okhttp的bug,开发同学查阅后发现果然是bug
“https://github.com/square/okhttp/issues/7942 这个是okhttp3.8.1的版本问题,升级一下到3.14.9,”
结论
升级okhttp到3.14.9 , 经过复核后,没有在发现类似的情况。
备注
okhttp的超时间设置:
private static final int CONNECT_TIMEOUT = 10;
private static final int READ_TIMEOUT = 3;
private static final Int WRITE_TIMEOUT = 10;