Timeout:VacuumDelay - Amazon Relational Database Service

Timeout:VacuumDelay

Timeout:VacuumDelay 事件表明已超过 vacuum 输入输出的成本限制,vacuum 进程已进入休眠状态。vacuum 操作在相应的成本延迟参数中指定的持续时间内停止,然后恢复工作。对于手动 vacuum 命令,延迟在 vacuum_cost_delay 参数中指定。对于 autovacuum 进程守护程序,延迟在 autovacuum_vacuum_cost_delay parameter. 中指定。

支持的引擎版本

RDS for PostgreSQL 的所有版本均支持此等待事件信息。

上下文

PostgreSQL 既有 autovacuum 进程守护程序,也有手动 vacuum 命令。RDS for PostgreSQL 数据库实例的 autovacuum 进程原定设置为“on”。手动 vacuum 命令可根据需要使用,例如,用于清除不活动元组表或生成新的统计数据。

在执行 vacuum 操作时,PostgreSQL 在系统执行各种输入输出操作时使用内部计数器来跟踪估计成本。当计数器达到由成本限制参数指定的值时,执行操作的进程将在成本延迟参数中指定的短暂持续时间内休眠。然后,它重置计数器并继续操作。

vacuum 进程具有可用于调节资源消耗的参数。autovacuum 和手动 vacuum 命令有自己的参数来设置成本限制值。它们也有自己的参数来指定成本延迟,即达到极限时让 vacuum 进入休眠状态的时间量。通过这种方式,成本延迟参数可以作为资源消耗的限制机制。在下面的列表中,您可以找到这些参数的说明。

影响 autovacuum 进程守护程序限制的参数
  • autovacuum_vacuum_cost_limit – 指定要在自动 vacuum 操作中使用的成本限制值。增加此参数的设置可使 Vacuum 进程使用更多资源并减少 Timeout:VacuumDelay 等待事件。

  • autovacuum_vacuum_cost_delay – 指定要在自动 vacuum 操作中使用的成本延迟值。原定设置值为 2 毫秒。将延迟参数设置为 0 会关闭限制机制,因此,不会出现 Timeout:VacuumDelay 等待事件。

有关更多信息,请参阅 PostgreSQL 文档中的 Automatic Vacuuming

影响限制手动 vacuum 进程的参数
  • vacuum_cost_limit – vacuum 进程进入休眠状态的阈值。原定设置情况下,此限制为 200。此数字表示各种资源所需的额外输入输出的累计成本估计值。增加此值会减少 Timeout:VacuumDelay 等待事件的数量。

  • vacuum_cost_delay – 达到 vacuum 成本限制时 vacuum 进程休眠的时间量。原定设置为 0,这意味着此功能关闭。您可以将其设置为整数值以指定开启此功能的毫秒数,但我们建议您将其保留为原定设置。

有关 vacuum_cost_delay 参数的更多信息,请参阅 PostgreSQL 文档中的资源消耗量

要了解有关如何在 RDS for PostgreSQL 中配置和使用 autovacuum 的更多信息,请参阅 在 Amazon RDS for PostgreSQL 上使用 PostgreSQL autovacuum

等待次数增加的可能原因

Timeout:VacuumDelay 受成本限制参数设置(vacuum_cost_limitautovacuum_vacuum_cost_limit)与控制 vacuum 的休眠持续时间的成本延迟参数(vacuum_cost_delayautovacuum_vacuum_cost_delay)之间平衡的影响。提高成本限制参数值允许 vacuum 在进入休眠状态之前使用更多资源。这样可以减少 Timeout:VacuumDelay 等待事件。增加任一延迟参数都会使 Timeout:VacuumDelay 等待事件发生的频率更高且持续的时间更长。

autovacuum_max_workers 参数设置还可以增加 Timeout:VacuumDelay 的数量。每个额外的 autovacuum 工作进程都有助于内部计数器机制,因此,与单个 autovacuum 工作进程相比,可以更快地达到限制。随着更快地达到成本限制,成本延迟会更频繁地生效,从而导致更多的 Timeout:VacuumDelay 等待事件。有关更多信息,请参阅 PostgreSQL 文档中的 autovacuum_max_workers

大型对象(如 500GB 或更大)也会引发此等待事件,因为 vacuum 可能需要一些时间才能完成处理大型对象。

操作

如果 vacuum 操作按预期完成,则无需补救。换句话说,此等待事件不一定表示有问题。它表示 vacuum 在延迟参数中指定的时间段内进入休眠状态,以便可以将资源应用于需要完成的其他进程。

如果您希望更快地完成 vacuum 操作,可以降低延迟参数。这可缩短 vacuum 休眠的时间。