做Doris运维或开发的同学,多少都踩过内存的坑:BE突然OOM、导入时内存暴涨、查询报“内存不足”…明明配置看着没问题,问题却反复出现?
今天这份指南,从内存分类、监控方法,到核心原理、常见问题解决,全流程覆盖,建议收藏备用!
要解决内存问题,先得明确Doris的内存分类和关键配置,避免盲目调参。
Doris的内存消耗主要分散在7个场景,不同场景的异常对应不同问题:
标识 | 名称 | 核心说明 |
|---|---|---|
process | BE总使用内存 | 整个BE进程的内存总占用 |
query_pool | 查询内存 | 分执行层(如Join、聚合)和存储层(如读数据) |
load | 导入内存 | 核心是MemTable(导入数据暂存区),满了会刷盘 |
table_meta | 元数据内存 | 存储Schema、Tablet、RowSet、列等元信息,版本多会膨胀 |
compaction | 多版本合并内存 | 数据导入后多版本合并用的内存 |
snaphost | 快照内存 | 主要用于副本克隆(clone),通常占用很少 |
column_pool | 列缓存 | 加速列对象的申请与释放,执行线程会保留部分缓存 |
page_cache | BE自有PageCahe | 默认关闭,手动开启后缓存热点数据 |
内存问题大多和配置不当有关,这两类配置是核心(建议保存备用):
配置项 | 默认值 | 核心作用 |
|---|---|---|
vector_chunk_size | 4096 | Chunk分配器的预留字节限制 |
tc_use_memory_min | 10737418240(10G) | Tcmalloc最小保留内存,超此值,Doris才把空闲内存返还系统 |
mem_limit | 80% | BE可使用的机器总内存比例,混合部署推荐修改,防止OOM |
disable_storage_page_cache | true | 是否关闭自有PageCache(默认关闭) |
write_buffer_size | 104857600(100M) | 单个MemTable内存上限,超了触发刷盘 |
load_process_max_memory_limit_bytes | 107374182400(100G) | 导入总内存上限,与百分比取最小值生效 |
load_process_max_memory_limit_percent | 60% | 导入内存占BE总内存的比例,min(mem_limit * load_process_max_memory_limit_percent, load_process_max_memory_limit_bytes) |
load_mem_limit | 2147483648(2G) | 单个导入实例接收端内存上限,到达这个限制,会触发刷盘逻辑,需配合Session变量load_mem_limit修改才能生效 |
变量名 | 默认值 | 核心作用 |
|---|---|---|
exec_mem_limit | 2147483648(2G) | 单个查询实例instance的内存限制 |
load_mem_limit | 0 | 单个导入任务内存限制,0时复用exec_mem_limit |
监控是解决内存问题的前提,5种方法覆盖“宏观统计”到“堆栈分析”,按需选用:

http://BE_IP:BE_WEB_PORT/mem_trackerhttp://BE_IP:BE_WEB_PORT/memzBytes in use by application:实际被应用使用的内存(最关键)Actual memory used:物理+交换分区的实际占用curl -XGET http://127.0.0.1:BE_WEB_PORT/varz | grep 'mem'操作方式:生成火焰图分析
pprof --svg http://be_host:be_webport/pprof/growth >mem.svg
用途:查看内存增长最快的函数调用栈,定位内存泄漏点
操作步骤:
export HEAPPROFILE=/tmp/doris_be.hprof
./bin/start_be.sh --daemon
pprof --svg lib/doris_be /tmp/doris_be.hprof.0012.heap > heap.svg
unset HEAPPROFILE 并重启BE优势:最详细的内存使用堆栈,适合疑难内存问题
内存问题不是偶然的,这3个场景是消耗内存的“重灾区”,理解原理才能精准解决:

write_buffer_size或load_mem_limit触发刷盘,刷盘不及时会导致内存堆积
这部分是核心干货,覆盖运维中最常遇到的内存问题,按“问题场景→排查步骤→解决方法”整理:
doris_fe_tablet_max_compaction_score > 100disable_auto_compaction=true并重启BEINSERT INTO 新表 SELECT FROM 老表(规避历史版本问题)SHOW TABLET FROM 表名 → 查看Overlapping Segment数(建议≤100) 解决:① 增加分桶数 ② 缩小分区粒度(如月→天) ③ 调大write_buffer_size(并行导入少时用)SHOW TABLET FROM 表名 LIMIT 1 看VersionCount ② 访问http://BE_IP:8040/api/compaction/show?tablet_id=XXX&schema_hash=XXX看未合并版本 解决:降低导入频率(如高频StreamLoad尽可能增大攒批)SHOW TABLETS FROM 表名 看各Tablet大小差异,数据多的Tablet中Segment数比较多,导致第一次Compaction消耗大量内存。 解决:重新建表,选择更均匀的分桶列现象:导入时load和column_pool内存暴涨
解决:设置Session变量降低并行度
set parallel_fragment_exec_instance_num=xxx;
问题原因 | 解决方法 |
|---|---|
导入频率过高(版本堆积) | 减少RoutineLoad/Flink Load频率,攒批导入 |
聚合表导入产生大量小文件 | 调大write_buffer_size,减少小文件数量 |
无序导入写多Tablet | 优化导入数据顺序,避免同时写多个Tablet |
问题原因 | 解决方法 |
|---|---|
大表广播Join | 禁用广播:set enable_broadcast_join=false,改用Shuffle Join |
左右表顺序搞反 | 调整SQL,将小表作为右表(构建哈希表) |
右表列过多 | 只查询必要列,避免全列构建哈希表 |
disable_storage_page_cache=true并重启BEmem_limit=分配给BE的内存比例(如50%) ② 不要用cgroup限制(无效)check_consistency_worker_count=1)check_consistency_worker_count=0并重启BE,关闭检查你在Doris运维中遇到过哪些奇葩的内存问题?评论区分享你的踩坑经历,一起避坑~
按照上述方案无法解决可以加我微信或者联系社区同学辅助解决!
往期推荐
Apache Doris 湖仓一体:打破数据边界,解锁实时分析的终极答案
Doris vs ClickHouse 企业级实时分析引擎怎么选?
完
●
数据极客圈子介绍
●
圈子1
Apache Doris社区是目前国内最活跃的开源社区(之一)。Apache Doris(Apache 顶级项目) 聚集了世界全国各地的用户与开发人员,致力于打造一个内容完整、持续成长的互联网开发者学习生态圈!
如果您对Apache Doris感兴趣,可以通过以下入口访问官方网站、社区论坛、GitHub和dev邮件组:
💡官网文档:https://doris.apache.org
💡社区论坛:https://ask.selectdb.com
💡GitHub:https://github.com/apache/doris
💡dev邮件组:dev@doris.apache.org
可以加作者微信(Faith_xzc)直接进Doris官方社区群
圈子2
PowerData是由一群数据从业人员,因为热爱凝聚在一起,以开源精神为基础,组成的数据开源社区。
社区群内会定期组织模拟面试、线上分享、行业研讨、线下Meetup、城市聚会、求职内推等活动,同时在社区群内你可以进行技术讨论、问题请教,结识更多志同道合的数据朋友。
社区整理了一份每日一题汇总及社区分享PPT,内容涵盖大数据组件、编程语言、数据结构与算法、企业真实面试题等各个领域,帮助您提升自我,成功上岸。
可以加作者微信(Faith_xzc)直接进PowrData官方社区群
叮咚✨ “数据极客圈” 向你敞开大门,走对圈子跟对人,行业大咖 “唠” 数据,实用锦囊天天有,就缺你咯!快快关注数据极客圈,共同成长!
点击上方公众号关注我们