

# PostgreSQL 版本 18 中的自适应 autovacuum 增强功能
<a name="Appendix.PostgreSQL.CommonDBATasks.Autovacuum.AdaptivePG18"></a>

从 RDS for PostgreSQL 版本 18 开始，Amazon RDS 增强了自适应 autovacuum 机制，以便在数据库实例接近事务 ID 回绕时动态扩展 `autovacuum_max_workers`。在早期的 PostgreSQL 版本中，`autovacuum_max_workers` 需要在重启后才能更改。PostgreSQL 18 将 `autovacuum_max_workers` 作为动态参数，允许 Amazon RDS 对其进行调整而无需重启。

PostgreSQL 18 还引入了一个新参数 `autovacuum_worker_slots`，该参数在服务器启动时，为 autovacuum 工作线程保留后端进程槽。此参数设置可以同时运行的 autovacuum 工作线程的数量上限，`autovacuum_max_workers` 不能超过此值。与 `autovacuum_max_workers` 不同的是，`autovacuum_worker_slots` 需要在重启后才能更改。有关更多信息，请参阅 PostgreSQL 文档中的 [https://www.postgresql.org/docs/devel/runtime-config-vacuum.html#GUC-AUTOVACUUM-WORKER-SLOTS](https://www.postgresql.org/docs/devel/runtime-config-vacuum.html#GUC-AUTOVACUUM-WORKER-SLOTS)。

## 自适应 autovacuum 如何扩展工作线程
<a name="Appendix.PostgreSQL.CommonDBATasks.Autovacuum.AdaptivePG18.ScalingWorkers"></a>

当 PostgreSQL 18 实例上的 [https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-metrics.html](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-metrics.html) CloudWatch 指标超过 10 亿时，Amazon RDS 将使用以下公式，将 `autovacuum_max_workers` 增加到 `autovacuum_worker_slots` 值，该公式也是 `autovacuum_worker_slots` 参数的默认公式：

```
LEAST(GREATEST({DBInstanceClassMemory/32185783296}, 16), 32)
```

对于中小型实例（最高 512 GiB 内存），自适应 autovacuum 可扩展到 16 个工作线程。对于更大的实例，工作线程的数量会随内存大小按比例扩展，最大值为 32。例如，[db.m5.4xlarge](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Concepts.DBInstanceClass.Summary.html) 实例（64 GiB）的默认 `autovacuum_max_workers` 为 3。当 `MaximumUsedTransactionIDs` 超过 10 亿时，Amazon RDS 将其扩展到 16 个工作线程。

Amazon RDS 绝不会减少您已经配置的值。如果您配置的 `autovacuum_max_workers` 高于计算值，Amazon RDS 不会对其进行更改。

每个 autovacuum 工作线程最多使用的内存大小等于 `autovacuum_work_mem` 设置。当自适应 autovacuum 增加工作线程数量时，autovacuum 消耗的内存总量会按比例增加。例如，如果 `autovacuum_work_mem` 设置为 1 GB，则自适应 autovacuum 从 3 个工作线程扩展到 16 个工作线程，autovacuum 工作线程使用的最大内存将从 3 GB 增加到 16 GB。

**警告**  
请确保工作线程进程和内存的组合等于要分配给 autovacuum 的总内存。

## 监控自适应 autovacuum 更改
<a name="Appendix.PostgreSQL.CommonDBATasks.Autovacuum.AdaptivePG18.Monitoring"></a>

当 Amazon RDS 修改 `autovacuum_max_workers` 或任何其他 autovacuum 参数时，它会为受影响的数据库实例生成事件。您可以在 AWS 管理控制台中或通过 Amazon RDS API 查看这些事件。有关 RDS 事件的更多信息，请参阅 [Amazon RDS 事件类别和事件消息](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Events.Messages.html)。要在发生这些事件时接收通知，请参阅[订阅 Amazon RDS 事件通知](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Events.Subscribing.html)。

要查看当前的内存中 autovacuum 设置，请连接到数据库实例并运行以下命令：

```
SHOW autovacuum_max_workers;
```

参数组值不会更改。Amazon RDS 仅在数据库实例上的内存中修改这些参数。当 `MaximumUsedTransactionIDs` 降至低于阈值时，Amazon RDS 会将参数重置为参数组中的值并生成另一个事件。