这是让AI 分析的结果。
一、基本概况
| 指标 | 值 |
|---|---|
| 系统物理内存 | 61.78 GB |
| BE 内存上限 (mem_limit) | 55.60 GB (90%) |
| 软内存限制 (soft_mem_limit) | 50.04 GB |
| 进程 RSS (VmRSS) | 44.60 GB (Peak 46.61 GB) |
| 进程虚拟内存 (VmSize) | 760.47 GB |
| 系统可用内存 | ~16.47 GB |
| 线程数 | 1,934 |
| Tablet 数量 | 2,591 |
| Rowset 数量 | 58,830 |
| Segment 数量 | 18,010 |
| 进程运行时间 | ~7 天 |
当前 RSS 44.60 GB,距离 55.60 GB 硬限制还有约 11 GB 空间,暂未触发 OOM,但已超过软限制 50.04 GB 的 89%。
二、内存分层拆解(核心)
进程 RSS: 44.60 GB
├── TrackedMemory(已追踪): 9.77 GB ← 仅占 22%
│ ├── TasksMemory: 430.97 KB (当前空闲)
│ │ ├── Query: 0 (Peak 6.15 GB)
│ │ ├── Compaction: 169.30 KB (Peak 3.86 GB)
│ │ └── Load: 261.67 KB (Peak 1.89 GB)
│ ├── CacheMemory: 2.37 GB
│ │ ├── DataPageCache: 1.05 GB
│ │ ├── PKIndexPageCache: 1.12 GB
│ │ ├── IndexPageCache: 110.93 MB
│ │ └── MowDeleteBitmapAggCache: 88.61 MB
│ ├── MetadataMemory: 2.36 GB
│ │ ├── SegmentCache: 2.29 GB ← 最大头
│ │ ├── Rowsets: 64.56 MB
│ │ └── Tablets: 7.33 MB
│ ├── JemallocMemory (tracked): 4.78 GB
│ │ ├── Cache (tcache+dirty): 2.81 GB
│ │ └── Metadata: 1.97 GB
│ ├── GlobalMemory: 265.94 MB
│ │ ├── S3FileBuffer: 200 MB (Peak 5.08 GB)
│ │ ├── IOBufBlockMemory: 38.75 MB
│ │ └── BlockCompression: 27.19 MB
│ └── MemtableMemory: 0 (Peak 8.63 GB)
│
└── UntrackedMemory(未追踪): 34.83 GB ← 占 78%,核心问题!
三、核心问题:34.83 GB 未追踪内存
这是这台 BE 最突出的问题。78% 的 RSS 不受 MemTracker 监控,意味着 Doris 的内存 GC 机制无法有效管理这部分内存。
未追踪内存的去向分析
通过 jemalloc 统计交叉验证:
| jemalloc 指标 | 值 | 说明 |
|---|---|---|
| allocated | 37.74 GB | jemalloc 实际分配给应用的 |
| active | 41.66 GB | jemalloc 持有的活跃页 |
| resident | 45.68 GB | jemalloc 物理内存占用 |
| metadata | 1.97 GB | jemalloc 自身元数据 |
| tcache | 352 MB | 线程缓存 |
| dirty pages | ~1.99 GB | 待归还脏页 |
关键差值:
- jemalloc allocated (37.74 GB) - Tracked (9.77 GB) = ~28 GB 已被 jemalloc 分配但 Doris MemTracker 未追踪
- jemalloc active - allocated = 3.92 GB 内部碎片
- jemalloc resident - active = 4.02 GB (元数据 + 脏页)
未追踪内存的可能来源
-
ObjectHeapDump 中的元数据对象(约 1.58 GB 可见的):
- ColumnReader: 562.92 MB (1.23M 个)
- SegmentMemBytes: 564.77 MB (18K 个)
- OrdinalIndexReader: 206.07 MB (1.23M 个)
- ZoneMapIndexReader: 166.17 MB (1.21M 个)
- RowsetMeta: 51.54 MB
- 这些对象本身的内存加上它们引用的深层子对象,可能远不止这些
-
S3 相关读写 buffer:Peak 达到 5.08 GB,当前虽回到 200 MB,但可能有 jemalloc 碎片残留
-
jemalloc 碎片与保留:
- 内部碎片 ~3.92 GB
- 元数据 1.97 GB
- 脏页 1.99 GB
- 合计 ~7.88 GB 的 jemalloc 开销
-
ColumnReader 数量过多:1.23M 个 ColumnReader 本身占 562 MB,但每个 ColumnReader 内部还有指针、索引结构等,实际内存占用可能远高于统计值
四、Cache 使用情况
| Cache | 当前 | 峰值 | 评估 |
|---|---|---|---|
| DataPageCache | 1.05 GB | 5.70 GB | 正常 |
| PKIndexPageCache | 1.12 GB | 5.56 GB | 偏大,MOW 表较多 |
| IndexPageCache | 110.93 MB | 561.89 MB | 正常 |
| SegmentCache | 2.29 GB | 2.87 GB | 偏大 |
| MowDeleteBitmapAggCache | 88.61 MB | 534.54 MB | 正常 |
| S3FileBuffer | 200 MB | 5.08 GB | 峰值很高 |
磁盘文件缓存(File Cache)命中率:76.3%,两个磁盘各 ~450 GB 容量,已使用约 146 GB。
五、任务内存情况
当前几乎无活跃查询和写入任务:
- Query:当前 0,Peak 6.15 GB
- Load:有约 20 个 StreamLoad 任务,但绝大多数已完成,当前仅 ~132 KB
- Compaction:1 个 BaseCompaction 在跑,仅 169 KB;Peak 达 3.86 GB
- MemtableMemory:当前 0,Peak 8.63 GB(说明曾有大批量写入)
六、建议与优化方向
1. 应对未追踪内存高(最紧急)
这是 Doris 4.0.3-rc03 版本可能存在的 MemTracker 覆盖不全的问题。建议:
- 升级到正式版或更新版本:rc 版本的 MemTracker 可能有 bug 或覆盖不全
- 开启
enable_memory_orphan_check=1(已开启),观察日志中是否有 orphan memory 报警 - 考虑设置
enable_shrink_memory=true(当前为 false),让 BE 主动收缩 jemalloc 内存
2. 降低 jemalloc 碎片与元数据开销
当前 jemalloc 元数据 1.97 GB + 碎片 3.92 GB = ~6 GB 的内存浪费:
dirty_decay_ms和muzzy_decay_ms当前均为 5000ms,可以考虑降到 1000ms~2000ms 加速脏页归还- 线程数 1934 × tcache,总 tcache 352 MB,可以考虑适当缩小
tcache_max
3. 控制 SegmentCache
SegmentCache 当前 2.29 GB,且 enable_segment_cache_prune=0(关闭了 prune):
- 建议设置
enable_segment_cache_prune=true,或降低segment_cache_memory_percentage(当前 5%,即 ~2.78 GB) - ColumnReader 数量达 1.23M,说明 SegmentCache 中缓存了大量 Segment 的列信息
4. 监控 S3FileBuffer 峰值
S3FileBuffer 峰值达 5.08 GB,说明在大查询/写入时对象存储 IO 会消耗大量内存 buffer。如果内存紧张,可以关注是否有大量并发 S3 读写。
5. PKIndexPageCache 偏高
1.12 GB 的 PK Index Page Cache 说明 MOW(Merge-on-Write)表较多。当前 pk_storage_page_cache_limit=10%(约 5.56 GB),如果内存紧张可适当降低到 5%。
七、总结
| 问题 | 严重度 | 说明 |
|---|---|---|
| 未追踪内存 34.83 GB (78%) | 高 | MemTracker 覆盖不全,GC 无法管理 |
| jemalloc 碎片+元数据 ~6 GB | 中 | 长期运行后的碎片累积 |
| SegmentCache 关闭 prune | 中 | 只增不减,1.23M ColumnReader |
| S3FileBuffer 峰值 5 GB | 低 | 大查询/写入时瞬间飙高 |
| 当前运行稳定 | -- | RSS 44.6 GB 低于限制 55.6 GB,系统还有 16 GB 可用 |
最关键的行动项:调查和解决 34.83 GB 未追踪内存问题。优先考虑升级到正式 release 版本,并开启 enable_shrink_memory、enable_segment_cache_prune 来回收部分可控内存。