首批通过分布式安全可靠测评,为关键业务系统打造
OBServer 启动失败,内存分配错误
更新时间:2023-11-14 03:16
介绍 OBServer 启动失败报内存分配错误时,如何进行问题排查并解决问题。
适用版本
OceanBase 数据库 V2.2.30-BP9 以前的所有版本。
问题现象
在使用大容量磁盘的环境中,OBServer 启动失败,错误信息如下。
WARN alloc (ob_tenant_ctx_allocator.h:111) [29230][0][Y0-0000000000000000] [lt=5] [dc=0] oops, alloc failed, tenant_id=500 ctx_id=0 ctx_name=DEFAULT_CTX_ID ctx_hold=15315501056 ctx_limit=9223372036854775807 tenant_hold=26240372736 tenant_limit=9223372036854775807 [2020-05-20 17:54:29.025284] ERROR [LIB] ob_malloc (ob_malloc.h:49) [29230][0][Y0-0000000000000000] [lt=9] [dc=0] allocate memory fail(attr=tenant_id=500, mod_id=383, ctx_id=0, prio=0, nbyte=7247759000) BACKTRACE:0x72b9eda 0x7265405 0x416d85 0x4173a1 0x71c3847 0x5a09189 0x5a48bcb 0x5be4f04 0x46e9217 0x3fe1ee9 0x7f0f35534445 0x4042d45 [2020-05-20 17:54:29.025334] WARN ob_malloc_align (ob_malloc.cpp:115) [29230][0][Y0-0000000000000000] [lt=49] [dc=0] ob_tc_malloc allocate memory failed, alignment[32], nbyte[7247758968], tenant_id[500], mod[383].
可能原因
根据错误信息 ERROR [LIB] ob_malloc,可知问题为 server 租户的内存分配失败。
注意
system_memory 用于设置系统预留内存容量。server 租户内存不受 system_memory 限制,使用量达到 system_memory 设定的阈值后仍会继续上涨。有关该参数的详细信息,参见《OceanBase 数据库 参考指南》中 系统配置项 章节。
对比分析,发现只有在大容量磁盘环境中存在该问题。初始化 ob_store_file 时需要申请内存,如果磁盘很大,初始化的存储文件过大(例如 130 TB 磁盘),会导致内存申请过多,出现内存不够的问题。
解决方法
该问题可以通过以下两种方式解决。
配置
datafile_size或datafile_disk_percentage参数来减小存储文件的大小。obclient> ALTER SYSTEM SET datafile_size = xxxxx; 或 obclient> ALTER SYSTEM SET datafile_disk_percentage = xx;其中,
datafile_size用于设置数据文件的大小;datafile_disk_percentage表示占用 data_dir 所在磁盘总空间的百分比。有关以上两个参数的详细信息,参见《OceanBase 数据库 参考指南》中 系统配置项 章节。
将 OceanBase 数据库升级到 V2.2.30-BP9 及以后版本即可解决。有关升级 OceanBase 数据库的方法,参见《OceanBase 数据库 升级指南》。