缓存淘汰

为了降低长连接的内存占用,确保数据库不会因为过多的长连接而导致内存不足,RDS PostgreSQL支持进程级的缓存淘汰功能,使用LRU(Least Recently Used)的策略释放不常使用的缓存,从而降低连接的内存使用量,提升实例的稳定性。

前提条件

RDS PostgreSQL 11及以上版本均支持此功能,如提示不支持,请升级内核小版本,具体操作请参见升级内核小版本

背景信息

PostgreSQL中,后端进程每访问到一个表,会将该表的元信息缓存到本地,并且这些缓存不会被主动释放,以减少后续对磁盘的访问。这导致长连接可能会积累大量的缓存,并导致内存溢出(OOM)。因此,为了提高RDS PostgreSQL的稳定性,需要引入缓存淘汰机制,及时释放不常用的缓存。

应用场景

具有大量长连接的SAAS场景

影响

本文中涉及修改的参数均不涉及重启实例。

注意事项

为了确保RDS PostgreSQL实例的正常运行,一些特殊的缓存信息无法淘汰,因此,在极端情况下,无法保证您设置的缓存上限被完全满足。

操作步骤

RDS PostgreSQL的连接缓存主要可分为 relcache(用于缓存用户表的元信息),syscache(用于缓存系统表的元组)和 plancache(用于缓存用户定义的执行计划)。RDS PostgreSQL当前支持通过参数设置,调整relcachesyscache保留缓存的数量,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_relationsrds_syscache_max_cached_tuples。更多信息,请参见设置实例参数

相关参数解释

参数名

参数说明

取值建议

rds_enable_cache_monitor

是否监控每个进程的缓存使用量。

取值范围:

  • on:监控

  • off(默认值):不监控

根据实际需要进行设置。

rds_relcache_max_cached_relations

单个连接缓存用户表数量的上限。

取值范围:[-1, INT_MAX]

默认值:-1,表示关闭该功能。

  • 该参数合适的取值与用户业务关系密切。业务涉及到的表数量越多,该值应该越大。

  • 如果使用了分区表或timescaledb等插件,则建议设置为-1关闭该功能,或者将该参数设置为较大的值。

  • 如果该值设置过小,会导致数据库性能下降,推荐该值不低于 1000。

rds_syscache_max_cached_tuples

单个连接缓存系统表元组数量的上限。

取值范围:[-1, INT_MAX]

默认值:-1,表示关闭该功能。

  • 该参数合适的取值与用户业务关系密切。表的数量,字段越多,该值应该越大。

  • 如果使用了分区表或timescaledb等插件,则建议设置为-1关闭该功能,或者将该参数设置为较大的值。

  • 如果该值设置过小,会导致数据库性能下降,推荐该值不低于 5000。