為了降低長串連的記憶體佔用,確保資料庫不會因為過多的長串連而導致記憶體不足,RDS PostgreSQL支援進程級的緩衝淘汰功能,使用LRU(Least Recently Used)的策略釋放不常使用的緩衝,從而降低串連的記憶體使用量量,提升執行個體的穩定性。
前提條件
RDS PostgreSQL 11及以上版本均支援此功能,如提示不支援,請升級核心小版本,具體操作請參見升級核心小版本。
背景資訊
PostgreSQL中,後端進程每訪問到一個表,會將該表的元資訊緩衝到本地,並且這些緩衝不會被主動釋放,以減少後續對磁碟的訪問。這導致長串連可能會積累大量的緩衝,並導致記憶體溢出(OOM)。因此,為了提高RDS PostgreSQL的穩定性,需要引入緩衝淘汰機制,及時釋放不常用的緩衝。
應用情境
具有大量長串連的SAAS情境
影響
本文中涉及修改的參數均不涉及重啟執行個體。
注意事項
為了確保RDS PostgreSQL執行個體的正常運行,一些特殊的緩衝資訊無法淘汰,因此,在極端情況下,無法保證您設定的緩衝上限被完全滿足。
操作步驟
RDS PostgreSQL的串連緩衝主要可分為 relcache
(用於緩衝使用者表的元資訊),syscache
(用於緩衝系統資料表的元組)和 plancache
(用於緩衝使用者定義的執行計畫)。RDS PostgreSQL當前支援通過參數設定,調整relcache
和syscache
保留緩衝的數量,plancache
不支援限制。
如果期望監控每個進程的緩衝使用量,還需要使用CREATE EXTENSION rdsutils
安裝依賴外掛程式,同時通過參數設定功能修改參數rds_enable_cache_monitor
取值為on
。
參數
rds_enable_cache_monitor
設定為on
時,資料庫效能會有下降,每條SQL會額外耗時2毫秒左右。參數
rds_enable_cache_monitor
只能通過控制台修改,更多資訊,請參見設定執行個體參數。
修改當前串連
-- 當前串連開啟 relcache 的淘汰功能,最多緩衝 1000 個使用者表
SET rds_relcache_max_cached_relations = 1000;
-- 關閉當前串連 relcache 的淘汰功能
SET rds_relcache_max_cached_relations = -1;
-- 當前串連開啟 syscache 的淘汰功能,最多緩衝 10000 系統資料表的元組
set rds_syscache_max_cached_tuples = 10000;
-- 關閉當前串連 syscache 的淘汰功能
set rds_syscache_max_cached_tuples = -1;
設定所有串連
前往控制台設定參數rds_relcache_max_cached_relations
和rds_syscache_max_cached_tuples
。更多資訊,請參見設定執行個體參數。
相關參數解釋
參數名 | 參數說明 | 取值建議 |
rds_enable_cache_monitor | 是否監控每個進程的緩衝使用量。 取值範圍:
| 根據實際需要進行設定。 |
rds_relcache_max_cached_relations | 單個串連緩衝使用者表數量的上限。 取值範圍:[-1, INT_MAX] 預設值:-1,表示關閉該功能。 |
|
rds_syscache_max_cached_tuples | 單個串連緩衝系統資料表元組數量的上限。 取值範圍:[-1, INT_MAX] 預設值:-1,表示關閉該功能。 |
|