Doris->Zuul Oom
引言 在开发者的潜意识里,LIMIT 关键字就是 SQL 查询的安全带。 我们通常认为,只要加了 LIMIT,无论表多大,数据库都只会吐出少量数据,内存就是安全的。 然而,最近的一次线上 OOM(内存溢出)事故狠狠地打破了这个认知。 一个看似人畜无害的 UNION ALL + LIMIT 组合,竟然避开了doris 的优化器的下推机制,引发了生产环境的连锁崩溃。 本文记录了这次在受限环境下,如何抽丝剥茧定位 Bug 的过程。 一、高峰期的“幽灵”崩溃 环境背景: 部署方式 Kubernetes 网关: Springboot + zuul 服务: Spring Boot + MyBatis db: Apache Doris 报错服务: 网关 java版本: jdk8, g1 权限: 无root权限,只能查看基本日志 网关pod报错关键日志 netflix.zuul.exception.ZuulException: Filter threw Exception postModifyResponseBodyFilter.run ... Caused by: java.lang.OutOfMemoryError: Java heap space 报错日志关键字: oom 二、 真相误判:GC 的烟雾弹 面对 OOM,作为 Java 开发者的第一直觉往往是:“是不是流量太大,垃圾回收(GC)跟不上了?” 查看存活期间的 JVM 监控,发现 Old Gen(老年代)增长迅速。当时的判断是:CMS 回收器产生内存碎片,导致大对象分配失败。 ...