我正在运行 Postgres 14.6,并且有许多会话描述wait event
为Timeout: VacuumDelay
. 会话正在运行的 SQL 是......
autovacuum: VACUUM public.mytable_202110 (to prevent wraparound)
(此信息是从 pgAdmin4 的仪表板上收集的)
我有很多问题
- 这些会话以红色突出显示,这是否意味着存在问题?
- 查询在许多小时前开始,而状态最近没有改变,这很重要吗?
- 这个会话真的在告诉我吗?它现在正在积极地吸尘吗?还是在等待机会开始 VACUUMing?或者它是一个不相关的会话,说在 VACUUMing 完成之前它不能做任何事情?
- 被 VACUUMed 的表非常旧,非常大并且很少更改。他们需要被抽真空吗?
没有列出任何阻塞 PIDS,并且已授予所有锁。数据库已启动并正在运行(尽管速度很慢)
更新——这可能是相关的,这个数据库刚刚从一台旧的、慢的服务器转移到一台更新更好的机器上。我希望看到明显更好的性能,但我猜测表上的统计数据和分析数据不会与原始数据一起传输,因此新数据库花费了大量资源来分析旧的存档数据。
Autovacuum 自我节流,以避免使用系统上的所有(或超过您想要的)IO 容量。这就是你所看到的。这是有道理的,如果它正在使用节流,它会把大部分时间花在节流上。毕竟,仅仅为了让它自己减速 2% 而实施节流是没有意义的。查看 pg_stat_activity 可能会显示它大部分时间都在等待油门,但每次都是不同的睡眠调用,而不是一次长调用。
也许您的油门设置不是您的设置的最佳选择。您可以通过降低 autovacuum_vacuum_cost_delay 或增加 autovacuum_vacuum_cost_limit 来加快运行速度。不幸的是,更改这些设置不会更改当前运行的吸尘器使用的值,因此您需要取消它们以便它们可以采用新设置。而且您说您的数据库已经运行缓慢,因此让吸尘器使用更多资源可能是错误的方向。
“(以防止回绕)”确实需要每 20 亿个事务发生一次真空,即使表很大、很旧并且很少更改。如果几乎所有页面都标记为已冻结,那么执行该 vacuum 操作应该非常快——但这对您第一次对这些表进行 vacuum 操作以冻结元组没有帮助。
是的。这不是常规的 vacuum,而是防止 wraparound 的vacuum 。时不时地,这样的真空处理每个表,好吧,以防止环绕。
两个都。这是一个主动运行的真空吸尘器,它故意减慢自身速度(按
autovacuum_vacuum_cost_delay
时间量)以减少系统负载。您可以继续工作,这是一个常规的后台进程。但是,“防止环绕真空”将阻止您由于冲突锁而更改表的结构。
系统视图pg_stat_progress_vacuum可以为您提供有关 vacuum 进度的更多详细信息。大表,尤其是带有大 的表
autovacuum_vacuum_cost_delay
,可能需要几天的时间来处理。PS:不知道为什么 pgAdmin4 可能会用红色突出显示进程。