大量CLOSE_WAIT导致服务不可用的原因解析

1.现象

商旅通服务没有宕机,服务CPU,磁盘,内存,网络均正常,但就是一直不提供服务。

2.定位问题

出现服务不可用时,最重要的是要定位出原因,出于经验考虑,当服务不可用时,优先考虑服务本身的问题。最直接的方法就是查看服务不可用状态下的线程状态。已知商旅通tomcat线程池maxThrad是200个,注意这个参数,这是排查问题重要的参考指标。

1.查看商旅线程总数(210个)

jstack -l pid |grep java.lang.Thread.State|wc -l

2.查看商旅线程BLOCKED线程数(198个)

jstack -l pid |grep "java.lang.Thread.State: BLOCKED"|wc -l

3.查看商旅线程WAITING状态线程数(5个)

jstack -l pid |grep "java.lang.Thread.State: WAITING"|wc -l

通过比对不同状态下的线程个数,发现被BLOCKED住的线程数高达198个,考虑到tomcat线程数是200个,所以推断商旅服务的线程都被BLOCKED住了,通过具体的线程栈的打印,发现都在等待同一把锁,而占用此锁的线程做了耗时操作,导致锁迟迟无法释放,最终的结果就是,所有线程被BLOCKED住,同时也导致了出现了大量CLOSE_WAIT连接状态,也导致了商旅服务一直无法提供服务。

3.解决方案

通过去掉冗余的synchronized关键字,服务恢复正常。

展开阅读全文
©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值