[TOC] # 租户内部内存管理 租户内存默认占到 OceanBase 数据库内存上限的 80%,OceanBase 数据库把租户内部的内存总体上分为两个部分: * 不可动态伸缩的内存 MemStore * 可动态伸缩的内存 KVCache 其中,不可动态伸缩的内存主要给保存数据库增量更新的 MemStore 使用,可动态伸缩的内存主要由 KVCache 进行管理。可动态伸缩的 KVCache 会尽量使用除去不可动态伸缩后租户的全部内存。 除此之外,还有很多内存组件,包括 Plan Cache(执行计划缓存)、SQL Arena(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 优先级的参数如下表所示。参数值越大表示优先级越高。 <table cols="3" id="table-okg-xr6-i39" class="table"><colgroup colname="col2" colnum="2" colwidth="1*" id="colgroup-fzt-0vz-8ib" style="width:50%"></colgroup><colgroup colname="col3" colnum="3" colwidth="1*" id="colgroup-1vm-fwm-2li" style="width:50%"></colgroup><thead id="thead-o5t-lz7-txs" class="thead"><tr id="tr-jmi-uu5-9gn"><th id="td-v32-0mw-ps8"><p id="p-zba-dgf-plh">参数</p></th><th id="td-zlu-zz4-jxf"><p id="p-xjn-r63-7nl">含义</p></th></tr></thead><tbody id="tbody-371-euy-kak" class="tbody"><tr id="tr-i69-o3a-7mi"><td namest="col1" nameend="col1" id="td-b1q-76j-pzb"><p id="p-4u4-00l-v2h">fuse_row_cache_priority</p></td><td namest="col2" nameend="col2" id="td-1q5-9c2-41x"><p id="p-wh8-r3t-bl5">融合行缓存在缓存系统中的优先级。</p></td></tr><tr id="tr-yr7-5t9-13d"><td namest="col1" nameend="col1" id="td-ncb-zj8-g41"><p id="p-8qc-ji5-lf4">location_cache_priority</p></td><td namest="col2" nameend="col2" id="td-mk5-asm-mlk"><p id="p-035-cev-fpy">位置缓存在系统缓存服务中的优先级。</p></td></tr><tr id="tr-qwa-8hs-f3p"><td id="td-e5s-rj5-av5"><p id="p-wjl-137-jic">clog_cache_priority</p></td><td morerows="0" id="td-gm6-wa7-rm7"><p id="p-d8r-489-u6q">事务日志占用缓存的优先级。</p></td></tr><tr id="tr-cji-id1-2tl"><td id="td-odo-dht-ace"><p id="p-yry-4yc-p6o">index_clog_cache_priority</p></td><td morerows="0" id="td-owl-nq5-oz6"><p id="p-ncs-1zg-vfk">事务日志索引在缓存系统中的优先级。</p></td></tr><tr id="tr-b2a-thc-ibb"><td id="td-p54-oer-prz"><p id="p-wt2-zlt-fn6">user_tab_col_stat_cache_priority</p></td><td morerows="0" id="td-nql-jlz-fbw"><p id="p-2p7-p9x-7z5">统计数据缓存在缓存系统中的优先级。</p></td></tr><tr id="tr-eoh-7f8-bo2"><td id="td-e4e-h8y-hbq"><p id="p-cdw-kpa-8bq">index_cache_priority</p></td><td morerows="0" id="td-zbu-ksw-tqq"><p id="p-p6z-5ms-1hg">索引在缓存系统中的优先级。</p></td></tr><tr id="tr-c93-ze6-l24"><td id="td-ntp-8y9-qpf"><p id="p-ri6-zuk-haj">index_info_block_cache_priority</p></td><td morerows="0" id="td-ga8-ms0-mid"><p id="p-7le-x80-t4n">块索引在缓存系统中的优先级。</p></td></tr><tr id="tr-jvo-9sr-tln"><td id="td-iyw-jhy-dw5"><p id="p-fop-kg4-45c">user_block_cache_priority</p></td><td morerows="0" id="td-wv7-31a-nft"><p id="p-857-oz5-bol">数据块缓存在缓存系统中的优先级。</p></td></tr><tr id="tr-qt7-tbc-09w"><td id="td-9fo-1e8-bgj"><p id="p-43z-ovq-ax9">user_row_cache_priority</p></td><td morerows="0" id="td-ua8-68p-wzv"><p id="p-3m7-poc-w7m">基线数据行缓存在缓存系统中的优先级。</p></td></tr><tr id="tr-zev-rff-pfo"><td id="td-9y1-056-k7x"><p id="p-m6p-ial-ewt">bf_cache_priority</p></td><td morerows="0" id="td-9da-3v8-1zu"><p id="p-rf3-p6l-9un">Bloom Filter 的缓存优先级。</p></td></tr></tbody></table> KVCache 中子 Cache 的信息可以通过查询`__all_virtual_kvcache_info`参数获得。其中 sys 和普通租户的重要组成部分略有不同: * sys 租户上的 Cache 种类如下: <table id="table-2fd-pos-3lw" class="table"><colgroup colnum="1" colname="col1" colwidth="1*" id="colgroup-gs0-bvg-90e" style="width:33.33333333333333%"></colgroup><colgroup colnum="2" colname="col2" colwidth="2*" id="colgroup-wvu-78y-i9y" style="width:66.66666666666666%"></colgroup><thead id="thead-nv6-3op-dwg" class="thead"><tr id="tr-fds-k5i-3eh"><th id="td-9us-fin-au6"><p id="p-pty-0ie-gl7">类别</p></th><th id="td-mlt-rss-qjb"><p id="p-856-gqm-dnx">说明</p></th></tr></thead><tbody id="tbody-czt-gua-j4m" class="tbody"><tr id="tr-wzb-8wp-pwj"><td id="td-37j-5qm-38b"><p id="p-zme-p6d-pi7">schema_cache</p></td><td id="td-12o-id0-7sx"><p id="p-iyp-zma-l57">存放用户的 Schema 信息,用于提供 SQL 及系统正常运行所依赖的数据库对象的元信息。</p></td></tr><tr id="tr-2sj-gyj-taa"><td id="td-r6s-rve-h5y"><p id="p-uuf-5tj-k5h">location_cache</p></td><td id="td-qd4-t3j-mst"><p id="p-g0h-u7p-bwy">存放分区的 location 信息,通过查询它可以知道一个 Partition 分布在哪些 OBServer 上。</p></td></tr><tr id="tr-u7u-08g-7l4"><td id="td-r2e-6xt-ejw"><p id="p-qtg-u77-5kf">block_index_cache</p></td><td id="td-por-5sh-joi"><p id="p-tt9-n11-1m7">缓存微块的 Index,加速微块数据的访问。</p></td></tr><tr id="tr-3b8-iuv-fr2"><td id="td-yai-hz2-e17"><p id="p-ks1-o46-k7i">user_block_cache</p></td><td id="td-sj8-xiq-irx"><p id="p-17f-7r6-ksv">缓存微块数据,由于微块可能通过压缩算法进行压缩,为了提升查询性能,缓存的是解压后的微块数据。</p></td></tr><tr id="tr-u7e-jlo-1th"><td id="td-eng-zec-fvd"><p id="p-2ic-zse-c9e">fuse_row_cache</p></td><td id="td-hz5-f6a-rjk"><p id="p-zbe-mk1-0yb">缓存行的快照点数据,用于提高点查询性能,并且可以避免因转储、合并导致的缓存失效问题。</p></td></tr><tr id="tr-gky-8xt-dxx"><td id="td-g5c-b6i-c21"><p id="p-1um-xta-lhu">index_clog_cache</p></td><td id="td-tos-pcg-v0j"><p id="p-5us-e0t-826">缓存 ilog 文件的内容,用于减小读取 ilog 文件的开销。</p></td></tr><tr id="tr-5lc-g0d-wda"><td id="td-51l-jqx-wq4"><p id="p-69b-w84-84y">user_tab_col_stat_cache </p></td><td id="td-kri-6x8-323"><p id="p-4j2-rn5-w0y">用户表列统计信息缓存,用于 SQL 计算代价。</p></td></tr><tr id="tr-w2t-3m4-1nu"><td id="td-e9q-iqr-jbd"><p id="p-e3a-yi8-hj3">user_table_stat_cache </p></td><td id="td-5k8-wo6-nfh"><p id="p-oac-uqb-g3m">用户表统计信息缓存,用于 SQL 计算代价。</p></td></tr></tbody></table> * 普通租户上的 Cache 种类如下: <table id="table-x6k-1ap-wv3" class="table"><colgroup colnum="1" colname="col1" colwidth="1*" id="colgroup-hfx-yge-05s" style="width:33.33333333333333%"></colgroup><colgroup colnum="2" colname="col2" colwidth="2*" id="colgroup-glf-x72-0ug" style="width:66.66666666666666%"></colgroup><thead id="thead-clq-4yc-lwl" class="thead"><tr id="tr-kr5-fwi-o35"><th id="td-o4v-g1n-dqg"><p id="p-nmb-fym-9hr">类别</p></th><th id="td-mpc-kka-y0k"><p id="p-0f8-iou-c1p">说明</p></th></tr></thead><tbody id="tbody-mhs-hrw-1vr" class="tbody"><tr id="tr-n52-bkx-7iq"><td id="td-8d1-idn-jqr"><p id="p-73r-17x-ve0">user_block_cache</p></td><td id="td-49i-srh-iuq"><p id="p-5g7-ncy-49n">缓存微块数据,由于微块可能通过压缩算法进行压缩,为了提升查询性能,缓存的是解压后的微块数据。</p></td></tr><tr id="tr-b2e-zef-38e"><td id="td-d2o-zhx-fz5"><p id="p-t60-a3d-dyo">block_index_cache</p></td><td id="td-mlp-j4g-m21"><p id="p-o35-p71-9tm">缓存微块的 Index,加速微块数据的访问。</p></td></tr><tr id="tr-vvf-pbu-r9l"><td id="td-zvi-3s8-w4p"><p id="p-wfc-lfe-wza">fuse_row_cache </p></td><td id="td-u2l-zqb-l9p"><p id="p-qko-6d1-akv">缓存行的快照点数据,用于提高点查询性能,并且可以避免因转储、合并导致的缓存失效问题。</p></td></tr></tbody></table>