基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
新增租户级别配置项 _tenant_stack_size 并增加 stack_size 上限
更新时间:2026-07-02 15:41
问题现象
当前 stack_size 配置项为集群配置项,表示线程栈的大小,默认为 512K,通常情况下不需要修改。当出现爆栈 BUG 时(例如调用栈过深),通常会改大 stack_size 用于临时规避爆栈的问题,该值被修改后,会在所有的线程上生效。线程栈的内存占用可能会达到 GB 级别,而线程栈使用的内存来自于线程归属的租户,因此对于 Meta 租户、小规格租户来说很可能造成内存不足即发生内存爆。
关键诊断信息
触发条件
stack_size 配置项被调大时有可能触发内存爆。
事前巡检
检查 stack_size 配置项的值。
show parameters like 'stack_size';
事后诊断
日志中出现 4013 内存不足相关的日志,可通过排查内存虚拟表或 memory dump 日志确认是否是由 stack 内存占用过高引起的。线程栈使用的内存 CTX 为 CO_STACK,重点关注该 CTX 的内存占用。
检查内存虚拟表。
-- 将租户 ID 替换为对应的发生内存爆的租户 select * from GV$OB_MEMORY where tenant_id=xxx order by used desc limit 20;查询结果示例,如下图所示。

检查发生 4013 内存不足时最近的 memory dump 的日志,找到内存爆对应租户的 memory dump 日志,重点关注
CO_STACK内存占用及对应租户的内存 limit,确认CO_STACK的内存占用是否过高。如下图所示。
问题原因
当前 stack_size 配置项为集群配置项,修改后会在所有线程上生效,无法兼顾到小规格租户。
问题的风险及影响
线程栈部分内存占用过高,可能导致小规格租户内存爆,影响业务正常运行。
影响租户
影响 OceanBase 数据库中的 SYS 租户和 Oracle 租户以及 MySQL 租户。
影响版本
OceanBase 数据库 V4.1.0 GA(oceanbase-4.1.0.0-100001122023040322)及之后版本、V4.2.0 GA(oceanbase-4.2.0.0-100010082023083014)及之后版本、V4.2.1 GA(oceanbase-4.2.1.0-100000182023092722)及之后版本、V4.2.2 GA(oceanbase-4.2.2.0-100000082024011317)及之后版本、V4.2.5 GA(oceanbase-4.2.5.0-100000082024102022)及之后版本、V4.3.0(oceanbase-4.3.0.0-100000072024020200)及之后版本、V4.3.5 GA(oceanbase-4.3.5.0-100000122024123020)及之后版本。
解决方法
OceanBase 数据库 V4.4.0 之前的版本,建议先增大小规格租户的内存规格,再调整 stack_size。 从 OceanBase 数据库 V4.4.0 版本开始,新增了一个租户级 stack_size 隐藏配置项 _tenant_stack_size,并设置了 stack_size 上限。
增加租户级配置项
_tenant_stack_size。调整
stack_size通常用于临时规避爆栈问题,而发生爆栈的通常只是某个租户下的工作线程。因此新增一个租户级别的隐藏配置项_tenant_stack_size,可以只在某个用户租户的范围内生效,不影响 Meta 租户和其他小规格租户。 当出现爆栈 BUG 需要规避时,优先使用_tenant_stack_size调整相应租户的配置项。 使用示例:-- 修改当前登陆租户的配置项,不会修改对应的 META 租户配置 alter system set _tenant_stack_size = '1M'; -- 修改所有用户租户配置项 alter system set _tenant_stack_size = '1M' tenant=ALL; -- 修改所有 META 租户配置项 alter system set _tenant_stack_size = '1M' tenant=ALL_META; -- 修改指定租户的配置项 alter system set _tenant_stack_size = '1M' tenant=sys; alter system set _tenant_stack_size = '1M' tenant=mysql; alter system set _tenant_stack_size = '1M' tenant=oracal; alter system set _tenant_stack_size = '1M' tenant=META$1004; -- 查询该配置项当前的值 select * from __all_virtual_tenant_parameter_stat where name='_tenant_stack_size';增加
stack_size上限。为
stack_size设置上限,该上限由相应租户的内存上限来确定,该机制对集群级配置项stack_size和租户级配置项_tenant_stack_size均有效,如果需要修改小规格租户的stack size相关配置,需要先增大租户规格。租户内存上限 stack_size 上限 >= 1G (tenant_memory_limit / 1G) * 512K < 1G 512K 也可以通过上文提到的查询内存虚拟表的方式确认当前的生效值。
规避方式
针对小规格租户,建议增大租户内存规格,再修改
stack_size。如果爆栈问题已在后续版本中修复,可以考虑升级至修复后的版本。