跳转到主要内容

这是本节的多页打印视图。 .

返回本页常规视图.

Activity 等待

后台进程在主循环中休眠,等待新工作到来。

Activity 多数时候只是健康后台进程空闲时的声音。Archiver、checkpointer、WAL writer、autovacuum launcher、复制 worker 等进程在主循环中等待时会报告各自的名称。

按 backend type 解释

这些事件不应进入前台“等待会话比例”的分母。应把事件与 backend_type 对照,并询问该进程此刻是否本来就该有工作。

  • 正常: 一个匹配的后台进程在文档说明的主循环中等待。
  • 关注: 事件出现在错误的后端类型、进程缺失,或工作队列增长但它仍空闲。
  • 紧急: 必需的后台进度停止——归档积压、不再产生检查点、复制不推进,或关闭无法完成。

值得先认出的事件

事件 预期进程
AutovacuumMain 调度周期之间的 autovacuum launcher
CheckpointerMain 等待工作的 checkpointer
WalWriterMain WAL writer 主循环
ArchiverMain 等待完整 WAL 段的 archiver
WalReceiverMain WAL receiver 主循环
RecoveryWalStream startup 进程等待流式 WAL
IoWorkerMain PG18 异步 I/O worker 等待工作

常见误读

  • Activity 在所有后端中占比很高,可能只说明集群很空闲。
  • 空闲的 checkpointer 不表示检查点被禁用。
  • 正常的等待名称并不能证明进度正常;还要检查队列、积压与时间戳。
  • 缺少本应存在的后台进程,通常比看到它的 Activity 等待更重要。

1 - Activity: ArchiverMain

在 archiver 进程的主循环中等待。
PostgreSQL 等待事件档案
类别Activity 事件ArchiverMain 版本PG 13-18 证据2 个源码位置

官方描述译文

在 archiver 进程的主循环中等待。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

触发机制

WAIT_EVENT_ARCHIVER_MAIN 位于 src/backend/postmaster/pgarch.c:362,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:54。探针覆盖的操作是:在 archiver 进程的主循环中等待。ArchiverMain 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/ArchiverMain 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'ArchiverMain'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'ArchiverMain'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

2 - Activity: AutovacuumMain

在 autovacuum launcher 进程的主循环中等待。
PostgreSQL 等待事件档案
类别Activity 事件AutovacuumMain 版本PG 17-18 证据4 个源码位置

官方描述译文

在 autovacuum launcher 进程的主循环中等待。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

历史名称:Activity/AutoVacuumMain (PG 13-16)

触发机制

WAIT_EVENT_AUTOVACUUM_MAIN 位于 src/backend/postmaster/autovacuum.c:667,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:216。探针覆盖的操作是:在 autovacuum launcher 进程的主循环中等待。AutovacuumMain 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/AutovacuumMain 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'AutovacuumMain'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'AutovacuumMain'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

3 - Activity: BgwriterHibernate

在后台写入器进程休眠时等待。
PostgreSQL 等待事件档案
类别Activity 事件BgwriterHibernate 版本PG 17-18 证据4 个源码位置

官方描述译文

在后台写入器进程休眠时等待。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

历史名称:Activity/BgWriterHibernate (PG 13-16)

触发机制

WAIT_EVENT_BGWRITER_HIBERNATE 位于 src/backend/postmaster/bgwriter.c:339,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:219。探针覆盖的操作是:在后台写入器进程休眠时等待。BgwriterHibernate 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/BgwriterHibernate 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'BgwriterHibernate'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'BgwriterHibernate'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

4 - Activity: BgwriterMain

在后台写入器进程的主循环中等待。
PostgreSQL 等待事件档案
类别Activity 事件BgwriterMain 版本PG 17-18 证据4 个源码位置

官方描述译文

在后台写入器进程的主循环中等待。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

历史名称:Activity/BgWriterMain (PG 13-16)

触发机制

WAIT_EVENT_BGWRITER_MAIN 位于 src/backend/postmaster/bgwriter.c:311,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:222。探针覆盖的操作是:在后台写入器进程的主循环中等待。BgwriterMain 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/BgwriterMain 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'BgwriterMain'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'BgwriterMain'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

5 - Activity: CheckpointerMain

在 checkpointer 进程的主循环中等待。
PostgreSQL 等待事件档案
类别Activity 事件CheckpointerMain 版本PG 13-18 证据2 个源码位置

官方描述译文

在 checkpointer 进程的主循环中等待。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

触发机制

WAIT_EVENT_CHECKPOINTER_MAIN 位于 src/backend/postmaster/checkpointer.c:583,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:58。探针覆盖的操作是:在 checkpointer 进程的主循环中等待。CheckpointerMain 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/CheckpointerMain 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'CheckpointerMain'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'CheckpointerMain'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

6 - Activity: CheckpointerShutdown

等待 checkpointer 进程终止。
PostgreSQL 等待事件档案
类别Activity 事件CheckpointerShutdown 版本PG 18 证据2 个源码位置

