大量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关键字,服务恢复正常。

发布了418 篇原创文章 · 获赞 745 · 访问量 126万+

猜你喜欢

转载自blog.csdn.net/u013467442/article/details/98845686
今日推荐