首批通过分布式安全可靠测评,为关键业务系统打造
公有云 MemStore 内存释放问题分析与解决
更新时间:2026-05-08 08:11
问题现象
MemTable 已经转储成功,但是长时间未能被释放,导致内存占用持续增加。列存合并结束或重启后,MemTable 被释放,内存占用下降。
关键诊断信息
触发条件
列存合并触发 Minor,条件如下:
列存合并时,表的 column group 数量大于 20。
合并选中的 Mini SSTable 数量超过 3 个。
合并选中的大于 10 万行的 Mini SSTable 至少有一个。
事前巡检
检查系统配置,确认
_enable_adaptive_merge_schedule参数是否已关闭,以避免触发可能导致 MemTable 长时间不释放的 Minor 合并路径。监控 MemTable 的创建和释放时间,特别是对于那些长时间未被释放的 MemTable。
事后诊断
查看日志,确认是否存在 MemTable 长时间未被释放的情况。搜索 It cost too much time to dec ref cnt 日志,解出 lbt 看是否是列存合并释放的 MemTable。
[2025-07-17 12:54:25.301247] WDIAG [STORAGE] push_table_into_gc_queue (ob_tenant_meta_mem_mgr.cpp:471) [683437][T1002_DagSchedu][T1002][Y0-0000000000000000-0-0] [lt=23][errcode=0] It cost too much time to dec ref cnt(ret=0, memtable={ObITabletMemtable:{ObITable:{this:0x7f2596ec80c0, key:{tablet_id:{id:12515603}, column_group_idx:0, slice_range:{start_slice_idx:0, end_slice_idx:0}, table_type:"MEMTABLE", scn_range:{start_scn:{val:1752727388197677001, v:0}, end_scn:{val:1752727588103463001, v:0}}}, ref_cnt:0, upper_trans_version:9223372036854775807, timestamp:1752727388213731}, ls_id_:{id:25466}, allow_freeze_:true, is_flushed_:true, is_tablet_freeze_:false, logging_blocked_:false, resolved_active_memtable_left_boundary_:true, unset_active_memtable_logging_blocked_:false, has_backoffed_:false, offlined_:false, read_barrier_:true, freeze_clock_:15, freeze_state_:5, unsubmitted_cnt_:0, init_timestamp_:1752727388213731, max_schema_version_:0, write_ref_cnt_:0, max_end_scn_:{val:1752727588103463001, v:0}, rec_scn_:{val:1752727388201892001, v:0}, freeze_scn_:{val:1752727588103463001, v:0}, freezer_:0x7f6d86615490, memtable_mgr_handle_:{memtable_mgr:0x7f6d8459b590, pool:0x7f6dafeea030}, mt_stat_.frozen_time_:1752727588110169, mt_stat_.ready_for_flush_time_:1752727588111838, mt_stat_.create_flush_dag_time_:1752727620192271, mt_stat_.release_time_:1752727712507165, mt_stat_.push_table_into_gc_queue_time_:1752728065301195, mt_stat_.last_print_time_:0}, this:0x7f2596ec80c0, state:0, max_data_schema_version:1752722701315808, max_column_cnt:119, local_allocator:{ListHandle:{freeze_stat:2, id:2548, clock:457892167680}, host:0x7f6db72822b0, arena_handle:{allocated:10127147008}}, contain_hotspot_row:false, snapshot_version:{val:1752727588034308001, v:0}, contain_hotspot_row:false, ls_id:{id:25466}, transfer_freeze_flag:false, recommend_snapshot_version:{val:18446744073709551615, v:3}, is_delete_insert_table:false}, lbt()="0x28de404d 0x1eb8546a 0x1eb84a7c 0x1cd06e35 0x1eb5ceae 0xa00acda 0x1cddf46a 0x1e5512e2 0x1e545bf5 0x203a4a6d 0x28dd5045 0x28dd3152 0x7f6e747a33fb 0x7f6e745fbe83")
如果是列存合并释放的 MemTable 则大概率是该问题。 为进一步核验,可以搜索 CO_MERGE 关键字查看列存合并相关日志,查看是否有触发了 Minor 的记录。如有以下信息说明该列存合并走了 Minor 路径,然后通过 trace id 找到该列存合并对应的 tablet_id,再去核对 It cost too much time to dec ref cnt 日志中打印的 tablet_id 是否有相匹配的。(由于日志限流以及 tablet_id 打印数量的影响,有可能会找不到匹配项)。
[2025-07-17 12:47:02.221355] INFO [COMMON] inner_add_dag_ (ob_tenant_dag_scheduler.cpp:2125) [685697][T1002_CO_MERGE_][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=22] add dag success(dag=0x7f42d01acf60, id=Y0-0000000000000000-0-0, dag->hash()=6135514763398756329, dag_cnt=4, dag_type="CO_MERGE_SCHEDULE", dag_type_cnts=1)
[2025-07-17 12:47:02.221366] INFO [COMMON] inner_add_dag_ (ob_tenant_dag_scheduler.cpp:2125) [685697][T1002_CO_MERGE_][T1002][xxxxx-xxxxx-xxxxx-xxxxx] [lt=7] add dag success(dag=0x7f42d01ac030, id=Y0-0000000000000000-0-0, dag->hash()=4818155980350475306, dag_cnt=5, dag_type="MINOR_EXECUTE", dag_type_cnts=1)
问题原因
列存合并过程中,即使最初获取的是不包含 MemTable 的 tablet(有关该修复的详情参见:由于列存合并执行时间长导致 MemTable 内存释放慢),当需要额外调度 Minor 合并时,由于重新交换了一次 tablet,会再次取到包含 MemTable 的 tablet。 由于列存合并时间通常较长,这会导致 MemTable 长时间无法释放,进而引发内存不释放的问题。
问题的风险及影响
MemTable 释放慢,可能导致内存占用持续增加,影响数据库性能。 打开 _enable_adaptive_merge_schedule 参数主要影响以下几个方面:
列存合并将根据租户内存和合并线程数自动调整单个任务处理 column group 的数量。
列存合并会在满足条件时触发 Minor。
根据内存/CPU 调整转储/合并的并发度,多用于降载。
动态调整转储 DAG 队列中 DAG 的顺序。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库企业版 V4.3.5 GA(oceanbase-4.3.5.0-100000122024123020)及之后版本。
解决方法
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库企业版 V4.3.5 BP2 Hotfix7(oceanbase-4.3.5.2-102070022025081416)、V4.3.5 BP2 Hotfix8(oceanbase-4.3.5.2-102080022025082111)、V4.3.5 BP2 Hotfix9(oceanbase-4.3.5.2-102090012025082611)、V4.3.5 BP4(oceanbase-4.3.5.4-104000052025090918)及之后版本。
加内存或重启。
规避方式
在不影响业务的情况下,提前关闭
_enable_adaptive_merge_schedule参数,防止在列存合并过程中触发额外的 Minor 合并。定期监控 MemTable 的状态,一旦发现有 MemTable 长时间未被释放,及时采取措施,如重启 OBServer 等。