在 Amazon RDS for PostgreSQL 上使用 PostgreSQL autovacuum - Amazon Relational Database Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Amazon RDS for PostgreSQL 上使用 PostgreSQL autovacuum

我们强烈建议您使用 Autovacuum 功能来保持 PostgreSQL 数据库实例正常运行。Autovacuum 自动启动 VACUUM 和 ANALYZE 命令。它会检查包含大量插入的、更新的或删除的元组的表。进行此检查后,它会通过从 PostgreSQL 数据库中删除过时的数据或元组来回收存储。

在使用任何默认 PostgreSQL 数据库参数组创建的 RDS for PostgreSQL 数据库实例上,会默认启用 autovacuum。默认情况下,还会设置与 Autovacuum 功能关联的其他配置参数。这些默认值是通用值,因此可以针对特定工作负载优化与 Autovacuum 功能关联的某些参数。

在下文中,您可以了解有关 autovacuum 功能以及如何为 RDS for PostgreSQL 数据库实例优化其部分参数的更多信息。有关高级信息,请参阅使用 PostgreSQL 的最佳实践

为 Autovacuum 分配内存

影响Autovacuum 性能的最重要参数之一是 autovacuum_work_mem 参数。在 RDS for PostgreSQL 版本 14 及更早版本中,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_memautovacuum_work_mem 设置为至少 1 GB,可以提高对包含大量无效元组的表执行 vacuum 操作的性能。但是,在 PostgreSQL 版本 16 及更早版本中,vacuum 的内存使用量上限为 1 GB,这足以单次处理大约 1.79 亿个无效元组。如果表的无效元组比这更多,vacuum 将需要多次遍历表的索引,从而显著增加所需的时间。从 PostgreSQL 版本 17 开始,没有 1 GB 的限制,自动真空可以使用基数树处理超过 1.79 亿个元组。

    元组标识符的大小为 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 参数值的机制。适应性 autovacuumRDS 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 警报。有关更多信息,请参阅 Amazon 数据库博客上的贴子在 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 SQL 命令。

当 Amazon RDS 修改其中任何 autovacuum 参数时,它会为受影响的数据库实例生成事件。此事件在 Amazon Web Services Management Console 上和通过 Amazon RDS API 显示。在 MaximumUsedTransactionIDs CloudWatch 指标返回的值低于阈值后,Amazon RDS 会将内存中与 autovacuum 相关的参数重置回参数组中指定的值。然后,它会生成另一个与此更改对应的事件。