WAIT EVENT · TIMEOUT超时
TimeoutVacuumDelay
在一个基于代价的清理延迟点。
Waiting in a cost-based vacuum delay point
超时 引入 13 现存至 20 devel 0 次变动 实测触发图谱档案
版本轨迹
相对 PostgreSQL 17 无变化。
各版本描述
相邻版本里类型、名称与英文描述都相同的合并成一段,旧的在前。中文取自图谱或本站手册译文,没有译文的只给英文原文。
-
1320
TimeoutVacuumDelay在一个基于代价的清理延迟点。
Waiting in a cost-based vacuum delay point.
触发机制
WAIT_EVENT_VACUUM_DELAY 位于 src/backend/commands/vacuum.c:2495,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:182。探针覆盖的操作是:在基于成本的 vacuum 延迟点等待。VacuumDelay 路径有意等待计时器、重试间隔、节流或安全退避;latch 超时后才重新评估工作。
WAIT_EVENT_VACUUM_DELAY at src/backend/commands/vacuum.c:2495 is the grep-verified reporting path. The public identity/resource is mapped at src/backend/utils/activity/wait_event_names.txt:182. The instrumented operation is: Waiting in a cost-based vacuum delay point. The VacuumDelay path deliberately waits on a timer, retry interval, throttle, or safety backoff. The latch timeout expires before work is reconsidered.
通常正常
当配置策略是有意的,而且有效工作按预期速率推进时,这项等待正常。
The wait is normal when the configured policy is intentional and useful work advances at the expected rate.
值得警惕
策略导致维护、恢复、备份或延迟目标无法达成,或者 spin delay 持续时,应当调查。
Investigate when the policy causes missed maintenance, recovery, backup, or latency objectives, or when a spin delay persists.
诊断 SQL
直接在 psql 里跑;标注的是语句里用到的视图与列所要求的最低版本。
正在等待 Timeout/VacuumDelay 的会话Sessions waiting on Timeout/VacuumDelay
PG ≥ 13SELECT pid, backend_type, usename, datname, application_name,
state, now() - query_start AS query_age,
now() - xact_start AS xact_age,
wait_event_type, wait_event,
pg_blocking_pids(pid) AS blocking_pids,
left(query, 160) AS query
FROM pg_stat_activity
WHERE wait_event_type = 'Timeout'
AND wait_event = 'VacuumDelay'
ORDER BY query_age DESC NULLS LAST;
当前 Timeout 等待分布Current Timeout cohort
PG ≥ 13SELECT wait_event, count(*) AS waiting_sessions,
count(*) FILTER (WHERE state = 'active') AS active_waiters,
max(now() - query_start) AS oldest_query
FROM pg_stat_activity
WHERE wait_event_type = 'Timeout'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文Lock and relation context for these sessions
PG ≥ 13SELECT a.pid, l.locktype, l.mode, l.granted, l.fastpath,
d.datname, n.nspname, c.relname,
l.page, l.tuple, l.virtualxid, l.transactionid,
l.classid, l.objid, l.objsubid
FROM pg_stat_activity AS a
LEFT JOIN pg_locks AS l ON l.pid = a.pid
LEFT JOIN pg_database AS d ON d.oid = l.database
LEFT JOIN pg_class AS c
ON c.oid = l.relation
AND l.database = (
SELECT oid FROM pg_database WHERE datname = current_database()
)
LEFT JOIN pg_namespace AS n ON n.oid = c.relnamespace
WHERE a.wait_event_type = 'Timeout'
AND a.wait_event = 'VacuumDelay'
ORDER BY a.pid, l.granted, l.locktype, l.mode;
处置步骤
- 确认拥有该计时器的 GUC 或函数。
- 比较有效工作量与延迟时间。
- 先检查它原本要控制的 CPU、I/O 与持久性压力,再调整策略。
英文原文
- Identify the GUC or function that owns the timer.
- Compare productive work with time spent delayed.
- Adjust the policy only after checking the CPU, I/O, and durability pressure it was designed to control.
相关参数与指标
autovacuum_naptime
waiting_sessionswait_event_shareoldest_transaction_age
源码证据
图谱在各版本源码树里核对到的位置,新的在前。「触发点」是真正上报等待事件的调用处,「目录定义」只说明这个名字在枚举里存在。
PostgreSQL 18REL_18_6
-
src/backend/commands/vacuum.c:2495WAIT_EVENT_VACUUM_DELAY触发点实测触发pgstat_report_wait_start(WAIT_EVENT_VACUUM_DELAY); -
src/backend/utils/activity/wait_event_names.txt:182VACUUM_DELAY目录定义实测触发VACUUM_DELAY "Waiting in a cost-based vacuum delay point."
演化历史
相邻两个大版本之间的差异,新的在前。版本号链到该版的变动清单。
-
PostgreSQL 13 ← 12 新增此事件
该版起出现
在一个基于代价的清理延迟点。
同类事件
| 事件 | 引入 | 版本变动 | 最近变动 |
|---|---|---|---|
BaseBackupThrottle档案
|
10 | — | |
| 基础备份期间,因限速而等待。 | 现存 | ||
CheckpointWriteDelay档案
|
14 | — | |
| 执行检查点时,在两次写入之间等待。 | 现存 | ||
CommitDelay
|
19 | — | |
| 等待 WAL 刷盘前的提交延迟。 | 现存 | ||
PgSleep档案
|
10 | 131 次 | |
| 因调用 pg_sleep 或同类函数而等待。 | 现存 | ||
RecoveryApplyDelay档案
|
10 | 131 次 | |
| 恢复期间,因延迟设置而等待应用 WAL。 | 现存 | ||
RecoveryRetrieveRetryInterval档案
|
13 | — | |
| 恢复期间,当所有来源(pg_wal、归档或流式传输)均无 WAL 数据可用时等待。 | 现存 | ||
RegisterSyncRequest档案
|
12 | — | |
| 由于请求队列已满,在向 checkpointer 发送同步请求时等待。 | 现存 | ||
SpinDelay档案
|
16 | — | |
| 获取发生争用的 spinlock 时等待。 | 现存 | ||
VacuumDelay档案
|
13 | — | |
| 在基于成本的 vacuum 延迟点等待。 | 现存 | ||
VacuumTruncate档案
|
15 | — | |
| 等待获取独占锁,以截去正在执行 vacuum 的表末尾所有空页。 | 现存 | ||
WalSummarizerError档案
|
17 | — | |
| WAL summarizer 出错后等待。 | 现存 | ||