本文介绍了全局元数据缓存(Global Cache)的背景以及如何使用。
前提条件
支持的PolarDB PostgreSQL版(兼容Oracle)的版本如下:
Oracle 2.0(内核小版本2.0.14.11.0及以上)
您可通过如下语句查看PolarDB PostgreSQL版(兼容Oracle)的内核小版本的版本号:
SHOW polar_version;
背景信息
为提升对元数据的访问效率,PostgreSQL在各个进程中引入了多种元数据缓存:
RelCache(Relation Descriptor Cache):关系描述符缓存。
CatCache/SysCache(System Catalog Cache):系统表缓存。
RelCache, CatCache为各个进程私有,在连接数较多或者数据库中对象个数较多时(表、视图、索引等),数据库实例会因此消耗大量的内存。
全局元信息缓存(Global Cache)是PolarDB PostgreSQL版(兼容Oracle)系列位于共享内存中供所有进程共享的元数据缓存的统称。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。取值如下:
|
polar_enable_global_relcache | PGC_USERSET | 用于开启或关闭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 | 查询未命中的次数。结合 |
ninsert | 缓存新插入次数。 |
nmove、ndelete | 扩缩容期间缓存对象被移动和删除的次数。 |
ninvalidate | 缓存失效次数。 |
nflush | 由于特殊缓存失效消息或者 |
nevict | Global Cache淘汰的总个数。 说明 Global Cache中的对象按照LRU进行淘汰,分为active list和nactive list,优先淘汰inactive list中的缓存。而淘汰的过程中,可能因为当前的对象正在使用或者一些并发冲突导致按照LRU策略应该淘汰的对象却无法淘汰,这种情况无需关心。 nevict相关指标不为0说明当前容量不足,为避免影响性能,可以通过 |
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