本文介绍了Global Cache的背景以及如何使用等内容。
背景信息
Global Cache是一系列位于Shared Memory中供所有进程共享的元数据Cache统称,目前包括Global RelCache、Global CatCache,分别对应原生PostgreSQL中的RelCache和CatCache、SysCache。
原生PostgreSQL中的RelCache, CatCache为各个进程私有,在连接数较多或者数据库中对象个数较多时(表、视图、索引等),数据库实例会因此消耗大量的内存。而Global Cache可以让所有进程共享同一个 Cache,提高内存利用效率,降低因此发生OOM的概率。
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
。
监控
监控的所有接口都在polar_global_cache
插件中,执行以下命令,创建插件。
create extension polar_global_cache;
全局监控
polar_global_cache_stat
您可以通过polar_global_cache_stat
查看Global Cache的状态信息。目前只包括Global RelCache和Global CatCache。
table 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 | 新插入次数。 |
ndelete | 删除次数。正常情况下为0,缩容时可能会递增。 |
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的长度。 |
polar_cache_stat
polar_cache_stat
中的指标为polar_global_cache_stat
的子集,指标说明与polar_global_cache_stat
一致。
polar_cache_stat
虽然展示的是进程私有的Cache信息,但是通过该视图查询的结果是汇聚了所有进程的数据。
table 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
Global CatCache
polar_global_catcache_stat
您可以通过polar_global_catcache_stat查看Global CatCache的状态信息。
相对于polar_global_cache_stat
增加了一些xxx_clist
字段,这部分指标正常情况下无需关心。CatCache中的对象有两种,CatTuple和CatList,xxx_clist
相关指标记录了Cat List相关对象的各种数据。
table 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
polar_catcache_stat
您可以通过polar_catcache_stat
查看进程内部的CatCache的状态信息,统计指标为polar_global_catcache_stat
的子集,相关含义也是一致的。
table 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
Global RelCache
polar_global_relcache_stat
您可以通过polar_global_relcache_stat
查看Global RelCache的相关状态。
table 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
polar_relcache_stat
您可以通过polar_relcache_stat
查看当前Session内部relcache的状态。
table polar_relcache_stat;
-[ RECORD 1 ]-+-------
nlookup | 293458
nlookup_miss | 4535
ninsert | 20239
ndelete | 3277
ninvalidate | 8856
nevict | 0
nevict_active | 0
evict_fail | 0