Global CatCache

本文介绍了PolarDB PostgreSQL版(兼容Oracle)的Global CatCache功能。

背景信息

原生PostgreSQL将Cat/Sys Cache保存在各个进程私有内存中,在连接数较多时,会消耗较多内存,部分极端场景下甚至出现OOM的风险。

PolarDB PostgreSQL版(兼容Oracle)引用了Global CatCache功能,将Cat/Sys Cache保存在所有进程都可以访问的共享内存中,确保Cat/Sys Cache的内存消耗不再受连接数的影响,大大提高了服务稳定性。

参数说明

参数

级别

说明

polar_enable_global_catcache

PGC_USERSET

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

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

  • off:关闭Global CatCache功能。

polar_global_catcache_size

PGC_SIGHUP

用于设置Global CatCache的容量大小。保持默认值即可,单位为MB。

说明

可以根据需求调整Global CatCache容量,一般使用默认值即可。

polar_catcache_size

USERSET

用于设置进程内部CatCache容量大小,即每个进程内部的CatCache可以缓存的缓存对象个数。可以针对单个Session设置,也可以全局设置。

监控

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

create extension polar_global_cache;

polar_global_catcache_stat视图

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

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

指标说明:

指标

说明

nlookup

查询次数。

nlookup_miss

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

ninsert

新插入次数。

ndelete

删除次数。正常情况下为0,缩容时可能会递增。

ninvalidate

失效次数。

nflush

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

neivct

Global CatCache淘汰的总个数。

说明

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

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

neivct_active

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

neivct_fail

Global CatCache淘汰失败的次数。

rehash_fail

Global CatCache内部的管理hash table可能因为内存不足导致rehash失败的次数。

meta_alloc_fail

Global CatCache内部相关元数据共享内存分配失败,可以通过调大polar_global_cache_meta_pool_size容量解决。

data_alloc_fail

Global CatCache容量不足,可以通过polar_global_catcache_size调大容量。

polar_catcache_stat视图

您可以通过polar_catcache_stat视图查看进程内部的CatCache的状态信息。

指标为polar_global_catcache_stat的子集,指标说明和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      | 4