问题现象
在新部署的一套 OCP 的元数据库中,发现内存使用很高,机器总内存使用率超过了 90%。
使用 top 查看进程内存情况如下:

从上图可以看到,机器总内存 64G, observer 进程内存使用占到了 72.1%,observer 进程内存占用了 46G。
问题原因
查看 observer 内存分配情况:

通过查询分析,observer 实际分配的内存上限为 48G,目前使用 46G,属于正常情况,但是数据库属于空跑状态,内存不应该这么高,因此继续排查,查看内存被占用情况。
查看租户的 memstore 使用情况,发现使用率并不高,怀疑内存可能被预占了。
select now(),t.tenant_name, m.svr_ip, m.active_memstore_used / 1073741824 active_G, m.total_memstore_used / 1073741824 total_G, m.major_freeze_trigger / 1073741824 trigger_G, m.memstore_limit / 1073741824 limit_G, (m.total_memstore_used / m.memstore_limit) * 100 used_rate from __all_virtual_tenant_memstore_info m, __all_tenant t where t.tenant_id = m.tenant_id having used_rate > 1 order by used_rate desc;
查看参数
memory_chunk_cache_size的值为 0,说明是自适应管理,不会轻易清理缓。
查看 observer 的日志
grep CHUNK_MGR observer.log。
可以看到内存被缓存了有 33G,因此判断内存是被 observer 占用了,不过先缓存了起来。
适用版本
OceanBase 数据库社区版所有版本。
解决方法
调整参数 memory_chunk_cache_size 的值,将其调整为 10G,cache 超过 10G 就会触发清理,不占用过多操作系统内存。
obclient> alter system set memory_chunk_cache_size="10G";