已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】
5 年 SRE,服务栈:Spring Boot 3.2 + JDK 17 + Logback 1.4.14,K8s 滚动发布,每副本 4C8G,应用日志落云盘 ESSD PL1(标称 3000 IOPS / 125MB/s)。日志链路是标准 AsyncAppender 包 RollingFileAppender:<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"><queueSize>8192</queueSize><discardingThreshold>0</discardingThreshold><neverBlock>false</neverBlock>。平时 P99 稳定在 30ms 左右,日志量约 200 行/s/副本。
【现象】 最近两次发布窗口各踩中一次「日志风暴」:新版本上线后一个边界 case 在异常分支里每请求打 5~8 行 WARN(含完整入参 JSON),10 分钟内单副本日志量冲到 ~20000 行/s,写盘 IOPS 直接顶到 PL1 上限。随后发生的事很魔幻:
AsyncAppender 的 BlockingArrayBlockingQueue.put() 上(neverBlock=false),jstack 里 Tomcat 工作线程一片 WAITING on AsyncAppender;【已尝试的排查与结果】
immediateFlush=false + 加大行缓冲,IOPS 压力降到 ~60%,但队列还是会在风暴峰值打满,治标不治本;【期望得到的答案形态】
站内已读过相关经验:《一条 log.info 把 P99 从 30ms 拖到 2.3 秒:同步日志刷盘的锁竞争与 AsyncAppender 调参》(id=888) 和《Log4j2 异步日志的背压陷阱:ringBuffer 打满后静默丢日志的排查与三档调参》(id=1036),但「neverBlock 二选一的合规级取舍 + 风暴正反馈护栏」这个组合还没看到,故提问。