首批通过分布式安全可靠测评,为关键业务系统打造
LLVM 内存分配失败导致 PL 调用 core
更新时间:2026-07-31 09:11
问题现象
OBServer 节点内存泄漏,导致 core。
通过对日志的分析,导致 core 的 trace 日志中包含如下信息:
jit block mprotect failed(block={addr:0x7f11f9ba4000, alloc_end:0x7f11f9ba43ec, size:4096}, errno=12, tmp_ret=-1, ret=-4016, (uintptr_t)block.addr_& ~(page_size - 1)=139715180904448, page_size * ((block.size_ + page_size - 1) / page_size)=4096, p_flags=1)
关键诊断信息
事后诊断
关键日志信息如下:
# 导致 core 的 trace 日志中包含
jit block mprotect failed(block={addr:0x7f11f9ba4000, alloc_end:0x7f11f9ba43ec, size:4096}, errno=12, tmp_ret=-1, ret=-4016, (uintptr_t)block.addr_& ~(page_size - 1)=139715180904448, page_size * ((block.size_ + page_size - 1) / page_size)=4096, p_flags=1)
问题原因
OBServer 节点所在服务器内存不足(非分配给 OBServer 节点的内存),LLVM 编译 PL 时无法分配足够内存,因此 PL 在调用时函数指针出现问题,导致 core。
问题的风险及影响
导致 OBServer crash。
影响租户
影响 OceanBase 数据库中的 Oracle 租户,对于 SYS 租户和 MySQL 租户无影响。
影响的版本
OceanBase 数据库 V2.2.77 GA(oceanbase-2.2.77-20210508211731)及之后版本、V3.1.2 GA(oceanbase-3.1.2-20210618150922)及之后版本、V3.2.3 GA(oceanbase-3.2.3.0-20220418212020)及之后版本、V3.2.4 GA(oceanbase-3.2.4.0-100000072022102819)及之后版本、V4.1.0 GA(oceanbase-4.1.0.0-100001122023040322)及之后版本。
解决方法及规避方式
升级至问题已修复版本。目前已修复的版本包括 OceanBase 数据库 V2.2.77 BP17(oceanbase-2.2.77-117000112023051914)及之后版本、V3.2.3 BP7 Hotfix2(oceanbase-3.2.3.3-107020062023022810)版本、V3.2.3 BP7 Hotfix3(oceanbase-3.2.3.3-107030052023031712)版本、V3.2.3 BP7 Hotfix4(oceanbase-3.2.3.3-107040032023032910)版本、V3.2.3 BP7 Hotfix5(oceanbase-3.2.3.3-107050022023040817)版本、V3.2.3 BP7 Hotfix6(oceanbase-3.2.3.3-107060012023041113)版本、V3.2.3 BP8(oceanbase-3.2.3.3-108000062023041511)及之后版本、V3.2.4 BP3(oceanbase-3.2.4.3-103000032023041816)及之后版本、V4.1.0 BP2(oceanbase-4.1.0.1-102000042023061309)及之后版本。
增加 OBServer 节点所在服务器的内存,保证其有足够的内存供 PL 编译使用。