适用版本
OceanBase 数据库 V2.x、V3.x 版本。
问题现象
租户不可用,执行简单的查询 SQL 报错 4013:No memory or reach tenant memory limit。
手动执行转储报错超时。
obclient> alter system minor freeze;
ERROR 4012 (HY000): Timeout
查看 OBServer 日志发现在内存满之前有在释放 MemStore。
[2022-06-22 19:04:43.872329] INFO [STORAGE] ob_pg_storage.cpp:3671 [119022][908][Y0-0000000000000000] [lt=53] [dc=0] succeed to release memtable(tmp_ret=0, memtable_key={table_type:0, pkey:{tid:1113805279004930, partition_id:0, part_cnt:0}, table_id:1113805279004930, trans_version_range:{multi_version_start:1655895261405228, base_version:1655895261405228, snapshot_version:1655895808929193}, version:"0-0-0"}, ref=5)
问题原因
虽然每次内存满之前都有在释放 MemStore,但是内存写入速度太快,而转储性能较差,MemStore 释放太慢,导致租户内存超过 memstore_limit_percentage 阈值,报错租户内存不足。
解决方法
通过以下几种方式进行规避:
- 调小租户配置项
freeze_trigger_percentage,降低触发全局冻结的租户使用内存阈值,提前触发转储。 - 调大集群配置项
memstore_limit_percentage,提高租户使用 MemStore 的内存占其总可用内存的百分比,延缓触发阈值。 - 调大租户配置项
writing_throttling_trigger_percentage,增加触发限流前的 MemStore 内存可用量。 - 调大租户内存。