全局元数据缓存

本文介绍了全局元数据缓存(Global Cache)的背景以及如何使用。

前提条件

支持的PolarDB PostgreSQL版的版本如下:

PostgreSQL 14(内核小版本14.8.11.0及以上)。

说明

您可通过如下语句查看PolarDB PostgreSQL版的内核小版本的版本号:

select version();

背景信息

为提升对元数据的访问效率,PostgreSQL在各个进程中引入了多种元数据缓存:

  • RelCache(Relation Descriptor Cache):关系描述符缓存。

  • CatCache/SysCache(System Catalog Cache):系统表缓存。

RelCache, CatCache为各个进程私有,在连接数较多或者数据库中对象个数较多时(表、视图、索引等),数据库实例会因此消耗大量的内存。

全局元信息缓存(Global Cache)是PolarDB PostgreSQL版系列位于共享内存中供所有进程共享的元数据缓存的统称。Global Cache可以让所有进程共享同一个缓存条目,提高内存利用效率,降低因此发生OOM的风险。Global Cache 目前包括:

  • Global RelCache:全局关系描述符缓存,对应RelCache。

  • Global CatCache:全局系统表缓存,对应CatCache/SysCache。

RelCache

RelCache是把和一张表(包括视图、索引、Toast等)相关的所有元数据按照访问更高效的方式,重新组织缓存在内存中,在处理SQL的各个阶段(例如,想知道一张表的列信息、索引信息、分区表信息等),都会直接访问RelCache。如果RelCache未命中,才会扫描系统表并加载到内存中。

原生PostgreSQL的RelCache并无淘汰机制,所以正常情况下第一次访问之后,RelCache会持续缓存直到进程退出,或者有DDL修改了表的元数据并广播了Cache失效消息,RelCache在收到失效消息后会把待失效对象从内存中剔除。

CatCache

CatCache缓存的是系统表中的Tuple,基于CatCache基础之上还有一层SysCache(KV接口),本质上可以认为CatCache和SysCache一起把系统表中的数据在内存中按照KV方式重新组织,以方便查询。例如,在处理SQL的过程中(例如,通过oid查询name,通过oid查询某函数有多少个参数等),都是直接访问 CatCache。如果CatCache未命中,再从系统表中加载。CatCache的加载、失效都和RelCache基本一致。

参数说明

参数

级别

说明

polar_enable_global_catcache

PGC_USERSET

用于开启或关闭Global CatCache。取值如下:

  • on(默认):开启Global CatCache功能。

  • off:关闭Global CatCache功能。

polar_enable_global_relcache

PGC_USERSET

用于开启或关闭Global RelCache。取值如下:

  • on(默认):开启Global RelCache功能。

  • off:关闭Global RelCache功能

polar_sgc_max_size

PGC_POSTMASTER

用于设置Global Cache的总容量大小。取值范围:0 ~ INT_MAX,默认值为72 MB。修改需要重启才可以生效。

polar_global_catcache_size

PGC_SIGHUP

用于设置Global CatCache的容量大小。取值范围:0 ~ polar_sgc_max_size,默认值为32 MB。

polar_global_relcache_size

PGC_SIGHUP

用于设置Global RelCache的容量大小。取值范围:0 ~ polar_sgc_max_size,默认值为32 MB。

说明

各个Global Cache的容量都支持在线扩缩容,只要不超过polar_sgc_max_size即可,这为不同的业务场景提供了足够的使用弹性。在使用的时候,需注意以下几点:

  • 尽量保证Global Cache的容量充足,在SQL处理的各个环节Cache访问频率非常高,如果容量不足会触发淘汰,再次访问时只能从文件加载,可能导致额外的IO以及性能损耗。

  • 如果某个Cache当前的容量都已用满,依然可以通过调整上述参数在线缩容,对应的Global Cache会淘汰一部分数据,如上所述,这会影响性能,请谨慎操作。

  • polar_sgc_max_size中的内存除了给Global RelCache和Global CatCache使用,还需要留出一部分用作管理内存(维护Global Cache的正常运转,例如,内部hashtable等),所以正常情况下polar_sgc_max_size>polar_global_relcache_size+polar_global_catcache_size

监控接口

Global Cache的所有监控接口都在polar_global_cache插件中,执行以下命令,创建插件。

CREATE EXTENSION polar_global_cache;

Cache统计信息

Global Cache全局统计信息

您可以通过polar_global_cache_stat查看Global Cache的状态信息。目前只包括Global RelCache和Global CatCache。

=> SELECT * FROM polar_global_cache_stat;
-[ RECORD 1 ]----+----------------
cache_name       | Global CatCache
elems            | 2805
nlookup          | 74233
nlookup_miss     | 43576
ninsert          | 9478
nmove            | 0
ndelete          | 0
ninvalidate      | 35843
nflush           | 1
nevict           | 0
nevict_active    | 0
nevict_fail      | 0
lru_active_len   | 402
lru_inactive_len | 2403
data_allocator   | 2
meta_allocator   | 1
component_id     | 1
-[ RECORD 2 ]----+----------------
cache_name       | Global RelCache
elems            | 95
nlookup          | 1203
nlookup_miss     | 1005
ninsert          | 265
nmove            | 0
ndelete          | 0
ninvalidate      | 4404
nflush           | 1
nevict           | 0
nevict_active    | 0
nevict_fail      | 0
lru_active_len   | 3
lru_inactive_len | 92
data_allocator   | 3
meta_allocator   | 1
component_id     | 2