官方描述译文

等待 checkpointer 进程终止。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

触发机制

WAIT_EVENT_CHECKPOINTER_SHUTDOWN 位于 src/backend/postmaster/checkpointer.c:631,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:59。探针覆盖的操作是:等待 checkpointer 进程终止。CheckpointerShutdown 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/CheckpointerShutdown 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'CheckpointerShutdown'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'CheckpointerShutdown'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

7 - Activity: IoWorkerMain

在 I/O worker 进程的主循环中等待。
PostgreSQL 等待事件档案
类别Activity 事件IoWorkerMain 版本PG 18 证据2 个源码位置

官方描述译文

在 I/O worker 进程的主循环中等待。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

触发机制

WAIT_EVENT_IO_WORKER_MAIN 位于 src/backend/storage/aio/method_worker.c:573,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:60。探针覆盖的操作是:在 I/O worker 进程的主循环中等待。IoWorkerMain 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/IoWorkerMain 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'IoWorkerMain'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'IoWorkerMain'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

8 - Activity: LogicalApplyMain

在逻辑复制 apply 进程的主循环中等待。
PostgreSQL 等待事件档案
类别Activity 事件LogicalApplyMain 版本PG 13-18 证据2 个源码位置

官方描述译文

在逻辑复制 apply 进程的主循环中等待。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

触发机制

WAIT_EVENT_LOGICAL_APPLY_MAIN 位于 src/backend/replication/logical/worker.c:3766,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:61。探针覆盖的操作是:在逻辑复制 apply 进程的主循环中等待。LogicalApplyMain 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/LogicalApplyMain 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'LogicalApplyMain'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'LogicalApplyMain'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

9 - Activity: LogicalLauncherMain

在逻辑复制 launcher 进程的主循环中等待。
PostgreSQL 等待事件档案
类别Activity 事件LogicalLauncherMain 版本PG 13-18 证据2 个源码位置

官方描述译文

在逻辑复制 launcher 进程的主循环中等待。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

触发机制

WAIT_EVENT_LOGICAL_LAUNCHER_MAIN 位于 src/backend/replication/logical/launcher.c:1242,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:62。探针覆盖的操作是:在逻辑复制 launcher 进程的主循环中等待。LogicalLauncherMain 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/LogicalLauncherMain 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'LogicalLauncherMain'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'LogicalLauncherMain'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

10 - Activity: LogicalParallelApplyMain

在逻辑复制并行 apply 进程的主循环中等待。
PostgreSQL 等待事件档案
类别Activity 事件LogicalParallelApplyMain 版本PG 16-18 证据2 个源码位置

官方描述译文

在逻辑复制并行 apply 进程的主循环中等待。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

触发机制

WAIT_EVENT_LOGICAL_PARALLEL_APPLY_MAIN 位于 src/backend/replication/logical/applyparallelworker.c:810,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:63。探针覆盖的操作是:在逻辑复制并行 apply 进程的主循环中等待。LogicalParallelApplyMain 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/LogicalParallelApplyMain 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'LogicalParallelApplyMain'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'LogicalParallelApplyMain'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

11 - Activity: PgStatMain

在统计收集器进程的主循环中等待。
PostgreSQL 等待事件档案
类别Activity 事件PgStatMain 版本PG 13-14 证据2 个源码位置

官方描述译文

在统计收集器进程的主循环中等待。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

触发机制

WAIT_EVENT_PGSTAT_MAIN 位于 src/backend/postmaster/pgstat.c:3425,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:234。探针覆盖的操作是:在统计收集器进程的主循环中等待。PgStatMain 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/PgStatMain 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'PgStatMain'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'PgStatMain'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

12 - Activity: RecoveryWalStream

流式恢复期间,在 startup 进程的主循环中等待 WAL 到达。
PostgreSQL 等待事件档案
类别Activity 事件RecoveryWalStream 版本PG 13-18 证据2 个源码位置

官方描述译文

流式恢复期间,在 startup 进程的主循环中等待 WAL 到达。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

触发机制

WAIT_EVENT_RECOVERY_WAL_STREAM 位于 src/backend/access/transam/xlogrecovery.c:4038,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:64。探针覆盖的操作是:流式恢复期间,在 startup 进程的主循环中等待 WAL 到达。RecoveryWalStream 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/RecoveryWalStream 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'RecoveryWalStream'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'RecoveryWalStream'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

13 - Activity: ReplicationSlotsyncMain

在复制槽同步 worker 的主循环中等待。
PostgreSQL 等待事件档案
类别Activity 事件ReplicationSlotsyncMain 版本PG 17-18 证据2 个源码位置

官方描述译文

在复制槽同步 worker 的主循环中等待。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

触发机制

WAIT_EVENT_REPLICATION_SLOTSYNC_MAIN 位于 src/backend/replication/logical/slotsync.c:1369,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:65。探针覆盖的操作是:在复制槽同步 worker 的主循环中等待。ReplicationSlotsyncMain 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/ReplicationSlotsyncMain 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'ReplicationSlotsyncMain'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'ReplicationSlotsyncMain'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

