OceanBase内存上限
OceanBase 提供两种方式设置自身内存的上限:一种是按照计算机器总内存上限的百分比计算自身可以使用的总内存,由memory_limit_percentage参数配置;另一种是直接设置 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把租户内部的内存总体上分为两个部分:
不可动态伸缩的内存
可动态伸缩的内存
其中,不可动态伸缩的内存主要由保存数据库增量更新的 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 |