记录一次由于logback死锁引起的生产事故

问题表象:

  • 某provider服务8个容器中的1个出现假死:日志突然中断打印,连接数突然增加。
  • 本机房的springboot admin经常报警:provider down。但是另一个机房一切正常。
  • 由于各种原因,故障容器被销毁,无法查看应用日志信息。
  • 后续几天问题没复现。

分析过程

  • 网络排查:从springboot admin 长ping provider,一切正常。
  • 磁盘IO:同样没发现问题。

基本诊断是应用问题:

  • 先看了服务之间调用的超时时间,发现开发人员竟然没有设置,于是排查是不是调用后端服务超时,连接不释放导致。查看正常容器日志,高峰期最大不超过20个线程。所以应该不是这个原因。但是要求开发后续要修改:必须设置超时时间。
  • 查看代码和依赖包里是否有类似exit的代码导致tomcat假死,没有发现。
  • JVM堆,tomcat配置参数OK,运行期占用较小,GC平稳。
  • 非堆,运行平稳,代码中也没有new instance,ClassLoader等关键字。

诊断过程中,突然间另一个机房的容器出现了线程数暴涨的问题。

记录一次由于logback死锁引起的生产事故_第1张图片
线程数暴涨.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已经解决。升级版本继续观察吧。

你可能感兴趣的:(记录一次由于logback死锁引起的生产事故)