租户内存默认占到 OceanBase 内存上限的 80%,OceanBase 把租户内部的内存总体上分为两个部分:
- 不可动态伸缩的内存 MemStore
- 可动态伸缩的内存 KVCache
其中,不可动态伸缩的内存主要由保存数据库增量更新的 MemStore 使用,可动态伸缩的内存主要由 KVCache 进行管理。可动态伸缩的 KVCache 会尽量使用除去不可动态伸缩后租户的全部内存。
内存组件还有很多,包括 Plan Cache(执行计划缓存)、SQL Area(SQL 执行期内存)、选举动作等等,都要占用一定量的内存,通过查询 __all_virtual_memory_info
可以完整的得到所有内存组件的使用情况。
不可动态伸缩的内存管理
目前与不可动态伸缩内存相关的配置只有 memstore_limit_percentage
,它表示租户的 MemStore 部分最多占租户总内存上限的百分比,默认值为租户 MinMemory的 50%。租户的写入或者更新会增加 MemStore 的内存使用,当租户的 MemStore 部分内存到达上限以后,后续的写入或者更新操作将会被拒绝。OceanBase 会根据 MemStore 的内存使用比例决定何时进行转储或者合并释放 MemStore 的内存。该比例由配置项 freeze_trigger_percentage
控制,表示当 MemStore 内存占用到达其上限的百分比后就进行冻结(转储和合并的前置动作),默认值为租户 MemStore 内存上限的 70%,即租户 MinMemory 的 35%。
可动态伸缩的内存管理
可动态伸缩的内存主要部分是 KVCache。OceanBase 将绝大多数的 KV 格式的缓存统一在了 KVCache 中进行管理,KVCache 支持动态伸缩,不同 KV 的优先级控制以及智能的淘汰机制。
KVCache 一般不需要配置,特殊场景下可以通过参数控制各种 KV 的优先级,优先级高的 KV 类比优先级低的 KV 类更容易被保留在 Cache 中。下表展示了用来控制 KV 优先级的参数:
参数 | 默认值 |
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 |
KVCache 中子 Cache 的信息可以通过查询 __all_virtual_kvcache_info
参数获得。其中 sys 和普通租户的重要组成部分略有不同:
- sys 租户:
参数 | 说明 |
location_cache | location_cache 中存放的是分区的 Leader 信息,通过查询它可以知道一个 Partition 在哪些 OBServer 上。 |
- 普通租户:
参数 | 说明 |
user_block_cache | 缓存微块数据,由于微块可能通过压缩算法进行压缩,为了提升查询性能,缓存的是解压后的微块数据。 |
block_index_cache | 缓存微块的 Index,加速微块数据的访问。 |
user_row_cache | 缓存静态数据的行。对于单行查询操作,如果行存在,则会命中 RowCache,提升查询性能。 |
Bf_cache | 缓存宏块的 BloomFilter,为了提升写入性能,为频繁空查的宏块建立 BloomFilter,可以减少磁盘 IO 和 CPU 消耗。 |