在 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 数据库参数组创建的 Amazon RDS for PostgreSQL 数据库实例上,会默认启用 autovacuum。这些参数组包括 default.postgres10default.postgres11 等等。所有 PostgreSQL 数据库默认参数组都有设置为 1 的参数 rds.adaptive_autovacuum,从而激活该功能。默认情况下,还会设置与 Autovacuum 功能关联的其他配置参数。这些默认值是通用值,因此可以针对特定工作负载优化与 Autovacuum 功能关联的某些参数。

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

为 Autovacuum 分配内存

影响Autovacuum 性能的最重要参数之一是 autovacuum_work_mem 参数。在 Amazon 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 将需要多次遍历表的索引,从而显著增加所需的时间。

    元组标识符的大小为 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 警报。有关更多信息,请参阅 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 相关的参数重置回参数组中指定的值。然后,它会生成另一个与此更改对应的事件。