把 log-driver 换成 fluentd 后,接口 RT 从 20 毫秒涨到 2 秒,docker info 里日志驱动队列一直是满的。应用侧没有任何报错。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,日志驱动是同步写的,fluentd 收得慢时写 stdout 会阻塞,进程跟着卡在 write 上。缓冲没有上限时堆积会一直涨,反压直接传到业务线程。

「日志驱动阻塞」这类改动最怕改一半,回滚脚本先准备好,再动生产。报错里带路径的,先去看那个路径在不在、权限对不对。

docker info --format '{{.LoggingDriver}}'
docker run -d --log-driver=fluentd --log-opt fluentd-buffer-limit=8m api:1.0
docker logs --tail=20 api

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

具体做法是,先确认卡顿和日志量同步出现 把业务问题和驱动问题分开;给驱动设置 buffer limit 和重试上限 让丢弃可预期;日志级别降一档 把每请求多行的输出合并;实在扛不住就换成异步采集 别让应用等日志落盘。

最后用这个标准收尾,接口 RT 回到 20 毫秒级别,队列长度不再持续增长。

作者 9823189