news 2026/9/2 21:16:59

Apache Doris 4.0.8 内存调优(第 7 篇):一次看似安全的降内存,为什么制造更多小文件

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Apache Doris 4.0.8 内存调优(第 7 篇):一次看似安全的降内存,为什么制造更多小文件

BE 因导入内存过高接近 OOM,运维把 Load 内存比例砍半。进程稳定了两小时,随后小文件增多、Compaction Score 上涨、查询变慢,最终又出现导入拒绝。

内存没有消失,它被换成了更频繁的 Flush 和更长的后台合并账单。

降低 MemTable 内存是止血动作,不是免费优化。Flush 提前发生时,内存压力会转化为文件数量、写放大和 Compaction 压力。

三种动作解决的是三个不同问题

下面的对比固定总写入量和目标吞吐,只改变内存阈值、并发与批次形态。

动作直接效果隐藏代价适用条件
降低 Load 内存阈值更早触发 Flush,降低峰值更多小 Segment 和 RowsetOOM 紧急止血
降低导入并发同时存在的 MemTable 更少吞吐下降、上游积压多任务并发导致峰值
增大有效批次每次 Flush 数据更充实可见延迟与客户端缓存增加高频小批造成碎片

只调内存阈值,相当于把内存不足改写成存储引擎持续还债。

写入内存的关键链路

Load Memory Analysis 将导入内存分为执行 Fragment 和 Channel 写入两部分。数据进入 Channel 后构建 MemTable,随后由 Delta Writer 压缩并落盘。

Load Fragment 读取与转换 → Tablet Channel 分发 → 每个活跃 Tablet 构建 MemTable → 达到阈值或全局压力后 Flush → Segment/Rowset 落盘 → 后台 Compaction 合并

一次导入同时触达大量分区和 Bucket,会创建更多活跃 MemTable。即使单表数据量不大,宽表、并发任务和分散 Tablet 也能把总内存推高。

先证明内存究竟在哪

BE Web 页面/mem_tracker?type=global中,AllMemTableMemory代表 MemTable 构建与 Flush 使用的总内存。/mem_tracker?type=load可继续定位到具体 LoadID 和 TabletID。

判断分支很简单:

  • AllMemTableMemory高:查活跃 MemTable、导入并发、批次和 Flush;
  • AllMemTableMemory低但 Load Tracker 高:查解析、表达式、排序或其他 Fragment 内存;
  • 进程 RSS 高但 Tracker 不高:不要盲调 Load 参数,继续查缓存和非跟踪内存。

没有这一步,降低 Load 比例可能完全没有命中真正的内存来源。

用一个实验看见压力转移

固定同一份数据、同一表和相同总吞吐,只改变内存阈值与并发。每组运行至少覆盖一个完整 Compaction 周期,记录:

指标预期观察
AllMemTableMemory峰值降阈值后下降
Flush 次数与平均 Flush 大小次数上升、单次变小
Segment/Rowset 增速小文件增多
Compaction Score延迟上涨则说明债务累积
导入可见延迟与查询 P99判断压力是否转移给前台

如果只看到内存下降就宣布成功,测试实际上只完成了一半。

真正有效的处理顺序

立即止血

降低导入并发或暂停最重任务,必要时小幅降低 Load 内存阈值。动作目标是避免 BE 被 OOM Killer 终止,不追求此时吞吐最大化。

修正形态

  • 合并小批次,减少每分钟事务数;
  • 避免单批同时打散到过多分区和 Tablet;
  • 宽表保持 Vertical Compaction,降低后台合并内存;
  • 观察 Flush 线程是否跟不上,而不是只调write_buffer_size
  • 将导入与重查询错峰或隔离资源。

验证闭环

恢复目标吞吐后,要求 BE 内存有余量、Flush 平均大小稳定、Compaction Score 不呈单调上涨、查询 P99 不退化。任何一个不成立,都只是换了一种事故。

源码值得追的是触发 Flush 的三个入口

固定 Doris4.0.8后,源码只追:单 MemTable 达到写缓冲阈值、全局 Load 内存压力触发 Hook Flush、Flush 线程池把内存结构写成 Segment。再向后接 Compaction 输入 Rowset 数,才能看到调小阈值的完整副作用。

4.0 系列还引入了更自适应的写缓冲和动态 Flush 能力,但自动机制不能修复无限并发、极端小批和热点 Tablet。

内存参数决定何时落盘,批次与并发决定落盘多少次。只改前者,通常是在用未来的 Compaction 换眼前的安全。

官方资料

  • Load Memory Analysis
  • BE Configuration
  • Vertical Compaction
  • Data Compaction
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/2 21:14:28

零命令行操作!Windows 跑通 OpenClaw,办公自动化工具搭建教程

📖 前言 本文面向 Windows 系统用户,系统梳理 OpenClaw 3.0.2 版本的标准化部署流程。整套安装过程完全依托可视化向导界面完成,全程无需输入任何命令行指令,即便是缺乏技术基础的用户,也能顺利完成整套环境部署。文中…

作者头像 李华
网站建设 2026/9/2 21:12:37

Codex CLI 实战指南:安装配置、接入 DeepSeek 与高频报错排查

“Codex 里程碑庆祝推迟至明日”这个标题,初看像是一条活动通知。但如果我们把视线放到开发者社区,会发现最近 Codex 相关讨论里最热闹的并不是“里程碑”本身,而是一堆非常具体的报错:unable to locate the codex cli binary、cc…

作者头像 李华
网站建设 2026/9/2 21:11:29

纯HTML手机号码定位:归属地查询与地图展示实战解析

简介:这是一份基于HTML的手机号码定位前端源码,面向Web前端初学者或对定位功能感兴趣的开发者,用于演示通过浏览器接口获取手机归属地或定位信息的基础实现。包体包含HTML页面、CSS样式、JavaScript逻辑及README说明文档,共4个文件…

作者头像 李华
网站建设 2026/9/2 21:07:27

Codex环境体检:CLI安装、DeepSeek接入与高频报错排查

很多开发者今天早上打开社区,第一眼看到的就是“Codex 里程碑庆祝推迟至明日”的消息。有人以为是版本号跳票,有人以为是运营活动改期,但翻了一圈 Codex 官方动态和相关热搜词之后会发现,真正被反复搜索的其实是另一批问题&#x…

作者头像 李华