指标说明:

指标

说明

nlookup

缓存查询次数。

nlookup_miss

查询未命中的次数。结合nlookup可以评估Global Cache的命中率,系统启动前期命中率可能会比较低,随着缓存的预热,命中率会慢慢提高。此外需要设置合适的容量来保证Global Cache的命中率,以免影响性能。

ninsert

缓存新插入次数。

nmove、ndelete

扩缩容期间缓存对象被移动和删除的次数。

ninvalidate

缓存失效次数。

nflush

由于特殊缓存失效消息或者drop database;等导致冲刷整个缓存的次数。

nevict

Global Cache淘汰的总个数。

说明

Global Cache中的对象按照LRU进行淘汰,分为active list和nactive list,优先淘汰inactive list中的缓存。而淘汰的过程中,可能因为当前的对象正在使用或者一些并发冲突导致按照LRU策略应该淘汰的对象却无法淘汰,这种情况无需关心。

nevict相关指标不为0说明当前容量不足,为避免影响性能,可以通过polar_global_catcache_sizepolal_global_relcache_size参数调大容量。

nevict_active

Global Cache淘汰处于active list中的个数。

nevict_fail

Global Cache淘汰失败的次数。

lru_active_len

记录了内部LRU List中active list的长度。

lru_inactive_len

记录了内部LRU List中inactive list的长度。

Local Cache全局统计信息

polar_cache_stat中的指标为polar_global_cache_stat的子集,指标说明与polar_global_cache_stat一致。

说明

polar_cache_stat虽然展示的是进程私有的Cache信息,但是通过该视图查询的结果是汇聚了所有进程的数据。

=> SELECT * FROM polar_cache_stat;
-[ RECORD 1 ]-+--------------
cache_name    | Proc CatCache
nlookup       | 779844
nlookup_miss  | 82390
ninsert       | 150876
ndelete       | 139690
ninvalidate   | 74231
nevict        | 126474
nevict_active | 1808
evict_fail    | 0
-[ RECORD 2 ]-+--------------
cache_name    | Proc RelCache
nlookup       | 295183
nlookup_miss  | 4632
ninsert       | 25968
ndelete       | 3277
ninvalidate   | 8856
nevict        | 0
nevict_active | 0
evict_fail    | 0

CatCache统计信息

Global CatCache统计信息

您可以通过polar_global_catcache_stat查看Global CatCache的状态信息。

说明

相对于polar_global_cache_stat增加了一些xxx_clist字段,这部分指标正常情况下无需关心。CatCache中的对象有两种,CatTuple和CatList,xxx_clist相关指标记录了Cat List相关对象的各种数据。

=> SELECT * FROM polar_global_catcache_stat;
-[ RECORD 1 ]-------+----
elems               | 34
nlookup             | 853
nlookup_miss        | 852
ninsert             | 34
nmove               | 0
ndelete             | 0
ninvalidate         | 0
nflush              | 0
nevict              | 0
nevict_active       | 0
nevict_fail         | 0
nlookup_clist       | 41
nlookup_miss_clist  | 41
ninsert_clist       | 0
nmove_clist         | 0
ndelete_clist       | 0
ninvalidate_clist   | 0
nevict_clist        | 0
neivct_active_clist | 0
rehash_fail         | 0
meta_alloc_fail     | 0
data_alloc_fail     | 0
lru_active_len      | 0
lru_inactive_len    | 34
component_id        | 1

Local CatCache统计信息

您可以通过polar_catcache_stat查看进程内部的CatCache的状态信息,统计指标为polar_global_catcache_stat的子集,相关含义也是一致的。

=> SELECT * FROM polar_catcache_stat;
-[ RECORD 1 ]------+-----
nlookup            | 2060
nlookup_miss       | 898
ninsert            | 883
ndelete            | 753
ninvalidate        | 0
nevict             | 753
nevict_active      | 2
evict_fail         | 0
nlookup_clist      | 41
nlookup_miss_clist | 41
ninsert_clist      | 41
ndelete_clist      | 41

RelCache统计信息

Global RelCache统计信息

您可以通过polar_global_relcache_stat查看Global RelCache的相关状态。

=> SELECT * FROM polar_global_relcache_stat;
-[ RECORD 1 ]----+-----
elems            | 61
nlookup          | 930
nlookup_miss     | 836
ninsert          | 221
nmove            | 0
ndelete          | 0
ninvalidate      | 4344
nflush           | 1
nevict           | 0
nevict_active    | 0
nevict_fail      | 0
meta_alloc_fail  | 0
data_alloc_fail  | 0
lru_active_len   | 3
lru_inactive_len | 58
component_id     | 2

Local RelCache统计信息

您可以通过polar_relcache_stat查看当前Session内部relcache的状态。

=> SELECT * FROM polar_relcache_stat;
-[ RECORD 1 ]-+-------
nlookup       | 293458
nlookup_miss  | 4535
ninsert       | 20239
ndelete       | 3277
ninvalidate   | 8856
nevict        | 0
nevict_active | 0
evict_fail    | 0