问题表象:
- 某provider服务8个容器中的1个出现假死:日志突然中断打印,连接数突然增加。
- 本机房的springboot admin经常报警:provider down。但是另一个机房一切正常。
- 由于各种原因,故障容器被销毁,无法查看应用日志信息。
- 后续几天问题没复现。
分析过程
- 网络排查:从springboot admin 长ping provider,一切正常。
- 磁盘IO:同样没发现问题。
基本诊断是应用问题:
- 先看了服务之间调用的超时时间,发现开发人员竟然没有设置,于是排查是不是调用后端服务超时,连接不释放导致。查看正常容器日志,高峰期最大不超过20个线程。所以应该不是这个原因。但是要求开发后续要修改:必须设置超时时间。
- 查看代码和依赖包里是否有类似exit的代码导致tomcat假死,没有发现。
- JVM堆,tomcat配置参数OK,运行期占用较小,GC平稳。
- 非堆,运行平稳,代码中也没有new instance,ClassLoader等关键字。
诊断过程中,突然间另一个机房的容器出现了线程数暴涨的问题。
线程数暴涨.jpg马上登陆容器,取dump文件,打开后发现大量死锁线程:
"http-nio-8080-exec-270" daemon prio=5 tid=59263 WAITING
at sun.misc.Unsafe.park(Native Method)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
Local Variable: java.util.concurrent.locks.AbstractQueuedSynchronizer$Node#49
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
at java.util.concurrent.locks.ReentrantLock$NonfairSync.lock(ReentrantLock.java:209)
at java.util.concurrent.locks.ReentrantLock.lock(ReentrantLock.java:285)
at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:210)
at ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:100)
at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:84)
at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51)
at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:270)
at ch.qos.logback.classic.Logger.callAppenders(Logger.java:257)
Local Variable: ch.qos.logback.classic.spi.LoggingEvent#170
at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:421)
at ch.qos.logback.classic.Logger.filterAndLog_1(Logger.java:398)
at ch.qos.logback.classic.Logger.info(Logger.java:583)
再查看官网的:https://jira.qos.ch/browse/LOGBACK-1378
发现
logback1.1.11有死锁问题。作者回复已在
logback1.2.x已经解决。升级版本继续观察吧。
网友评论