本文介紹了全域中繼資料快取(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。取值如下:
|
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