首批通过分布式安全可靠测评,为关键业务系统打造
OceanBase 数据库内存碎片问题的诊断排查方法
更新时间:2025-05-07 12:51
本文介绍 OceanBase 数据库内存碎片问题的诊断排查方法。
问题现象
1004 租户 DEFAULT_CTX_ID 内存占用 1,453,944,832 字节,其中有 400M+ 是内存碎片占用的量。

内存碎片诊断信息
内存日志中字段含义。
| wash_related_chunks | CTX 下被 wash 的内存所占用的 chunk 数 |
|---|---|
| washed_blocks | CTX 下被 wash 的内存所占用的 block 数 |
| washed_size | CTX 下被 wash 的内存大小 |
| count | 内存模块分配的次数 |
| avg_used | 内存模块分配内存的平均大小 |
| block_cnt | used 内存相关的 block 数 |
| chunk_cnt | used 内存相关的 chunk 数 |
一般导致内存碎片的模块会有以下特性:频繁申请释放大量的小块内存,体现在日志上就是 avg_used 偏小,block_cnt 和 chunk_cnt 较大,甚至 chunk_cnt*2M 接近碎片大小。
内存碎片排查
诊断排查内存碎片首先得关注日志中的 chunk_cnt,它直接表示内存模块占住多少个 2M 内存块不释放。如果没有明显比较大的 chunk_cnt,则有可能导致碎片的内存模块的内存已经被释放掉了,需要找到更早的产生碎片日志。
示例碎片日志信息。

先找到碎片较少的时间节点 t1,此时导致内存碎片的模块内存大概率未释放,与 400M+ 的碎片节点的日志相比较,找到
chunk_cnt较大的疑似模块MSTXAllocator(chunk_cnt达到 200,即 hold 400M 内存不释放)。在 t1 时刻使用命令
grep MSTXAllocator过滤出内存信息,发现该模块频繁申请大量的小块内存(hold= 154,539,264 used= 152,699,904 count= 18,936 avg_used= 8,064 block_cnt= 18,936 chunk_cnt= 203 mod=MSTXAllocator),确定MSTXAllocator是内存碎片问题的主要元凶。
适用版本
OceanBase 数据库所有版本。