doris 3.1.4 fe是否内存泄露问题(glm分析) #67197
Unanswered
wangcool
asked this question in
A - General / Q&A
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Doris FE OOM Heap Dump 分析报告
一、宕机概况
-Xmx32768m -Xms32768m(32GB堆)java.lang.OutOfMemoryError: Java heap space-Xmx49152m)fe.out 关键输出
二、MAT分析结果
使用 Eclipse Memory Analyzer (MAT) 对 29GB Heap Dump 进行自动化分析,识别出两个泄漏嫌疑点,均指向同一线程
all-fe-session-mgr-pool-0。2.1 Problem Suspect 1:String 对象堆积(17.3GB,57.64%)
java.lang.String实例,占用 17,305,670,752 字节(17.3GB,57.64%)Object[180,221,098]数组引用(1.44GB)all-fe-session-mgr-pool-0持有2.2 Problem Suspect 2:ConcurrentHashMap 膨胀(10.8GB,35.97%)
ConcurrentHashMap$Node[268,435,456](2^28 个桶)占用 10,800,711,176 字节(10.8GB,35.97%)all-fe-session-mgr-pool-0持有2.3 OOM 触发时的线程栈
2.4 MAT Top Consumers(支配树最大对象)
ConcurrentHashMap$Node[]java.lang.Thread(all-fe-session-mgr-pool-0)java.lang.String2.5 MAT Class Histogram(Top 10)
java.lang.Stringbyte[]ConcurrentHashMap$Node[]ConcurrentHashMap$Nodejava.lang.Object[]java.lang.Threadcom.sleepycat.je.tree.BINcom.sleepycat.je.tree.INcom.sleepycat.je.tree.Node[]com.sleepycat.je.tree.LN2.6 MAT 系统概览
三、根因分析
3.1 根本原因:FE Session ID 泄漏
FESessionMgr中的aliveSessionIdsConcurrentHashMap 持续累积了约 1.8 亿个 Session ID,从未被有效清理。3.2 泄漏机制详解
3.3 内存分布
3.4 清理机制失效时间线
3.5 完整事件时间线
RejectedExecutionException: queue size is full: all-fe-session-mgr-pool(8次)PUBLISH_VERSION_EXEC写BDB耗时19305ms,锁持有18.4秒Env.getAllAliveSessionIds()触发 OOMkill -9终止进程3.6 GC 日志分析
Full GC 后仅能回收几百MB,27GB为存活无法回收的泄漏对象。
四、业务负载分析
4.1 审计日志统计(8/17当天)
4.2 用户请求分布
4.3 prod_qd_ab_wxh_w 语句分布
4.4 典型业务SQL
崩溃前的主要负载为每分钟执行复杂 CTE 的 INSERT 语句:
查询特征:扫描 57M 行 / 62GB,峰值内存 752MB,CpuTimeMS 高达 329,538。
4.5 连接模式
4.6 group_commit 问题
日志中还发现 group_commit 相关的事务冲突:
五、客户端正常close能否避免OOM
结论:不能完全避免
5.1 原因一:aliveSessionIds 的清理与连接关闭是解耦的
MAT 堆栈显示泄漏发生在
FESessionMgr$FEAliveSessionHandler.run()->Env.getAllAliveSessionIds()。这是一个定期守护线程,通过跨 FE 同步来清理过期 session ID,不是在连接 close 时触发的。即使客户端正常 close 连接,session ID 仍然留在
aliveSessionIdsmap 中,等待下次定期清理。而清理机制本身已经失效了。5.2 原因二:清理机制从8月14日就已失效
线程池队列满了,清理任务被拒绝执行。同时 FE 间同步也失败:
清理线程跑不起来 -> session ID 只增不减 -> 14天累积1.8亿条目 -> OOM
5.3 原因三:prod_qd_ab_wxh_w 是最大贡献者
该用户单日执行了近10万次 TRANSACTION + 2256次 INSERT,全部来自 172.24.16.108。按14天外推,产生了大量 session。
5.4 客户端正常close的效果
5.5 根本结论
这是 Doris 3.1.4 的服务端Bug,不是单纯的客户端问题:
FESessionMgr的aliveSessionIds缺少有效的过期清理机制 — 只依赖跨 FE 定期同步,一旦同步失败就只增不减all-fe-session-mgr-pool线程池队列太小 — 高并发下队列满,清理任务被拒绝Env.getAllAliveSessionIds()实现有缺陷 — 直接new ArrayList(keySet())全量拷贝,session 数量大时必然 OOM即使3个用户全部正常close,只要清理机制失效,session ID仍会累积到OOM。 正常close只能减缓累积速度,不能根本解决问题。
我的问题是,目前Doris3.1.4 fe节点是否发现类似内存泄露反馈?
All reactions