本文介紹了全局元數據緩存(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