TCP连接出现大量CLOSE_WAIT不回收的问题排查

背景

日常运维过程中,收到“应用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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值