原创

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://jieniyimiao.blog.csdn.net/article/details/98845686

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

文章最后发布于: 2019-08-08 09:32:13
展开阅读全文
0 个人打赏
私信求帮助

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 精致技术 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览