全部产品
云市场

内存管理

更新时间:2019-09-17 14:56:42

OceanBase内存上限

OceanBase提供两种方式设置自身内存的上限:

  1. 按照计算机器总内存上限的百分比计算自身可以使用的总内存,由memory_limit_percentage参数配置。
  2. 直接设置OceanBase可用内存的上限,由memory_limit参数配置。其中memory_limit参数值为0时,使用百分比的配置方式,否则则使用绝对值的配置方式。

举例来说,假设在一台100GB的机器上启动一个OceanBase实例:

memory_limit_percentage memory_limit OceanBase内存上限
80 0 80GB
80 90GB 90GB

第一种情况,由于memory_limit为0,所以以memory_limit_percentage为准,那么OceanBase内存上限就是100GB*80%=80GB。

第二种情况,由于memory_limit为90GB,所以以memory_limit为准,OceanBase内存上限就是90GB。

OceanBase系统内部内存配置

OceanBase是支持多租户的一个数据库系统,但是OceanBase内存上限中配置的内容并不能全部分配给租户使用。因为每一个observer上租户都会共享部分资源或功能,这些资源或功能所使用的内存由于并不属于任何一个普通租户,所以被归结到“系统内部内存”中。系统内部内存可使用的内存上限是可以通过system_memory_percentage配置参数配置的,它的含义是系统内部可使用OceanBase内存上限的百分比。

假设OceanBase内存上限为80GB,system_memory_percentage为20%,那么系统内部可使用的内存就是80GB*20%=16GB。换而言之,可用于租户分配的内存就是剩下的80GB-16GB=64GB。

租户内部内存管理

OceanBase把租户内部的内存总体上分为两个部分:

  1. 不可动态伸缩的内存
  2. 可动态伸缩的内存

其中,不可动态伸缩的内存主要由保存数据库增量更新的MemStore使用;可动态伸缩的内存主要由KVCache进行管理。可动态伸缩的KVCache会尽量使用除去不可动态伸缩后租户的全部内存。

不可动态伸缩的内存管理

目前与不可动态伸缩内存相关的配置只有memstore_limit_percentage,它表示租户的memstore部分最多占租户总内存上限的百分比。租户的写入或者更新会增加memstore的内存使用,当租户的memstore部分内存到达上限以后,后续的写入或者更新操作将会被拒绝。OceanBase会根据memstore的内存使用比例决定何时进行转储或者合并释放memstore的内存。该比例由配置项freeze_trigger_percentage控制,表示当memstore内存占用到达其上限的百分比后就进行冻结(转储和合并的前置动作)。

可动态伸缩的内存管理

可动态伸缩的内存主要部分是KVCache。OceanBase将绝大多数的KV格式的缓存统一在了KVCache中进行管理,KVCache支持动态伸缩,不同KV的优先级控制以及智能的淘汰机制。

KVCache一般不需要配置,特殊场景下可以通过参数控制各种KV的优先级,优先级高的KV类比优先级低的KV类更容易被保留在cache中。涉及参数如下,具体含义可参考配置项参考:

参数名 默认值
clog_cache_priority 1
index_clog_cache_priority 1
user_tab_col_stat_cache_priority 1
index_cache_priority 10
index_info_block_cache_priority 1
user_block_cache_priority 1
user_row_cache_priority 1
bf_cache_priority 1
bf_cache_miss_count_threshold 100