同事打电话说服务器崩溃了
无法访问、卡死,但是硬件没有问题,cpu在低位,内存、网络也都在正常范围内,Tomcat没有挂掉
回家、打印线程日志,重启系统,暂时先用着,问题其实还在
---> 打印JVM日志命令 (jstack -l $pid > jstack.log)
开始分析线程日志
---> 统计命令(cat jstack.log | grep "java.lang.Thread.State" | sort -nr | uniq -c)
发现大量被挂起的线程
一般出现 TIMED_WAITING(parking)是因为调用第三方资源等待响应,导致的线程被挂起
比如:Http请求、RPC请求、中间件(redis、memcached、MQ)长时间等待,占用线程,导致系统卡死无法访问
结合当时正在直播课程、首先怀疑的就是HTTP
然而并没有相关的痕迹,调用链里没有出现http相关的
通过搜索发现、问题集中在获取课程小结,网站配置(业务相关)
·
导致挂起的位置,基本上都在是连接memcached
于是就怀疑是memcached,但是也不对,如果是memcached长时间无响应,会提示拒绝连接。
继续往上看
druid?
这段报错其实从眼皮底下溜过去很多次,感觉不太可能是druid,不够特殊吧,所有的数据库查询,底端调用肯定是druid连接池,
嗯。。。还是检查一下吧
赫然发现,
maxPoolSize=10
好像找到原因了,验证一下
关掉cc防御
10000个请求发过去
看一下服务器线程
挂起了3200
改掉 maxPoolSize =2000
绝大多数都在RUNNABLE了
看一下服务器,内存CPU也上来了
过一阵在看看
又500多个线程被挂起
但是这是另外一件事情了,服务器承载能力的问题了
结束