记一次定位服务超时分析过程 -------- jstack --------logback 的 坑
线上服务零点会有超时的情况,持续时间为半分钟左右
通过系统性能工具 sar,vmstat,top,dstat以及现有的运维监控平台未发现明显的性能瓶颈
cpu,io,tcp都没有异常,过程日志异常,系统message日志也正常,也不是swap问题
因为有30台机器,其中有10台会有超时情况,硬件配置运维人员统计配置,理论上不会有差异。
打开文件句柄数等等都一样。
前提 :
同样的工程,相差不大访问量
开始怀疑是机器的问题,但10台机器都有问题有点不太可能
查看耗时日志及代码,发现都有熔断处理,不是耗时的代码块,而是常用的代码
怀疑是不是有 “锁竞争!”
零点前后定时dump线程
jstack -l <pid> 注意:jstack 会使jvm进入safepoint,会导致STW,所以正常情况下不要dump线程
查看logback源码发现切分文件时,rollover()时也是有锁
logback版本为 <1.1.2>,网上可以搜搜logback,有异步方式据说可以解决这种问题,但没有尝试,直接换log4j2,超时情况消失。
后来分析日志量,发现30台机器基本差不多,但是这10台确实是logback的问题,可能更服务器系统 或者硬件有关系,文件句柄的开关等,有待研究…