14 - Activity: ReplicationSlotsyncShutdown

等待复制槽同步 worker 停止运行。
PostgreSQL 等待事件档案
类别Activity 事件ReplicationSlotsyncShutdown 版本PG 17-18 证据2 个源码位置

官方描述译文

等待复制槽同步 worker 停止运行。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

触发机制

WAIT_EVENT_REPLICATION_SLOTSYNC_SHUTDOWN 位于 src/backend/replication/logical/slotsync.c:1732,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:66。探针覆盖的操作是:等待复制槽同步 worker 停止运行。ReplicationSlotsyncShutdown 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/ReplicationSlotsyncShutdown 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'ReplicationSlotsyncShutdown'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'ReplicationSlotsyncShutdown'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

15 - Activity: SysloggerMain

在 syslogger 进程的主循环中等待。
PostgreSQL 等待事件档案
类别Activity 事件SysloggerMain 版本PG 17-18 证据4 个源码位置

官方描述译文

在 syslogger 进程的主循环中等待。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

历史名称:Activity/SysLoggerMain (PG 13-16)

触发机制

WAIT_EVENT_SYSLOGGER_MAIN 位于 src/backend/postmaster/syslogger.c:487,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:240。探针覆盖的操作是:在 syslogger 进程的主循环中等待。SysloggerMain 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/SysloggerMain 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'SysloggerMain'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'SysloggerMain'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

16 - Activity: WalReceiverMain

在 WAL receiver 进程的主循环中等待。
PostgreSQL 等待事件档案
类别Activity 事件WalReceiverMain 版本PG 13-18 证据2 个源码位置

官方描述译文

在 WAL receiver 进程的主循环中等待。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

触发机制

WAIT_EVENT_WAL_RECEIVER_MAIN 位于 src/backend/replication/walreceiver.c:600,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:68。探针覆盖的操作是:在 WAL receiver 进程的主循环中等待。WalReceiverMain 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/WalReceiverMain 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'WalReceiverMain'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'WalReceiverMain'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

17 - Activity: WalSenderMain

在 WAL sender 进程的主循环中等待。
PostgreSQL 等待事件档案
类别Activity 事件WalSenderMain 版本PG 13-18 证据2 个源码位置

官方描述译文

在 WAL sender 进程的主循环中等待。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

触发机制

WAIT_EVENT_WAL_SENDER_MAIN 位于 src/backend/replication/walsender.c:2963,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:69。探针覆盖的操作是:在 WAL sender 进程的主循环中等待。WalSenderMain 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/WalSenderMain 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'WalSenderMain'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'WalSenderMain'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

18 - Activity: WalSummarizerWal

在 WAL summarizer 中等待生成更多 WAL。
PostgreSQL 等待事件档案
类别Activity 事件WalSummarizerWal 版本PG 17-18 证据2 个源码位置

官方描述译文

在 WAL summarizer 中等待生成更多 WAL。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

触发机制

WAIT_EVENT_WAL_SUMMARIZER_WAL 位于 src/backend/postmaster/walsummarizer.c:1798,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:70。探针覆盖的操作是:在 WAL summarizer 中等待生成更多 WAL。WalSummarizerWal 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/WalSummarizerWal 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'WalSummarizerWal'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'WalSummarizerWal'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据

19 - Activity: WalWriterMain

在 WAL writer 进程的主循环中等待。
PostgreSQL 等待事件档案
类别Activity 事件WalWriterMain 版本PG 13-18 证据2 个源码位置

官方描述译文

在 WAL writer 进程的主循环中等待。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18

触发机制

WAIT_EVENT_WAL_WRITER_MAIN 位于 src/backend/postmaster/walwriter.c:271,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:71。探针覆盖的操作是:在 WAL writer 进程的主循环中等待。WalWriterMain 后台路径在主循环暂时无事可做、进入 latch wait 前报告此事件;信号、计时器或新工作会唤醒进程并进入下一轮循环。

正常还是麻烦?

  • 正常: 对匹配的后台进程而言,这通常是预期空闲。
  • 需要调查: 只有工作队列、关闭或故障切换时限没有推进但进程一直停在这里,或事件出现在不匹配的后端类型上时,才需要调查。

诊断 SQL

正在等待 Activity/WalWriterMain 的会话
SELECT 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 = 'Activity'
  AND wait_event = 'WalWriterMain'
ORDER BY query_age DESC NULLS LAST;
当前 Activity 等待分布
SELECT 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 = 'Activity'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文
SELECT 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 = 'Activity'
  AND a.wait_event = 'WalWriterMain'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先与 backend_type 对照。
  2. 检查该进程专属的积压与最后进展时间。
  3. 修复缺失的工作信号或停滞的上游阶段,不要终止正常空闲的 worker。

源码证据