|
我来为您搜索关于 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 内存状态。
|
|
|
|
|
|
|
|
|