为了降低长连接的内存占用,确保数据库不会因为过多的长连接而导致内存不足,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,表示关闭该功能。 |
|