首批通过分布式安全可靠测评,为关键业务系统打造
删租户存在较大的内存泄漏的原因和解决方法
更新时间:2026-05-08 03:41
问题现象
租户删除后多个模块存在泄漏(租户内存泄漏及 500 租户内存泄漏)。
问题诊断
事前诊断
功能适用性
仅适用于 OceanBase 数据库 V4.x 版本。
这是涉及多个模块的系统性问题,特点是租户删除(或 unit 迁出)后多个模块存在泄漏。可通过 SQL 检查:
obclient > select distinct tenant_id from __all_virtual_memory_info where tenant_id >= 1000 and tenant_id not in (select tenant_id from __all_tenant) and hold > 0;
此 SQL 若长期有数据返回,则说明问题已经存在,注意两点:
- 短暂有数据输出是合理的,只有长时间保持才说明问题。
- 只要有删租户即会出现该现象,只要总次数不大泄漏量不高,通常不需要处理。
事后诊断
功能适用性
适用于 OceanBase 数据库所有版本。
查看每个节点的泄漏量。
方法一:
obclient > select svr_ip,svr_port,sum(hold) from __all_virtual_memory_info where tenant_id not in (select tenant_id from __all_tenant) and tenant_id > 1000 group by 1,2;返回结果如下:
+-----------------+----------+-----------+ | svr_ip | svr_port | sum(hold) | +-----------------+----------+-----------+ | xxx.xxx.xxx.xxx | 2882 | 52120992 | +-----------------+----------+-----------+方法二:
obclient > select svr_ip,svr_port, sum(hold) from (select a.svr_ip as svr_ip,a.svr_port as svr_port,a.hold as hold,b.unit_id as unit_id from __all_virtual_memory_info a left join (select a.unit_id,a.svr_ip , a.svr_port,b.tenant_id from __all_unit a, __all_resource_pool b where a.resource_pool_id = b. resource_pool_id and b.tenant_id != -1) b on a.svr_ip= b.svr_ip and a.svr_port=b.svr_port and a.tenant_id=b.tenant_id where a.tenant_id > 1000 and unit_id is NULL) group by 1,2;返回结果如下:
+-----------------+----------+-----------+ | svr_ip | svr_port | sum(hold) | +-----------------+----------+-----------+ | xxx.xxx.xxx.xxx | 2882 | 52120992 | +-----------------+----------+-----------+
问题原因
删租户为非常态化的生产操作,频率也不高,一般不会考虑租户级别的资源回收,因此此处存在一些缺陷。
问题的风险及影响
会出现内存不足、OOM 等问题,影响节点可用性。
影响的版本
OceanBase 数据库 V4.1 之前所有版本。
解决方法及规避方式
解决方法
重启泄漏严重的 observer 进程。
规避方式
降低删租户次数。