在 Amazon RDS for PostgreSQL 上使用 PostgreSQL autovacuum
我们强烈建议您使用 Autovacuum 功能来保持 PostgreSQL 数据库实例正常运行。Autovacuum 自动启动 VACUUM 和 ANALYZE 命令。它会检查包含大量插入的、更新的或删除的元组的表。进行此检查后,它会通过从 PostgreSQL 数据库中删除过时的数据或元组来回收存储。
在使用任何默认 PostgreSQL 数据库参数组创建的 Amazon RDS for PostgreSQL 数据库实例上,会默认启用 autovacuum。这些参数组包括 default.postgres10
、default.postgres11
等等。所有 PostgreSQL 数据库默认参数组都有设置为 1
的参数 rds.adaptive_autovacuum
,从而激活该功能。默认情况下,还会设置与 Autovacuum 功能关联的其他配置参数。这些默认值是通用值,因此可以针对特定工作负载优化与 Autovacuum 功能关联的某些参数。
在下文中,您可以了解有关 autovacuum 功能以及如何为 RDS for PostgreSQL 数据库实例优化其部分参数的更多信息。有关高级信息,请参阅 使用 PostgreSQL 的最佳实践。
主题
为 Autovacuum 分配内存
影响Autovacuum 性能的最重要参数之一是 autovacuum_work_mem
autovacuum_work_mem
参数设置为 -1,表示改用 maintenance_work_mem
的设置。对于所有其它版本,autovacuum_work_mem
由 GREATEST({DBInstanceClassMemory/32768}, 65536) 决定。
手动 vacuum 操作始终使用 maintenance_work_mem
设置,默认设置为 GREATEST({DBInstanceClassMemory/63963136*1024}, 65536),也可以使用 SET
命令在会话级别对其进行调整,以进行更有针对性的手动 VACUUM
操作。
autovacuum_work_mem
确定 autovacuum 在对索引执行 vacuum 操作时,用于容纳无效元组 (pg_stat_all_tables.n_dead_tup
) 的标识符的内存。
当执行计算以确定 autovacuum_work_mem
参数的值时,请注意以下事项:
-
如果将此参数设得过低,则 vacuum 过程可能必须扫描表多次才能完成其工作。此类多次扫描可能会对性能产生负面影响。对于较大的实例,将
maintenance_work_mem
或autovacuum_work_mem
设置为至少 1 GB,可以提高对包含大量无效元组的表执行 vacuum 操作的性能。但是,在 PostgreSQL 版本 16 及更早版本中,vacuum 的内存使用量上限为 1 GB,这足以单次处理大约 1.79 亿个无效元组。如果表的无效元组比这更多,vacuum 将需要多次遍历表的索引,从而显著增加所需的时间。元组标识符的大小为 6 个字节。要估算对表的索引执行 vacuum 操作所需的内存,请查询
pg_stat_all_tables.n_dead_tup
来找到无效元组的数量,然后将该数字乘以 6,以确定单次对索引执行 vacuum 操作所需的内存。您可以使用以下查询:SELECT relname AS table_name, n_dead_tup, pg_size_pretty(n_dead_tup * 6) AS estimated_memory FROM pg_stat_all_tables WHERE relname = '
name_of_the_table
'; -
autovacuum_work_mem
参数可与autovacuum_max_workers
参数结合使用。autovacuum_max_workers
中的每个工作进程均可使用您分配的内存。如果您有多个小型表,请分配更多的autovacuum_max_workers
和更少的autovacuum_work_mem
。如果您拥有大型表(大于 100 GB),请分配更多内存和更少的工作进程。您需要分配有足够的内存才能对最大的表成功完成操作。因此,请确保工作进程和内存的组合等于要分配的总内存。
减少事务 ID 重叠的可能性
在一些情况下,与 Autovacuum 相关的参数组设置可能不够积极,无法阻止事务 ID 重叠。为解决此问题,RDS for PostgreSQL 提供了自动调整 Autovacuum 参数值的机制。适应性 Autovacuum 参数优化 是 RDS for PostgreSQL 的一项功能。在 PostgreSQL 文档中找到了 TransactionID 重叠
默认情况下,为动态参数 rds.adaptive_autovacuum
设置为 ON 的 RDS for PostgreSQL 实例启用适应性 autovacuum 参数优化。强烈建议您保持启用此选项。不过,要关闭适应性 Autovacuum 参数优化,请将 rds.adaptive_autovacuum
参数设置为 0 或 OFF。
即使在 Amazon RDS 优化 Autovacuum 参数时,仍可能出现事务 ID 重叠。鼓励您为事务 ID 重叠实施 Amazon CloudWatch 警报。有关更多信息,请参阅 AWS 数据库博客上的贴子在 RDS for PostgreSQL 中为事务 ID 重叠实施预警系统
启用适应性 autovacuum 参数优化后,当 CloudWatch 指标 MaximumUsedTransactionIDs
达到 autovacuum_freeze_max_age
参数值或 500000000 中的较大值时,Amazon RDS 将开始调整 autovacuum 参数。
如果表继续倾向于事务 ID 重叠,则 Amazon RDS 将继续调整 autovacuum 的参数。其中每次调整都会将更多资源专用于 Autovacuum 以避免重叠。Amazon RDS 更新以下与 Autovacuum 相关的参数:
仅当新值使 Autovacuum 更积极时,RDS 才会修改这些参数。在数据库实例上的内存中修改参数。不会更改参数组中的值。要查看当前内存中的设置,请使用 PostgreSQL SHOW
当 Amazon RDS 修改其中任何 autovacuum 参数时,它会为受影响的数据库实例生成事件。此事件在 AWS Management Console 上和通过 Amazon RDS API 显示。在 MaximumUsedTransactionIDs
CloudWatch 指标返回的值低于阈值后,Amazon RDS 会将内存中与 autovacuum 相关的参数重置回参数组中指定的值。然后,它会生成另一个与此更改对应的事件。