全部產品
Search
文件中心

PolarDB:全域中繼資料快取

更新時間:Jul 06, 2024

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

  • on(預設):開啟Global CatCache功能。

  • off:關閉Global CatCache功能。

polar_enable_global_relcache

PGC_USERSET

用於開啟或關閉Global RelCache。取值如下:

  • on(預設):開啟Global RelCache功能。

  • off:關閉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

查詢未命中的次數。結合nlookup可以評估Global Cache的命中率,系統啟動前期命中率可能會比較低,隨著緩衝的預熱,命中率會慢慢提高。此外需要設定合適的容量來保證Global Cache的命中率,以免影響效能。

ninsert

緩衝新插入次數。

nmove、ndelete

擴縮容期間緩衝對象被移動和刪除的次數。

ninvalidate

緩衝失效次數。

nflush

由於特殊緩衝失效訊息或者drop database;等導致沖刷整個緩衝的次數。

nevict

Global Cache淘汰的總個數。

說明

Global Cache中的對象按照LRU進行淘汰,分為active list和nactive list,優先淘汰inactive list中的緩衝。而淘汰的過程中,可能因為當前的對象正在使用或者一些並發衝突導致按照LRU策略應該淘汰的對象卻無法淘汰,這種情況無需關心。

nevict相關指標不為0說明當前容量不足,為避免影響效能,可以通過polar_global_catcache_sizepolal_global_relcache_size參數調大容量。

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