内存控制概述
我来为您搜索关于 Doris 内存控制方法的最新资料。 根据 Apache Doris 官方文档,以下是 Doris 内存控制方法的完整指南: ## 一、BE 进程级内存控制 ### 1. 总内存限制(mem_limit) - **配置项**: `mem_limit` - **作用**: 限制 BE 进程使用服务器最大内存的百分比,防止 BE 挤占过多机器内存 - **默认值**: 90% - **说明**: 必须大于 0,超过 100% 时自动默认为 100% ```properties # be.conf mem_limit=90% ``` ### 2. 内存模式(memory_mode) - **配置项**: `memory_mode` - **作用**: 控制 TCMalloc 的内存回收策略 - **可选值**: - `performance`(默认): 内存使用超过 `mem_limit` 的 90% 时释放 TCMalloc cache - `compact`: 内存使用超过 `mem_limit` 的 50% 时释放 TCMalloc cache ### 3. 系统可用内存水位线 - **配置项**: `max_sys_mem_available_low_water_mark_bytes` - **默认值**: 1.6GB (1717986918 bytes) - **实际水位线**: `min(1.6G, MemTotal * 10%)` - **作用**: 避免在大内存机器(>16GB)上浪费过多内存。调大该值会为 Full GC 预留更多内存 buffer;调小则尽可能充分使用内存 ## 二、查询内存控制 ### 1. 查询内存超发(enable_query_memory_overcommit) - **配置项**: `enable_query_memory_overcommit` - **默认值**: true - **作用**: - `true`: 进程内存未超过 soft mem limit 时查询内存不受限制;超过时 cancel 内存超发比例最大的查询 - `false`: 使用内存超过 `exec_mem_limit` 时立即 cancel 查询 ### 2. 会话级内存限制 通过 SQL 设置单查询内存限制: ```sql -- 设置查询内存限制(默认 2GB) SET exec_mem_limit = 8G; -- 设置全局内存限制 SET GLOBAL exec_mem_limit = 8G; ``` ## 三、导入内存控制 ### 1. 导入总内存限制 - **配置项**: `load_process_max_memory_limit_percent` - **默认值**: 50% - **作用**: 单节点上所有导入线程占据的内存上限比例 ### 2. 导入 Soft Limit - **配置项**: `load_process_soft_mem_limit_percent` - **默认值**: 50% - **作用**: 当导入内存占用超过 soft limit 时,会挑选占用内存最大的作业进行下刷以提前释放内存空间 ### 3. MemTable 刷新间隔 - **配置项**: `memtable_mem_tracker_refresh_interval_ms` - **默认值**: 100ms - **作用**: memtable 主动下刷时刷新内存统计的周期 ## 四、存储与缓存内存控制 ### 1. Page Cache 限制 - **配置项**: `storage_page_cache_limit` - **默认值**: 20% - **作用**: Storage Page Cache 大小限制 ### 2. Index Page Cache 比例 - **配置项**: `index_page_cache_percentage` - **默认值**: 10% - **范围**: [0, 100] - **作用**: Index Page Cache 占总 Storage Page Cache 的百分比 ### 3. Segment Cache 容量 - **配置项**: `segment_cache_capacity` - **默认值**: -1(表示 `fd_number * 2/5`) - **作用**: Segment Cache 的最大条目数(key 为 rowset id) ### 4. Buffer Pool 限制 - **配置项**: `buffer_pool_limit` - **默认值**: 20% - **作用**: Buffer Pool 最大可分配内存,用于 AggregationNode 和 ExchangeNode 的内存申请 ## 五、Compaction 内存控制 - **配置项**: `vertical_compaction_max_row_source_memory_mb` - **默认值**: 200MB - **作用**: Vertical Compaction 中 row_source_buffer 的最大内存使用 ## 六、其他内存控制 ### 1. Schema Change 内存限制 - **配置项**: `memory_limitation_per_thread_for_schema_change_bytes` - **默认值**: 2GB (2147483648 bytes) - **作用**: 单个 Schema Change 任务允许占用的最大内存 ### 2. 写入缓冲区大小 - **配置项**: `write_buffer_size` - **默认值**: 100MB (104857600 bytes) - **作用**: 导入数据在 BE 上先写入内存块,达到阈值后写回磁盘。过小会产生大量小文件,过大可能导致 RPC 超时 ## 七、内存 GC 策略 Doris BE 通过单独的 GC 线程定时执行内存回收 : | GC 类型 | 触发条件 | 处理措施 | |---------|---------|---------| | **Minor GC** | 进程内存 > SoftMemLimit (默认 81%) 或系统可用内存 < Warning 水位线 (≤3.2GB) | 查询暂停、导入强制下刷、释放部分 Data Page Cache 和过期 Segment Cache;若释放不足 10%,Cancel 内存超发比例大的查询 | | **Full GC** | 进程内存 > MemLimit (默认 90%) 或系统可用内存 < Low 水位线 (≤1.6GB) | 除 Minor GC 操作外,导入暂停、释放全部 Data Page Cache 和大部分其他 Cache;若释放不足 20%,依次 Cancel 内存占用大的查询、内存超发比例大的导入、内存占用大的导入 | ## 八、配置建议 1. **生产环境**: 建议 `mem_limit` 设置为 80%-90%,预留部分内存给操作系统和其他进程 2. **大内存机器**(>64GB): 可适当调大 `max_sys_mem_available_low_water_mark_bytes` 为 Full GC 预留更多 buffer 3. **高并发导入场景**: 根据实际导入并发量调整 `load_process_max_memory_limit_percent` 和 `load_process_soft_mem_limit_percent` 4. **查询密集型场景**: 合理设置 `exec_mem_limit` 和 `enable_query_memory_overcommit`,避免 OOM 如需查看当前内存使用情况,可通过 Doris 的 Web UI 或 `SHOW PROC '/backends'` 命令监控 BE 内存状态。

 


 


 


 


参考