跳转到主要内容

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

返回本页常规视图.

PostgreSQL 等待事件大典

后端在等什么、等待从哪条代码路径开始,以及值班工程师下一步该做什么。
值班入口

先看正在等待的会话,再看事件名称

先保全现场:谁在等、等了多久、事务是否仍然打开、阻塞者是谁。再用事件条目把快照连接到 PostgreSQL 源码与边界清晰的处置动作。

13–18覆盖的 PostgreSQL 版本
327版本矩阵中的事件身份
8面向运维的等待类别
2中英文逐页配对
事实链官方文档 → pg_wait_events → 源码 grep → 实际执行 SQL

先做第一张快照

重启服务或取消后端之前,先执行:

当前正在等待的会话
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 IS NOT NULL
ORDER BY query_age DESC NULLS LAST;
重要

等待事件快照只说明进程此刻睡在哪里,不代表查询耗时都花在这里。重复采样,并与延迟、吞吐、锁以及操作系统证据关联后,才能判断它是不是根因。

接着使用等待事件排查总图,或按 wait_event_type 进入对应类别。

按类别阅读

类别 应当怎样理解 第一个问题
Lock 另一个事务或会话持有重量级锁 阻塞链最前端是谁?
LWLock PostgreSQL 内部共享内存结构发生竞争 重复采样时是否总是同一内部资源发热?
IO 后端在等待文件操作 是存储变慢,还是 PostgreSQL 正在做预期工作?
IPC 进程正在彼此协调 哪个对端或执行阶段还没到达同步点?
Client PostgreSQL 在等待应用或网络 会话是正常空闲、发生背压,还是卡在事务里?
Activity 后台进程处于正常主循环 对这种后端类型而言,这是不是预期空闲?
Timeout 有意设置的计时器或限速尚未到期 是哪条策略主动插入了等待?
BufferPin 其他后端钉住缓冲区,使其不能移动 哪个游标或扫描仍持有 pin?

通用的扩展等待事件机制单独说明;扩展自行注册的名称不纳入本大典。

证据契约

每个完成的事件条目都明确区分四类信息:

  1. 事实:事件身份、版本范围与官方描述译文。
  2. 分析:报告等待的源码路径,以及该路径正在做什么。
  3. 建议:结合负载的正常/异常边界与分场景动作。
  4. 证据:可执行 SQL 与精确到 PostgreSQL 发布版本的源码 file:line

当同一名称只在部分大版本出现时,使用版本矩阵对照。

1 - 等待事件排查总图

从一张 pg_stat_activity 快照走向下一步安全动作的决策树。

这张图刻意保守:先保全证据,再区分预期空闲与真正停滞,最后进入各类别的专项排查。

flowchart TD
  A[采集 pg_stat_activity] --> B{wait_event 为空?}
  B -- 是 --> C[后端可能在用 CPU 或处于探针之间]
  B -- 否 --> D{Activity 或 Client?}
  D -- 是 --> E{空闲状态或预期的后台主循环?}
  E -- 是 --> F[通常正常;检查未结束事务与连接规模]
  E -- 否 --> G[检查客户端背压、网络与应用责任方]
  D -- 否 --> H{Lock 或 BufferPin?}
  H -- 是 --> I[构建阻塞链,定位根阻塞者]
  H -- 否 --> J{IO?}
  J -- 是 --> K[关联 pg_stat_io、文件系统延迟与负载阶段]
  J -- 否 --> L{LWLock?}
  L -- 是 --> M[重复采样,确认单个发热的内部资源]
  L -- 否 --> N[检查 IPC 对端或 Timeout 策略]
  I --> O[选择影响最小且有边界的动作]
  K --> O
  M --> O
  N --> O

最小证据包

  • 两张或更多带时间戳的快照。
  • pidbackend_typestate、查询时长、事务时长、等待类型和名称。
  • 每个等待后端的 pg_blocking_pids(pid)
  • 精确的 PostgreSQL 大版本与小版本。
  • 负载标记:发布、批处理、检查点、清理、备份、DDL 或故障切换。
警告

不要只因为某个等待出现频繁就终止后端。健康集群里,Activity、许多 Client 与计时器等待本来就可能占据多数样本。

2 - 版本矩阵

对账后的 PostgreSQL 13–18 等待事件清单,包括改名与类型迁移。

版本矩阵对账两条事实路径:PostgreSQL 13–16 官方监控章节表格,以及在 PostgreSQL 17–18 Docker 实例上实查得到的 pg_wait_events 行。

版本 提取权威 行数
13 官方 monitoring 文档 222
14 官方 monitoring 文档 231
15 官方 monitoring 文档 238
16 官方 monitoring 文档 246
17 Docker postgres:17,查询 pg_wait_events 265
18 Docker postgres:18,查询 pg_wait_events 274

并集包含 327 个精确的 (type, name) 身份。其中 45 个历史身份归并为 282 个语义档案:281 个核心事件条目,加 1 个 Extension 机制占位记录。映射包括 PG14 两次类型迁移、PG16 两个经核验的 Parallel Hash 改名,以及 PostgreSQL 在 PG17 进行的等待名称拼写规范化。

下载

CSV 会把新旧名称保留为独立行,并提供 canonical 列。事件页面通过显式 alias 合并阅读,但不会抹掉它们真实的版本范围。

改名判定策略

只有证据确定时才建立映射:相邻版本替代项在忽略大小写并移除非字母数字后完全相同,或源码/文档能够建立经核验的改名关系。描述相似本身不足以判定;PgStatMain 等移除项会保留为历史事件,而不是猜测别名。

完整身份矩阵

类型 事件身份 13 14 15 16 17 18 标准身份 / 变化
Activity ArchiverMain
Activity AutoVacuumMain Activity/AutovacuumMain · spelling
Activity AutovacuumMain
Activity BgWriterHibernate Activity/BgwriterHibernate · spelling
Activity BgWriterMain Activity/BgwriterMain · spelling
Activity BgwriterHibernate
Activity BgwriterMain
Activity CheckpointerMain
Activity CheckpointerShutdown
Activity IoWorkerMain
Activity LogicalApplyMain
Activity LogicalLauncherMain
Activity LogicalParallelApplyMain
Activity PgStatMain
Activity RecoveryWalStream
Activity ReplicationSlotsyncMain
Activity ReplicationSlotsyncShutdown
Activity SysLoggerMain Activity/SysloggerMain · spelling
Activity SysloggerMain
Activity WalReceiverMain
Activity WalSenderMain
Activity WalSummarizerWal
Activity WalWriterMain
BufferPin BufferPin
Client ClientRead
Client ClientWrite
Client GSSOpenServer Client/GssOpenServer · spelling
Client GssOpenServer
Client LibPQWalReceiverConnect Client/LibpqwalreceiverConnect · spelling
Client LibPQWalReceiverReceive Client/LibpqwalreceiverReceive · spelling
Client LibpqwalreceiverConnect
Client LibpqwalreceiverReceive
Client SSLOpenServer Client/SslOpenServer · spelling
Client SslOpenServer
Client WaitForStandbyConfirmation
Client WalReceiverWaitStart IPC/WalReceiverWaitStart · type_move
Client WalSenderWaitForWAL Client/WalSenderWaitForWal · spelling
Client WalSenderWaitForWal
Client WalSenderWriteData
Extension Extension
IO AioIoCompletion
IO AioIoUringExecution
IO AioIoUringSubmit
IO BaseBackupRead IO/BasebackupRead · spelling
IO BaseBackupSync IO/BasebackupSync · spelling
IO BaseBackupWrite IO/BasebackupWrite · spelling
IO BasebackupRead
IO BasebackupSync
IO BasebackupWrite
IO BufFileRead IO/BuffileRead · spelling
IO BufFileTruncate IO/BuffileTruncate · spelling
IO BufFileWrite IO/BuffileWrite · spelling
IO BuffileRead
IO BuffileTruncate
IO BuffileWrite
IO ControlFileRead
IO ControlFileSync
IO ControlFileSyncUpdate
IO ControlFileWrite
IO ControlFileWriteUpdate
IO CopyFileCopy
IO CopyFileRead
IO CopyFileWrite
IO DSMAllocate IO/DsmAllocate · spelling
IO DSMFillZeroWrite IO/DsmFillZeroWrite · spelling
IO DataFileExtend
IO DataFileFlush
IO DataFileImmediateSync
IO DataFilePrefetch
IO DataFileRead
IO DataFileSync
IO DataFileTruncate
IO DataFileWrite
IO DsmAllocate
IO DsmFillZeroWrite
IO LockFileAddToDataDirRead IO/LockFileAddtodatadirRead · spelling
IO LockFileAddToDataDirSync IO/LockFileAddtodatadirSync · spelling
IO LockFileAddToDataDirWrite IO/LockFileAddtodatadirWrite · spelling
IO LockFileAddtodatadirRead
IO LockFileAddtodatadirSync
IO LockFileAddtodatadirWrite
IO LockFileCreateRead
IO LockFileCreateSync
IO LockFileCreateWrite
IO LockFileReCheckDataDirRead IO/LockFileRecheckdatadirRead · spelling
IO LockFileRecheckdatadirRead
IO LogicalChangesRead
IO LogicalChangesWrite
IO LogicalRewriteCheckpointSync
IO LogicalRewriteMappingSync
IO LogicalRewriteMappingWrite
IO LogicalRewriteSync
IO LogicalRewriteTruncate
IO LogicalRewriteWrite
IO LogicalSubxactRead
IO LogicalSubxactWrite
IO RelationMapRead
IO RelationMapReplace
IO RelationMapSync
IO RelationMapWrite
IO ReorderBufferRead
IO ReorderBufferWrite
IO ReorderLogicalMappingRead
IO ReplicationSlotRead
IO ReplicationSlotRestoreSync
IO ReplicationSlotSync
IO ReplicationSlotWrite
IO SLRUFlushSync IO/SlruFlushSync · spelling
IO SLRURead IO/SlruRead · spelling
IO SLRUSync IO/SlruSync · spelling
IO SLRUWrite IO/SlruWrite · spelling
IO SlruFlushSync
IO SlruRead
IO SlruSync
IO SlruWrite
IO SnapbuildRead
IO SnapbuildSync
IO SnapbuildWrite
IO TimelineHistoryFileSync
IO TimelineHistoryFileWrite
IO TimelineHistoryRead
IO TimelineHistorySync
IO TimelineHistoryWrite
IO TwophaseFileRead
IO TwophaseFileSync
IO TwophaseFileWrite
IO VersionFileSync
IO VersionFileWrite
IO WALBootstrapSync IO/WalBootstrapSync · spelling
IO WALBootstrapWrite IO/WalBootstrapWrite · spelling
IO WALCopyRead IO/WalCopyRead · spelling
IO WALCopySync IO/WalCopySync · spelling
IO WALCopyWrite IO/WalCopyWrite · spelling
IO WALInitSync IO/WalInitSync · spelling
IO WALInitWrite IO/WalInitWrite · spelling
IO WALRead IO/WalRead · spelling
IO WALSenderTimelineHistoryRead IO/WalsenderTimelineHistoryRead · spelling
IO WALSync IO/WalSync · spelling
IO WALSyncMethodAssign IO/WalSyncMethodAssign · spelling
IO WALWrite IO/WalWrite · spelling
IO WalBootstrapSync
IO WalBootstrapWrite
IO WalCopyRead
IO WalCopySync
IO WalCopyWrite
IO WalInitSync
IO WalInitWrite
IO WalRead
IO WalSummaryRead
IO WalSummaryWrite
IO WalSync
IO WalSyncMethodAssign
IO WalWrite
IO WalsenderTimelineHistoryRead
IPC AppendReady
IPC ArchiveCleanupCommand
IPC ArchiveCommand
IPC BackendTermination
IPC BackupWaitWalArchive
IPC BgWorkerShutdown IPC/BgworkerShutdown · spelling
IPC BgWorkerStartup IPC/BgworkerStartup · spelling
IPC BgworkerShutdown
IPC BgworkerStartup
IPC BtreePage
IPC BufferIO IPC/BufferIo · spelling
IPC BufferIo
IPC CheckpointDelayComplete
IPC CheckpointDelayStart
IPC CheckpointDone
IPC CheckpointStart
IPC ExecuteGather
IPC HashBatchAllocate
IPC HashBatchElect
IPC HashBatchLoad
IPC HashBuildAllocate
IPC HashBuildElect
IPC HashBuildHashInner
IPC HashBuildHashOuter
IPC HashGrowBatchesAllocate IPC/HashGrowBatchesReallocate · rename
IPC HashGrowBatchesDecide
IPC HashGrowBatchesElect
IPC HashGrowBatchesFinish
IPC HashGrowBatchesReallocate
IPC HashGrowBatchesRepartition
IPC HashGrowBucketsAllocate IPC/HashGrowBucketsReallocate · rename
IPC HashGrowBucketsElect
IPC HashGrowBucketsReallocate
IPC HashGrowBucketsReinsert
IPC LogicalApplySendData
IPC LogicalParallelApplyStateChange
IPC LogicalSyncData
IPC LogicalSyncStateChange
IPC MessageQueueInternal
IPC MessageQueuePutMessage
IPC MessageQueueReceive
IPC MessageQueueSend
IPC MultixactCreation
IPC ParallelBitmapScan
IPC ParallelCreateIndexScan
IPC ParallelFinish
IPC ProcArrayGroupUpdate IPC/ProcarrayGroupUpdate · spelling
IPC ProcSignalBarrier
IPC ProcarrayGroupUpdate
IPC Promote
IPC RecoveryConflictSnapshot
IPC RecoveryConflictTablespace
IPC RecoveryEndCommand
IPC RecoveryPause
IPC ReplicationOriginDrop
IPC ReplicationSlotDrop
IPC RestoreCommand
IPC SafeSnapshot
IPC SyncRep
IPC WalReceiverExit
IPC WalReceiverUpstreamCatchup
IPC WalReceiverWaitStart
IPC WalSummaryReady
IPC XactGroupUpdate
Lock advisory
Lock applytransaction
Lock extend
Lock frozenid
Lock object
Lock page
Lock relation
Lock spectoken
Lock transactionid
Lock tuple
Lock userlock
Lock virtualxid
LWLock AddinShmemInit
LWLock AioUringCompletion
LWLock AioWorkerSubmissionQueue
LWLock AutoFile
LWLock Autovacuum
LWLock AutovacuumSchedule
LWLock BackgroundWorker
LWLock BtreeVacuum
LWLock BufferContent
LWLock BufferIO IPC/BufferIo · type_move
LWLock BufferMapping
LWLock Checkpoint
LWLock CheckpointerComm
LWLock CommitTs
LWLock CommitTsBuffer
LWLock CommitTsSLRU
LWLock ControlFile
LWLock DSMRegistry
LWLock DSMRegistryDSA
LWLock DSMRegistryHash
LWLock DynamicSharedMemoryControl
LWLock InjectionPoint
LWLock LockFastPath
LWLock LockManager
LWLock LogicalRepLauncherDSA
LWLock LogicalRepLauncherHash
LWLock LogicalRepWorker
LWLock MultiXactGen
LWLock MultiXactMemberBuffer
LWLock MultiXactMemberSLRU
LWLock MultiXactOffsetBuffer
LWLock MultiXactOffsetSLRU
LWLock MultiXactTruncation
LWLock NotifyBuffer
LWLock NotifyQueue
LWLock NotifyQueueTail
LWLock NotifySLRU
LWLock OidGen
LWLock OldSnapshotTimeMap
LWLock ParallelAppend
LWLock ParallelBtreeScan
LWLock ParallelHashJoin
LWLock ParallelQueryDSA
LWLock ParallelVacuumDSA
LWLock PerSessionDSA
LWLock PerSessionRecordType
LWLock PerSessionRecordTypmod
LWLock PerXactPredicateList
LWLock PgStatsDSA
LWLock PgStatsData
LWLock PgStatsHash
LWLock PredicateLockManager
LWLock ProcArray
LWLock RelCacheInit
LWLock RelationMapping
LWLock ReplicationOrigin
LWLock ReplicationOriginState
LWLock ReplicationSlotAllocation
LWLock ReplicationSlotControl
LWLock ReplicationSlotIO
LWLock SInvalRead
LWLock SInvalWrite
LWLock SerialBuffer
LWLock SerialControl
LWLock SerialSLRU
LWLock SerializableFinishedList
LWLock SerializablePredicateList
LWLock SerializableXactHash
LWLock SharedTidBitmap
LWLock SharedTupleStore
LWLock ShmemIndex
LWLock SubtransBuffer
LWLock SubtransSLRU
LWLock SyncRep
LWLock SyncScan
LWLock TablespaceCreate
LWLock TwoPhaseState
LWLock WALBufMapping
LWLock WALInsert
LWLock WALSummarizer
LWLock WALWrite
LWLock WaitEventCustom
LWLock WrapLimitsVacuum
LWLock XactBuffer
LWLock XactSLRU
LWLock XactTruncation
LWLock XidGen
Timeout BaseBackupThrottle
Timeout CheckpointWriteDelay
Timeout PgSleep
Timeout RecoveryApplyDelay
Timeout RecoveryRetrieveRetryInterval
Timeout RegisterSyncRequest
Timeout SpinDelay
Timeout VacuumDelay
Timeout VacuumTruncate
Timeout WalSummarizerError

3 - 值班术语表

身份、分析、建议与证据字段中统一使用的术语。
术语 在本大典中的含义
活动前台会话 state = 'active' 的客户端后端;计算竞争占比时排除后台主循环。
快照占比 被采样活动前台会话中落在某一事件上的比例。它是分诊信号,不是耗时归因。
等待身份 某个发布版本实测的精确 (wait_event_type, wait_event) 拼写;改名前后在矩阵中保留独立行。
标准事件 一个语义档案,可以合并已经明确核验的历史拼写或类型迁移。
触发点 把等待事件标识传给 PostgreSQL 等待报告机制的源码路径。
目录定义 定义公共名称/描述的源码行;它本身并不能证明当前存在活动触发点。
休眠事件 具有完整负面源码证据的目录身份:已审计的小版本里没有活动核心报告点。
重量级锁 SQL 可见的锁管理器对象,通常可通过 pg_lockspg_blocking_pids() 诊断。
LWLock / tranche 保护共享内存状态的短时内部锁;tranche 提供显示出来的事件名称。
SLRU 保存事务相关元数据(如 pg_xact 与 multixact)的小型共享缓存及磁盘段集合。
Buffer pin 后端对共享缓冲页的临时声明:该页必须保持存在且结构稳定。
源码发布版本 精确审计标签,如 REL_18_6;行号绝不绑定到会漂移的 stable 分支。

本站阈值是运维默认值。PostgreSQL 并不保证“10%”或“五秒”在所有场景都坏;必须结合本集群基线与服务目标。

4 - Lock 等待

通常可以直接从 SQL 找到持有者与阻塞链的重量级锁。

Lock 是最容易直接处置的一类:后端向锁管理器申请重量级锁,但不兼容的持有者尚未释放。与 LWLock 不同,这些等待通常在 pg_locks 中有对应行,pg_blocking_pids() 也能给出有效答案。

看阻塞图,不要只数受害者

二十个等待者可能都只是一个空闲事务的症状。先走到阻塞图最前端,再判断持有者是在做有效工作、已被遗弃,还是处于计划内 DDL/发布窗口。

  • 正常: 普通写入或计划内 DDL 期间,亚秒级的锁交接。
  • 关注: 任一面向用户的等待超过其延迟目标,或至少 10% 的活动会话等待同一个根阻塞者。
  • 紧急: 根持有者是 idle in transaction、阻塞链持续增长、关键 DDL 阻塞流量,或死锁开始增加。

值得先认出的事件

事件 通常表示
relation 表/索引级锁冲突,常见于 DDL 对 DML
transactionid 等待另一事务结束,常见于并发更新同一行
tuple 元组锁竞争或很长的行锁队列
extend 多个会话在扩展同一关系时串行化
virtualxid DDL 等待可能仍在使用对象的事务
advisory 应用自定义的 advisory lock 协调

阻塞者查询

SELECT w.pid AS waiting_pid, b.pid AS blocking_pid,
       w.wait_event, now() - w.query_start AS waiting_for,
       now() - b.xact_start AS blocker_xact_age,
       b.state AS blocker_state,
       left(w.query, 100) AS waiting_query,
       left(b.query, 100) AS blocking_query
FROM pg_stat_activity AS w
CROSS JOIN LATERAL unnest(pg_blocking_pids(w.pid)) AS x(pid)
JOIN pg_stat_activity AS b ON b.pid = x.pid
ORDER BY waiting_for DESC;

常见误读

  • 被列为阻塞者的会话并不一定可以安全终止;它可能是维护业务不变量的唯一写入者。
  • transactionid 不代表事务 ID 即将耗尽。
  • relation 本身不说明具体关系;需要把 pg_locks.relation 关联到 pg_class
  • 增大 lock_timeout 只改变受害者等多久,并不会移除阻塞者。

4.1 - Lock: advisory

等待获取用户 advisory lock。
PostgreSQL 等待事件档案
类别Lock 事件advisory 版本PG 13-18 证据3 个源码位置

官方描述译文

等待获取用户 advisory lock。

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

触发机制

PG_WAIT_LOCK 位于 src/backend/storage/lmgr/proc.c:1487,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:428。探针覆盖的操作是:等待获取用户 advisory lock。锁管理器无法立即授予 advisory 重量级锁;ProcSleep 报告等待,并把后端挂到该锁的等待队列,直到持有者释放或请求被取消。

正常还是麻烦?

  • 正常: 普通写入或计划内 DDL 的亚秒级锁交接可能正常。
  • 需要调查: 面向用户的等待超过延迟目标、阻塞链持续增长,或根持有者处于 idle in transaction 时,应当调查。

诊断 SQL

正在等待 Lock/advisory 的会话
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 = 'Lock'
  AND wait_event = 'advisory'
ORDER BY query_age DESC NULLS LAST;
当前 Lock 等待分布
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 = 'Lock'
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 = 'Lock'
  AND a.wait_event = 'advisory'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 沿 pg_blocking_pids 构建到根节点的阻塞图。
  2. 检查根持有者状态、事务年龄与业务目的。
  3. 确认最安全的根动作后,再选择取消、超时或调整负载顺序。

源码证据

4.2 - Lock: applytransaction

等待获取逻辑复制订阅端正在应用的远程事务上的锁。
PostgreSQL 等待事件档案
类别Lock 事件applytransaction 版本PG 16-18 证据3 个源码位置

官方描述译文

等待获取逻辑复制订阅端正在应用的远程事务上的锁。

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

触发机制

PG_WAIT_LOCK 位于 src/backend/storage/lmgr/proc.c:1487,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:429。探针覆盖的操作是:等待获取逻辑复制订阅端正在应用的远程事务上的锁。锁管理器无法立即授予 applytransaction 重量级锁;ProcSleep 报告等待,并把后端挂到该锁的等待队列,直到持有者释放或请求被取消。

正常还是麻烦?

  • 正常: 普通写入或计划内 DDL 的亚秒级锁交接可能正常。
  • 需要调查: 面向用户的等待超过延迟目标、阻塞链持续增长,或根持有者处于 idle in transaction 时,应当调查。

诊断 SQL

正在等待 Lock/applytransaction 的会话
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 = 'Lock'
  AND wait_event = 'applytransaction'
ORDER BY query_age DESC NULLS LAST;
当前 Lock 等待分布
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 = 'Lock'
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 = 'Lock'
  AND a.wait_event = 'applytransaction'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 沿 pg_blocking_pids 构建到根节点的阻塞图。
  2. 检查根持有者状态、事务年龄与业务目的。
  3. 确认最安全的根动作后,再选择取消、超时或调整负载顺序。

源码证据

4.3 - Lock: extend

等待扩展 relation。
PostgreSQL 等待事件档案
类别Lock 事件extend 版本PG 13-18 证据3 个源码位置

官方描述译文

等待扩展 relation。

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

触发机制

PG_WAIT_LOCK 位于 src/backend/storage/lmgr/proc.c:1487,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:419。探针覆盖的操作是:等待扩展 relation。锁管理器无法立即授予 extend 重量级锁;ProcSleep 报告等待,并把后端挂到该锁的等待队列,直到持有者释放或请求被取消。

正常还是麻烦?

  • 正常: 普通写入或计划内 DDL 的亚秒级锁交接可能正常。
  • 需要调查: 面向用户的等待超过延迟目标、阻塞链持续增长,或根持有者处于 idle in transaction 时,应当调查。

诊断 SQL

正在等待 Lock/extend 的会话
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 = 'Lock'
  AND wait_event = 'extend'
ORDER BY query_age DESC NULLS LAST;
当前 Lock 等待分布
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 = 'Lock'
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 = 'Lock'
  AND a.wait_event = 'extend'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 沿 pg_blocking_pids 构建到根节点的阻塞图。
  2. 检查根持有者状态、事务年龄与业务目的。
  3. 确认最安全的根动作后,再选择取消、超时或调整负载顺序。

源码证据

4.4 - Lock: frozenid

等待更新 pg_database.datfrozenxid 和 pg_database.datminmxid。
PostgreSQL 等待事件档案
类别Lock 事件frozenid 版本PG 13-18 证据3 个源码位置

官方描述译文

等待更新 pg_database.datfrozenxid 和 pg_database.datminmxid。

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

触发机制

PG_WAIT_LOCK 位于 src/backend/storage/lmgr/proc.c:1487,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:420。探针覆盖的操作是:等待更新 pg_database.datfrozenxid 和 pg_database.datminmxid。锁管理器无法立即授予 frozenid 重量级锁;ProcSleep 报告等待,并把后端挂到该锁的等待队列,直到持有者释放或请求被取消。

正常还是麻烦?

  • 正常: 普通写入或计划内 DDL 的亚秒级锁交接可能正常。
  • 需要调查: 面向用户的等待超过延迟目标、阻塞链持续增长,或根持有者处于 idle in transaction 时,应当调查。

诊断 SQL

正在等待 Lock/frozenid 的会话
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 = 'Lock'
  AND wait_event = 'frozenid'
ORDER BY query_age DESC NULLS LAST;
当前 Lock 等待分布
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 = 'Lock'
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 = 'Lock'
  AND a.wait_event = 'frozenid'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 沿 pg_blocking_pids 构建到根节点的阻塞图。
  2. 检查根持有者状态、事务年龄与业务目的。
  3. 确认最安全的根动作后,再选择取消、超时或调整负载顺序。

源码证据

4.5 - Lock: object

等待获取非 relation 数据库对象上的锁。
PostgreSQL 等待事件档案
类别Lock 事件object 版本PG 13-18 证据3 个源码位置

官方描述译文

等待获取非 relation 数据库对象上的锁。

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

触发机制

PG_WAIT_LOCK 位于 src/backend/storage/lmgr/proc.c:1487,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:426。探针覆盖的操作是:等待获取非 relation 数据库对象上的锁。锁管理器无法立即授予 object 重量级锁;ProcSleep 报告等待,并把后端挂到该锁的等待队列,直到持有者释放或请求被取消。

正常还是麻烦?

  • 正常: 普通写入或计划内 DDL 的亚秒级锁交接可能正常。
  • 需要调查: 面向用户的等待超过延迟目标、阻塞链持续增长,或根持有者处于 idle in transaction 时,应当调查。

诊断 SQL

正在等待 Lock/object 的会话
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 = 'Lock'
  AND wait_event = 'object'
ORDER BY query_age DESC NULLS LAST;
当前 Lock 等待分布
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 = 'Lock'
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 = 'Lock'
  AND a.wait_event = 'object'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 沿 pg_blocking_pids 构建到根节点的阻塞图。
  2. 检查根持有者状态、事务年龄与业务目的。
  3. 确认最安全的根动作后,再选择取消、超时或调整负载顺序。

源码证据

4.6 - Lock: page

等待获取 relation 页面上的锁。
PostgreSQL 等待事件档案
类别Lock 事件page 版本PG 13-18 证据2 个源码位置

官方描述译文

等待获取 relation 页面上的锁。

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

触发机制

PG_WAIT_LOCK 位于 src/backend/storage/lmgr/proc.c:1487,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:421。探针覆盖的操作是:等待获取 relation 页面上的锁。锁管理器无法立即授予 page 重量级锁;ProcSleep 报告等待,并把后端挂到该锁的等待队列,直到持有者释放或请求被取消。

正常还是麻烦?

  • 正常: 普通写入或计划内 DDL 的亚秒级锁交接可能正常。
  • 需要调查: 面向用户的等待超过延迟目标、阻塞链持续增长,或根持有者处于 idle in transaction 时,应当调查。

诊断 SQL

正在等待 Lock/page 的会话
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 = 'Lock'
  AND wait_event = 'page'
ORDER BY query_age DESC NULLS LAST;
当前 Lock 等待分布
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 = 'Lock'
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 = 'Lock'
  AND a.wait_event = 'page'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 沿 pg_blocking_pids 构建到根节点的阻塞图。
  2. 检查根持有者状态、事务年龄与业务目的。
  3. 确认最安全的根动作后,再选择取消、超时或调整负载顺序。

源码证据

4.7 - Lock: relation

等待获取 relation 上的锁。
PostgreSQL 等待事件档案
类别Lock 事件relation 版本PG 13-18 证据3 个源码位置

官方描述译文

等待获取 relation 上的锁。

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

触发机制

PG_WAIT_LOCK 位于 src/backend/storage/lmgr/proc.c:1487,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:418。探针覆盖的操作是:等待获取 relation 上的锁。锁管理器无法立即授予 relation 重量级锁;ProcSleep 报告等待,并把后端挂到该锁的等待队列,直到持有者释放或请求被取消。

正常还是麻烦?

  • 正常: 普通写入或计划内 DDL 的亚秒级锁交接可能正常。
  • 需要调查: 面向用户的等待超过延迟目标、阻塞链持续增长,或根持有者处于 idle in transaction 时,应当调查。

诊断 SQL

正在等待 Lock/relation 的会话
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 = 'Lock'
  AND wait_event = 'relation'
ORDER BY query_age DESC NULLS LAST;
当前 Lock 等待分布
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 = 'Lock'
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 = 'Lock'
  AND a.wait_event = 'relation'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 沿 pg_blocking_pids 构建到根节点的阻塞图。
  2. 检查根持有者状态、事务年龄与业务目的。
  3. 确认最安全的根动作后,再选择取消、超时或调整负载顺序。

源码证据

4.8 - Lock: spectoken

等待获取推测式插入锁。
PostgreSQL 等待事件档案
类别Lock 事件spectoken 版本PG 13-18 证据3 个源码位置

官方描述译文

等待获取推测式插入锁。

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

触发机制

PG_WAIT_LOCK 位于 src/backend/storage/lmgr/proc.c:1487,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:425。探针覆盖的操作是:等待获取推测式插入锁。锁管理器无法立即授予 spectoken 重量级锁;ProcSleep 报告等待,并把后端挂到该锁的等待队列,直到持有者释放或请求被取消。

正常还是麻烦?

  • 正常: 普通写入或计划内 DDL 的亚秒级锁交接可能正常。
  • 需要调查: 面向用户的等待超过延迟目标、阻塞链持续增长,或根持有者处于 idle in transaction 时,应当调查。

诊断 SQL

正在等待 Lock/spectoken 的会话
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 = 'Lock'
  AND wait_event = 'spectoken'
ORDER BY query_age DESC NULLS LAST;
当前 Lock 等待分布
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 = 'Lock'
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 = 'Lock'
  AND a.wait_event = 'spectoken'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 沿 pg_blocking_pids 构建到根节点的阻塞图。
  2. 检查根持有者状态、事务年龄与业务目的。
  3. 确认最安全的根动作后,再选择取消、超时或调整负载顺序。

源码证据

4.9 - Lock: transactionid

等待事务结束。
PostgreSQL 等待事件档案
类别Lock 事件transactionid 版本PG 13-18 证据3 个源码位置

官方描述译文

等待事务结束。

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

触发机制

PG_WAIT_LOCK 位于 src/backend/storage/lmgr/proc.c:1487,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:423。探针覆盖的操作是:等待事务结束。锁管理器无法立即授予 transactionid 重量级锁;ProcSleep 报告等待,并把后端挂到该锁的等待队列,直到持有者释放或请求被取消。

正常还是麻烦?

  • 正常: 普通写入或计划内 DDL 的亚秒级锁交接可能正常。
  • 需要调查: 面向用户的等待超过延迟目标、阻塞链持续增长,或根持有者处于 idle in transaction 时,应当调查。

诊断 SQL

正在等待 Lock/transactionid 的会话
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 = 'Lock'
  AND wait_event = 'transactionid'
ORDER BY query_age DESC NULLS LAST;
当前 Lock 等待分布
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 = 'Lock'
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 = 'Lock'
  AND a.wait_event = 'transactionid'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 沿 pg_blocking_pids 构建到根节点的阻塞图。
  2. 检查根持有者状态、事务年龄与业务目的。
  3. 确认最安全的根动作后,再选择取消、超时或调整负载顺序。

源码证据

4.10 - Lock: tuple

等待获取 tuple 上的锁。
PostgreSQL 等待事件档案
类别Lock 事件tuple 版本PG 13-18 证据3 个源码位置

官方描述译文

等待获取 tuple 上的锁。

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

触发机制

PG_WAIT_LOCK 位于 src/backend/storage/lmgr/proc.c:1487,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:422。探针覆盖的操作是:等待获取 tuple 上的锁。锁管理器无法立即授予 tuple 重量级锁;ProcSleep 报告等待,并把后端挂到该锁的等待队列,直到持有者释放或请求被取消。

正常还是麻烦?

  • 正常: 普通写入或计划内 DDL 的亚秒级锁交接可能正常。
  • 需要调查: 面向用户的等待超过延迟目标、阻塞链持续增长,或根持有者处于 idle in transaction 时,应当调查。

诊断 SQL

正在等待 Lock/tuple 的会话
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 = 'Lock'
  AND wait_event = 'tuple'
ORDER BY query_age DESC NULLS LAST;
当前 Lock 等待分布
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 = 'Lock'
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 = 'Lock'
  AND a.wait_event = 'tuple'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 沿 pg_blocking_pids 构建到根节点的阻塞图。
  2. 检查根持有者状态、事务年龄与业务目的。
  3. 确认最安全的根动作后,再选择取消、超时或调整负载顺序。

源码证据

4.11 - Lock: userlock

等待获取用户锁。
PostgreSQL 等待事件档案
类别Lock 事件userlock 版本PG 13-18 证据3 个源码位置

官方描述译文

等待获取用户锁。

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

触发机制

PG_WAIT_LOCK 位于 src/backend/storage/lmgr/proc.c:1487,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:427。探针覆盖的操作是:等待获取用户锁。锁管理器无法立即授予 userlock 重量级锁;ProcSleep 报告等待,并把后端挂到该锁的等待队列,直到持有者释放或请求被取消。

正常还是麻烦?

  • 正常: 普通写入或计划内 DDL 的亚秒级锁交接可能正常。
  • 需要调查: 面向用户的等待超过延迟目标、阻塞链持续增长,或根持有者处于 idle in transaction 时,应当调查。

诊断 SQL

正在等待 Lock/userlock 的会话
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 = 'Lock'
  AND wait_event = 'userlock'
ORDER BY query_age DESC NULLS LAST;
当前 Lock 等待分布
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 = 'Lock'
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 = 'Lock'
  AND a.wait_event = 'userlock'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 沿 pg_blocking_pids 构建到根节点的阻塞图。
  2. 检查根持有者状态、事务年龄与业务目的。
  3. 确认最安全的根动作后,再选择取消、超时或调整负载顺序。

源码证据

4.12 - Lock: virtualxid

等待获取虚拟事务 ID 锁。
PostgreSQL 等待事件档案
类别Lock 事件virtualxid 版本PG 13-18 证据3 个源码位置

官方描述译文

等待获取虚拟事务 ID 锁。

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

触发机制

PG_WAIT_LOCK 位于 src/backend/storage/lmgr/proc.c:1487,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:424。探针覆盖的操作是:等待获取虚拟事务 ID 锁。锁管理器无法立即授予 virtualxid 重量级锁;ProcSleep 报告等待,并把后端挂到该锁的等待队列,直到持有者释放或请求被取消。

正常还是麻烦?

  • 正常: 普通写入或计划内 DDL 的亚秒级锁交接可能正常。
  • 需要调查: 面向用户的等待超过延迟目标、阻塞链持续增长,或根持有者处于 idle in transaction 时,应当调查。

诊断 SQL

正在等待 Lock/virtualxid 的会话
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 = 'Lock'
  AND wait_event = 'virtualxid'
ORDER BY query_age DESC NULLS LAST;
当前 Lock 等待分布
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 = 'Lock'
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 = 'Lock'
  AND a.wait_event = 'virtualxid'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 沿 pg_blocking_pids 构建到根节点的阻塞图。
  2. 检查根持有者状态、事务年龄与业务目的。
  3. 确认最安全的根动作后,再选择取消、超时或调整负载顺序。

源码证据

5 - LWLock 等待

PostgreSQL 内部共享内存数据结构上的竞争。

LWLock 表示后端没能立即取得保护内部共享内存结构的轻量级锁。它不是 SQL 行锁或表锁,pg_locks 通常也无法指出它的持有者。

值班规则重复采样 → 锁定一个热点 tranche → 与负载关联

怎样阅读这一类

单张快照里的 LWLock 通常只是调度噪声。只有同一个名称在连续样本中反复出现,并且受影响前台会话的延迟同步上升时,才把它当成竞争。

  • 正常: 生成 WAL、获取快照、查找缓冲区、清理或检查点期间短暂出现。
  • 关注: 连续三张、间隔 1 秒的快照里,同一事件至少占活动前台后端的 10%。
  • 紧急: 至少 25% 的活动前台后端堆在同一事件上,等待持续超过 5 秒,或吞吐同时断崖式下降。

这些百分比是现场分级阈值,不是 PostgreSQL 的保证值。必须与本集群基线比较,并排除本来就应在主循环中等待的后台进程。

值得先认出的十个事件

事件 受保护资源 常见现场
BufferContent 单个共享缓冲区的内容 大量会话访问同一热点页
BufferMapping 缓冲区映射表分区 工作集抖动或大规模并发扫描
LockManager 重量级锁管理器状态 锁数量爆炸、DDL 或锁风暴
ProcArray 共享进程/事务数组 获取快照与事务 ID 压力
WALBufMapping WAL 缓冲区页面映射 写入压力下 WAL buffer 快速换页
WALInsert WAL 插入状态 大量写会话在插入 WAL 时串行化
WALWrite WAL 缓冲区写协调 WAL 写入或刷盘路径跟不上
XactSLRU 事务状态 SLRU pg_xact 缓存抖动或检查很老的可见性
MultiXactMemberSLRU Multixact member SLRU 大量行锁与 multixact 抖动
SyncRep 同步复制等待队列 提交确认与 sender 状态发生竞争

常见误读

  1. “LWLock 说明锁泄漏了。” 不是。它是短暂的内部临界区;持续、重复出现才是信号。
  2. “页面显示的查询就是持有者。” pg_stat_activity.query 属于等待者;持有者可能是走另一条源码路径的后端。
  3. “多加 CPU 就能解决。” 更多并发反而可能加剧共享内存热点。先确认受保护资源与负载形状。
  4. pg_locks 能找出阻塞者。” 它覆盖重量级锁与谓词锁,不覆盖一般 LWLock 所有权。

页面级热点先看 BufferContent,写入密集集群先看 WALInsert

5.1 - LWLock: AddinShmemInit

等待管理扩展在共享内存中的空间分配。
PostgreSQL 等待事件档案
类别LWLock 事件AddinShmemInit 版本PG 13-18 证据3 个源码位置

官方描述译文

等待管理扩展在共享内存中的空间分配。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:328。探针覆盖的操作是:等待管理扩展在共享内存中的空间分配。LWLockAcquire 无法立即取得显示为 AddinShmemInit 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/AddinShmemInit 的会话
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 = 'LWLock'
  AND wait_event = 'AddinShmemInit'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'AddinShmemInit'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.2 - LWLock: AioUringCompletion

等待另一个进程通过 io_uring 完成 I/O。
PostgreSQL 等待事件档案
类别LWLock 事件AioUringCompletion 版本PG 18 证据3 个源码位置

官方描述译文

等待另一个进程通过 io_uring 完成 I/O。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:180。探针覆盖的操作是:等待另一个进程通过 io_uring 完成 I/O。LWLockAcquire 无法立即取得显示为 AioUringCompletion 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/AioUringCompletion 的会话
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 = 'LWLock'
  AND wait_event = 'AioUringCompletion'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'AioUringCompletion'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.3 - LWLock: AioWorkerSubmissionQueue

等待访问 AIO worker 提交队列。
PostgreSQL 等待事件档案
类别LWLock 事件AioWorkerSubmissionQueue 版本PG 18 证据3 个源码位置

官方描述译文

等待访问 AIO worker 提交队列。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/aio/method_worker.c:253。探针覆盖的操作是:等待访问 AIO worker 提交队列。LWLockAcquire 无法立即取得显示为 AioWorkerSubmissionQueue 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/AioWorkerSubmissionQueue 的会话
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 = 'LWLock'
  AND wait_event = 'AioWorkerSubmissionQueue'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'AioWorkerSubmissionQueue'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.4 - LWLock: AutoFile

等待更新 postgresql.auto.conf 文件。
PostgreSQL 等待事件档案
类别LWLock 事件AutoFile 版本PG 13-18 证据3 个源码位置

官方描述译文

等待更新 postgresql.auto.conf 文件。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:340。探针覆盖的操作是:等待更新 postgresql.auto.conf 文件。LWLockAcquire 无法立即取得显示为 AutoFile 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/AutoFile 的会话
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 = 'LWLock'
  AND wait_event = 'AutoFile'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'AutoFile'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.5 - LWLock: Autovacuum

等待读取或更新 autovacuum worker 的当前状态。
PostgreSQL 等待事件档案
类别LWLock 事件Autovacuum 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新 autovacuum worker 的当前状态。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/postmaster/autovacuum.c:611。探针覆盖的操作是:等待读取或更新 autovacuum worker 的当前状态。LWLockAcquire 无法立即取得显示为 Autovacuum 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/Autovacuum 的会话
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 = 'LWLock'
  AND wait_event = 'Autovacuum'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'Autovacuum'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.6 - LWLock: AutovacuumSchedule

等待确认被选中进行 autovacuum 的表仍需要 vacuum。
PostgreSQL 等待事件档案
类别LWLock 事件AutovacuumSchedule 版本PG 13-18 证据3 个源码位置

官方描述译文

等待确认被选中进行 autovacuum 的表仍需要 vacuum。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/postmaster/autovacuum.c:2337。探针覆盖的操作是:等待确认被选中进行 autovacuum 的表仍需要 vacuum。LWLockAcquire 无法立即取得显示为 AutovacuumSchedule 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/AutovacuumSchedule 的会话
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 = 'LWLock'
  AND wait_event = 'AutovacuumSchedule'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'AutovacuumSchedule'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.7 - LWLock: BackgroundWorker

等待读取或更新后台 worker 的状态。
PostgreSQL 等待事件档案
类别LWLock 事件BackgroundWorker 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新后台 worker 的状态。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/postmaster/bgworker.c:1070。探针覆盖的操作是:等待读取或更新后台 worker 的状态。LWLockAcquire 无法立即取得显示为 BackgroundWorker 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/BackgroundWorker 的会话
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 = 'LWLock'
  AND wait_event = 'BackgroundWorker'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'BackgroundWorker'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.8 - LWLock: BtreeVacuum

等待读取或更新 B-tree 索引中与 vacuum 相关的信息。
PostgreSQL 等待事件档案
类别LWLock 事件BtreeVacuum 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新 B-tree 索引中与 vacuum 相关的信息。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/access/nbtree/nbtutils.c:3519。探针覆盖的操作是:等待读取或更新 B-tree 索引中与 vacuum 相关的信息。LWLockAcquire 无法立即取得显示为 BtreeVacuum 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/BtreeVacuum 的会话
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 = 'LWLock'
  AND wait_event = 'BtreeVacuum'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'BtreeVacuum'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.9 - LWLock: BufferContent

等待访问内存中的数据页。
PostgreSQL 等待事件档案
类别LWLock 事件BufferContent 版本PG 13-18 证据3 个源码位置

官方描述译文

等待访问内存中的数据页。

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

触发机制

后端已经找到所需的共享缓冲区,但尚未取得该 buffer descriptor 的 content lock。堆表与索引代码在读取或修改内存页前都会取得此锁,因此大量工作进程访问同一页面时会在这里串行化。

正常还是麻烦?

  • 正常: 并发读写共享页面时,零星而短暂的样本很常见。
  • 需要调查: 大量前台会话连续命中时,通常指向热点堆表/索引页、向右增长的索引,或与业务同时访问相同块的维护任务。

诊断 SQL

正在等待 LWLock/BufferContent 的会话
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 = 'LWLock'
  AND wait_event = 'BufferContent'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'BufferContent'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 找出等待会话共同访问的关系与语句。
  2. 用页面与索引证据确认热点,不能只凭等待名称下结论。
  3. 先分散热点键、批量写入或错峰维护,再考虑容量调整。

源码证据

典型事故模式

单调递增键让并发 B-tree 插入集中到最右叶子页,BufferContent 与插入延迟同步上升。

5.10 - LWLock: BufferMapping

等待将数据块关联到 buffer pool 中的 buffer。
PostgreSQL 等待事件档案
类别LWLock 事件BufferMapping 版本PG 13-18 证据3 个源码位置

官方描述译文

等待将数据块关联到 buffer pool 中的 buffer。

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

触发机制

缓冲区管理器把 relation/fork/block 标签哈希到由 BufferMappingLock 保护的分区。查找、插入、淘汰和重新分配标签都会短暂取得该分区锁;大规模并发未命中或缓冲区抖动会增加碰撞。

正常还是麻烦?

  • 正常: 页面进入或离开共享缓冲区时,短暂等待属于正常现象。
  • 需要调查: 持续出现通常意味着工作集反复冲刷 shared buffers、大量并行扫描,或访问集中映射到少数分区。

诊断 SQL

正在等待 LWLock/BufferMapping 的会话
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 = 'LWLock'
  AND wait_event = 'BufferMapping'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'BufferMapping'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 按数据库与语句关联缓冲命中率和读取量。
  2. 检查是否出现新扫描、缓存过小或并发突增。
  3. 先降低并发扫描扇出或修正访问路径,再决定是否扩大 shared_buffers。

源码证据

典型事故模式

执行计划退化引发大量并发大扫描,缓冲映射分区变热,同时有用页面被挤出缓存。

5.11 - LWLock: Checkpoint

等待开始执行检查点。
PostgreSQL 等待事件档案
类别LWLock 事件Checkpoint 版本PG 13 证据3 个源码位置

官方描述译文

等待开始执行检查点。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:765,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/access/transam/xlog.c:8957。探针覆盖的操作是:等待开始执行检查点。LWLockAcquire 无法立即取得显示为 Checkpoint 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/Checkpoint 的会话
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 = 'LWLock'
  AND wait_event = 'Checkpoint'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'Checkpoint'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.12 - LWLock: CheckpointerComm

等待管理 fsync 请求。
PostgreSQL 等待事件档案
类别LWLock 事件CheckpointerComm 版本PG 13-18 证据3 个源码位置

官方描述译文

等待管理 fsync 请求。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/postmaster/checkpointer.c:1164。探针覆盖的操作是:等待管理 fsync 请求。LWLockAcquire 无法立即取得显示为 CheckpointerComm 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/CheckpointerComm 的会话
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 = 'LWLock'
  AND wait_event = 'CheckpointerComm'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'CheckpointerComm'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.13 - LWLock: CommitTs

等待读取或更新事务提交时间戳的最近设定值。
PostgreSQL 等待事件档案
类别LWLock 事件CommitTs 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新事务提交时间戳的最近设定值。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/access/transam/commit_ts.c:206。探针覆盖的操作是:等待读取或更新事务提交时间戳的最近设定值。LWLockAcquire 无法立即取得显示为 CommitTs 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/CommitTs 的会话
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 = 'LWLock'
  AND wait_event = 'CommitTs'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'CommitTs'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.14 - LWLock: CommitTsBuffer

等待事务提交时间戳 SLRU buffer 上的 I/O。
PostgreSQL 等待事件档案
类别LWLock 事件CommitTsBuffer 版本PG 13-18 证据3 个源码位置

官方描述译文

等待事务提交时间戳 SLRU buffer 上的 I/O。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:141。探针覆盖的操作是:等待事务提交时间戳 SLRU buffer 上的 I/O。LWLockAcquire 无法立即取得显示为 CommitTsBuffer 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/CommitTsBuffer 的会话
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 = 'LWLock'
  AND wait_event = 'CommitTsBuffer'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'CommitTsBuffer'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.15 - LWLock: CommitTsSLRU

等待访问事务提交时间戳 SLRU 缓存。
PostgreSQL 等待事件档案
类别LWLock 事件CommitTsSLRU 版本PG 13-18 证据3 个源码位置

官方描述译文

等待访问事务提交时间戳 SLRU 缓存。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:172。探针覆盖的操作是:等待访问事务提交时间戳 SLRU 缓存。LWLockAcquire 无法立即取得显示为 CommitTsSLRU 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/CommitTsSLRU 的会话
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 = 'LWLock'
  AND wait_event = 'CommitTsSLRU'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'CommitTsSLRU'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.16 - LWLock: ControlFile

等待读取或更新 pg_control 文件,或创建新的 WAL 文件。
PostgreSQL 等待事件档案
类别LWLock 事件ControlFile 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新 pg_control 文件,或创建新的 WAL 文件。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/access/transam/xlog.c:2723。探针覆盖的操作是:等待读取或更新 pg_control 文件,或创建新的 WAL 文件。LWLockAcquire 无法立即取得显示为 ControlFile 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/ControlFile 的会话
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 = 'LWLock'
  AND wait_event = 'ControlFile'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'ControlFile'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.17 - LWLock: DSMRegistry

等待读取或更新动态共享内存注册表。
PostgreSQL 等待事件档案
类别LWLock 事件DSMRegistry 版本PG 17-18 证据3 个源码位置

官方描述译文

等待读取或更新动态共享内存注册表。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/ipc/dsm_registry.c:98。探针覆盖的操作是:等待读取或更新动态共享内存注册表。LWLockAcquire 无法立即取得显示为 DSMRegistry 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/DSMRegistry 的会话
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 = 'LWLock'
  AND wait_event = 'DSMRegistry'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'DSMRegistry'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.18 - LWLock: DSMRegistryDSA

等待访问动态共享内存注册表的动态共享内存分配器。
PostgreSQL 等待事件档案
类别LWLock 事件DSMRegistryDSA 版本PG 17-18 证据3 个源码位置

官方描述译文

等待访问动态共享内存注册表的动态共享内存分配器。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:170。探针覆盖的操作是:等待访问动态共享内存注册表的动态共享内存分配器。LWLockAcquire 无法立即取得显示为 DSMRegistryDSA 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/DSMRegistryDSA 的会话
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 = 'LWLock'
  AND wait_event = 'DSMRegistryDSA'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'DSMRegistryDSA'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.19 - LWLock: DSMRegistryHash

等待访问动态共享内存注册表的共享哈希表。
PostgreSQL 等待事件档案
类别LWLock 事件DSMRegistryHash 版本PG 17-18 证据3 个源码位置

官方描述译文

等待访问动态共享内存注册表的共享哈希表。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:171。探针覆盖的操作是:等待访问动态共享内存注册表的共享哈希表。LWLockAcquire 无法立即取得显示为 DSMRegistryHash 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/DSMRegistryHash 的会话
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 = 'LWLock'
  AND wait_event = 'DSMRegistryHash'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'DSMRegistryHash'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.20 - LWLock: DynamicSharedMemoryControl

等待读取或更新动态共享内存分配信息。
PostgreSQL 等待事件档案
类别LWLock 事件DynamicSharedMemoryControl 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新动态共享内存分配信息。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/ipc/dsm.c:549。探针覆盖的操作是:等待读取或更新动态共享内存分配信息。LWLockAcquire 无法立即取得显示为 DynamicSharedMemoryControl 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/DynamicSharedMemoryControl 的会话
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 = 'LWLock'
  AND wait_event = 'DynamicSharedMemoryControl'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'DynamicSharedMemoryControl'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.21 - LWLock: InjectionPoint

等待读取或更新与注入点相关的信息。
PostgreSQL 等待事件档案
类别LWLock 事件InjectionPoint 版本PG 17-18 证据3 个源码位置

官方描述译文

等待读取或更新与注入点相关的信息。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:353。探针覆盖的操作是:等待读取或更新与注入点相关的信息。LWLockAcquire 无法立即取得显示为 InjectionPoint 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/InjectionPoint 的会话
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 = 'LWLock'
  AND wait_event = 'InjectionPoint'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'InjectionPoint'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.22 - LWLock: LockFastPath

等待读取或更新进程的快速路径锁信息。
PostgreSQL 等待事件档案
类别LWLock 事件LockFastPath 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新进程的快速路径锁信息。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:151。探针覆盖的操作是:等待读取或更新进程的快速路径锁信息。LWLockAcquire 无法立即取得显示为 LockFastPath 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/LockFastPath 的会话
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 = 'LWLock'
  AND wait_event = 'LockFastPath'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'LockFastPath'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.23 - LWLock: LockManager

等待读取或更新“重量级”锁的信息。
PostgreSQL 等待事件档案
类别LWLock 事件LockManager 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新“重量级”锁的信息。

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

触发机制

重量级锁的账本存放在由 LockHashPartitionLock 分区保护的共享哈希表中。获取、授予、释放或检查大量重量级锁时,即使不存在 SQL 层锁冲突,也可能在分区锁上竞争。

正常还是麻烦?

  • 正常: 普通关系锁与事务锁流量会带来小规模突发。
  • 需要调查: 持续占比通常来自锁扇出:超大事务、大量分区、频繁 DDL,或成千上万的排队锁请求。

诊断 SQL

正在等待 LWLock/LockManager 的会话
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 = 'LWLock'
  AND wait_event = 'LockManager'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'LockManager'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 按 PID 统计 pg_locks 行数并检查阻塞树。
  2. 定位一次触碰大量关系或分区的语句。
  3. 缩短事务并降低锁扇出;只有真实容量报错时才提高 max_locks_per_transaction。

源码证据

典型事故模式

发布过程对数千分区执行 DDL,同时业务会话获取关系锁;在明显阻塞者出现前,内部锁表已经发生竞争。

5.24 - LWLock: LogicalRepLauncherDSA

等待访问逻辑复制 launcher 的动态共享内存分配器。
PostgreSQL 等待事件档案
类别LWLock 事件LogicalRepLauncherDSA 版本PG 16-18 证据3 个源码位置

官方描述译文

等待访问逻辑复制 launcher 的动态共享内存分配器。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:168。探针覆盖的操作是:等待访问逻辑复制 launcher 的动态共享内存分配器。LWLockAcquire 无法立即取得显示为 LogicalRepLauncherDSA 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/LogicalRepLauncherDSA 的会话
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 = 'LWLock'
  AND wait_event = 'LogicalRepLauncherDSA'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'LogicalRepLauncherDSA'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.25 - LWLock: LogicalRepLauncherHash

等待访问逻辑复制 launcher 的共享哈希表。
PostgreSQL 等待事件档案
类别LWLock 事件LogicalRepLauncherHash 版本PG 16-18 证据3 个源码位置

官方描述译文

等待访问逻辑复制 launcher 的共享哈希表。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:169。探针覆盖的操作是:等待访问逻辑复制 launcher 的共享哈希表。LWLockAcquire 无法立即取得显示为 LogicalRepLauncherHash 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/LogicalRepLauncherHash 的会话
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 = 'LWLock'
  AND wait_event = 'LogicalRepLauncherHash'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'LogicalRepLauncherHash'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.26 - LWLock: LogicalRepWorker

等待读取或更新逻辑复制 worker 的状态。
PostgreSQL 等待事件档案
类别LWLock 事件LogicalRepWorker 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新逻辑复制 worker 的状态。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/replication/logical/launcher.c:189。探针覆盖的操作是:等待读取或更新逻辑复制 worker 的状态。LWLockAcquire 无法立即取得显示为 LogicalRepWorker 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/LogicalRepWorker 的会话
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 = 'LWLock'
  AND wait_event = 'LogicalRepWorker'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'LogicalRepWorker'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.27 - LWLock: MultiXactGen

等待读取或更新共享 multixact 状态。
PostgreSQL 等待事件档案
类别LWLock 事件MultiXactGen 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新共享 multixact 状态。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/access/transam/multixact.c:738。探针覆盖的操作是:等待读取或更新共享 multixact 状态。LWLockAcquire 无法立即取得显示为 MultiXactGen 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/MultiXactGen 的会话
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 = 'LWLock'
  AND wait_event = 'MultiXactGen'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'MultiXactGen'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.28 - LWLock: MultiXactMemberBuffer

等待 multixact member SLRU buffer 上的 I/O。
PostgreSQL 等待事件档案
类别LWLock 事件MultiXactMemberBuffer 版本PG 13-18 证据3 个源码位置

官方描述译文

等待 multixact member SLRU buffer 上的 I/O。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:144。探针覆盖的操作是:等待 multixact member SLRU buffer 上的 I/O。LWLockAcquire 无法立即取得显示为 MultiXactMemberBuffer 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/MultiXactMemberBuffer 的会话
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 = 'LWLock'
  AND wait_event = 'MultiXactMemberBuffer'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'MultiXactMemberBuffer'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.29 - LWLock: MultiXactMemberSLRU

等待访问 multixact member SLRU 缓存。
PostgreSQL 等待事件档案
类别LWLock 事件MultiXactMemberSLRU 版本PG 13-18 证据3 个源码位置

官方描述译文

等待访问 multixact member SLRU 缓存。

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

触发机制

此锁保护 pg_multixact/members 的 SLRU 缓存;这里保存共享行锁使用的 multitransaction ID 成员事务。并发行锁创建与旧成员查询会在这里相遇。

正常还是麻烦?

  • 正常: 使用 SELECT FOR SHARE/KEY SHARE,或因外键检查创建 multixact 的负载中会短暂出现。
  • 需要调查: 持续竞争指向大量共享行锁、multixact 抖动、冻结落后,或 pg_multixact 存储缓慢。

诊断 SQL

正在等待 LWLock/MultiXactMemberSLRU 的会话
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 = 'LWLock'
  AND wait_event = 'MultiXactMemberSLRU'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'MultiXactMemberSLRU'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 找出制造大量共享行锁的语句与表。
  2. 检查 multixact 年龄与 autovacuum 进度。
  3. 降低锁扇出并解除 multixact 冻结阻塞;若同时出现 buffer 等待,再查 member SLRU I/O。

源码证据

典型事故模式

高扇出的外键负载锁住大量父表行,同时长事务推迟 multixact 清理,最终引发 member 缓存竞争。

5.30 - LWLock: MultiXactOffsetBuffer

等待 multixact offset SLRU buffer 上的 I/O。
PostgreSQL 等待事件档案
类别LWLock 事件MultiXactOffsetBuffer 版本PG 13-18 证据3 个源码位置

官方描述译文

等待 multixact offset SLRU buffer 上的 I/O。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:143。探针覆盖的操作是:等待 multixact offset SLRU buffer 上的 I/O。LWLockAcquire 无法立即取得显示为 MultiXactOffsetBuffer 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/MultiXactOffsetBuffer 的会话
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 = 'LWLock'
  AND wait_event = 'MultiXactOffsetBuffer'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'MultiXactOffsetBuffer'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.31 - LWLock: MultiXactOffsetSLRU

等待访问 multixact offset SLRU 缓存。
PostgreSQL 等待事件档案
类别LWLock 事件MultiXactOffsetSLRU 版本PG 13-18 证据3 个源码位置

官方描述译文

等待访问 multixact offset SLRU 缓存。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:173。探针覆盖的操作是:等待访问 multixact offset SLRU 缓存。LWLockAcquire 无法立即取得显示为 MultiXactOffsetSLRU 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/MultiXactOffsetSLRU 的会话
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 = 'LWLock'
  AND wait_event = 'MultiXactOffsetSLRU'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'MultiXactOffsetSLRU'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.32 - LWLock: MultiXactTruncation

等待读取或截断 multixact 信息。
PostgreSQL 等待事件档案
类别LWLock 事件MultiXactTruncation 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或截断 multixact 信息。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/access/transam/multixact.c:2901。探针覆盖的操作是:等待读取或截断 multixact 信息。LWLockAcquire 无法立即取得显示为 MultiXactTruncation 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/MultiXactTruncation 的会话
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 = 'LWLock'
  AND wait_event = 'MultiXactTruncation'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'MultiXactTruncation'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.33 - LWLock: NotifyBuffer

等待 NOTIFY 消息 SLRU buffer 上的 I/O。
PostgreSQL 等待事件档案
类别LWLock 事件NotifyBuffer 版本PG 13-18 证据3 个源码位置

官方描述译文

等待 NOTIFY 消息 SLRU buffer 上的 I/O。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:145。探针覆盖的操作是:等待 NOTIFY 消息 SLRU buffer 上的 I/O。LWLockAcquire 无法立即取得显示为 NotifyBuffer 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/NotifyBuffer 的会话
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 = 'LWLock'
  AND wait_event = 'NotifyBuffer'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'NotifyBuffer'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.34 - LWLock: NotifyQueue

等待读取或更新 NOTIFY 消息。
PostgreSQL 等待事件档案
类别LWLock 事件NotifyQueue 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新 NOTIFY 消息。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/commands/async.c:940。探针覆盖的操作是:等待读取或更新 NOTIFY 消息。LWLockAcquire 无法立即取得显示为 NotifyQueue 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/NotifyQueue 的会话
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 = 'LWLock'
  AND wait_event = 'NotifyQueue'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'NotifyQueue'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.35 - LWLock: NotifyQueueTail

等待更新 NOTIFY 消息的存储上限。
PostgreSQL 等待事件档案
类别LWLock 事件NotifyQueueTail 版本PG 13-18 证据3 个源码位置

官方描述译文

等待更新 NOTIFY 消息的存储上限。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/commands/async.c:2126。探针覆盖的操作是:等待更新 NOTIFY 消息的存储上限。LWLockAcquire 无法立即取得显示为 NotifyQueueTail 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/NotifyQueueTail 的会话
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 = 'LWLock'
  AND wait_event = 'NotifyQueueTail'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'NotifyQueueTail'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.36 - LWLock: NotifySLRU

等待访问 NOTIFY 消息 SLRU 缓存。
PostgreSQL 等待事件档案
类别LWLock 事件NotifySLRU 版本PG 13-18 证据3 个源码位置

官方描述译文

等待访问 NOTIFY 消息 SLRU 缓存。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:175。探针覆盖的操作是:等待访问 NOTIFY 消息 SLRU 缓存。LWLockAcquire 无法立即取得显示为 NotifySLRU 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/NotifySLRU 的会话
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 = 'LWLock'
  AND wait_event = 'NotifySLRU'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'NotifySLRU'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.37 - LWLock: OidGen

等待分配新的 OID。
PostgreSQL 等待事件档案
类别LWLock 事件OidGen 版本PG 13-18 证据3 个源码位置

官方描述译文

等待分配新的 OID。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/access/transam/varsup.c:563。探针覆盖的操作是:等待分配新的 OID。LWLockAcquire 无法立即取得显示为 OidGen 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/OidGen 的会话
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 = 'LWLock'
  AND wait_event = 'OidGen'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'OidGen'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.38 - LWLock: OldSnapshotTimeMap

等待读取或更新旧快照控制信息。
PostgreSQL 等待事件档案
类别LWLock 事件OldSnapshotTimeMap 版本PG 13-16 证据2 个源码位置

官方描述译文

等待读取或更新旧快照控制信息。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:750,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/time/snapmgr.c:1758。探针覆盖的操作是:等待读取或更新旧快照控制信息。LWLockAcquire 无法立即取得显示为 OldSnapshotTimeMap 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/OldSnapshotTimeMap 的会话
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 = 'LWLock'
  AND wait_event = 'OldSnapshotTimeMap'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'OldSnapshotTimeMap'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.39 - LWLock: ParallelAppend

执行 Parallel Append 计划期间,等待选择下一个子计划。
PostgreSQL 等待事件档案
类别LWLock 事件ParallelAppend 版本PG 13-18 证据3 个源码位置

官方描述译文

执行 Parallel Append 计划期间,等待选择下一个子计划。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/executor/nodeAppend.c:69。探针覆盖的操作是:执行 Parallel Append 计划期间,等待选择下一个子计划。LWLockAcquire 无法立即取得显示为 ParallelAppend 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/ParallelAppend 的会话
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 = 'LWLock'
  AND wait_event = 'ParallelAppend'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'ParallelAppend'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.40 - LWLock: ParallelBtreeScan

执行 Parallel B-tree Scan 计划期间,等待同步 worker。
PostgreSQL 等待事件档案
类别LWLock 事件ParallelBtreeScan 版本PG 18 证据3 个源码位置

官方描述译文

执行 Parallel B-tree Scan 计划期间,等待同步 worker。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:156。探针覆盖的操作是:执行 Parallel B-tree Scan 计划期间,等待同步 worker。LWLockAcquire 无法立即取得显示为 ParallelBtreeScan 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/ParallelBtreeScan 的会话
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 = 'LWLock'
  AND wait_event = 'ParallelBtreeScan'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'ParallelBtreeScan'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.41 - LWLock: ParallelHashJoin

执行 Parallel Hash Join 计划期间,等待同步 worker。
PostgreSQL 等待事件档案
类别LWLock 事件ParallelHashJoin 版本PG 13-18 证据3 个源码位置

官方描述译文

执行 Parallel Hash Join 计划期间,等待同步 worker。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/executor/nodeHash.c:71。探针覆盖的操作是:执行 Parallel Hash Join 计划期间,等待同步 worker。LWLockAcquire 无法立即取得显示为 ParallelHashJoin 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/ParallelHashJoin 的会话
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 = 'LWLock'
  AND wait_event = 'ParallelHashJoin'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'ParallelHashJoin'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.42 - LWLock: ParallelQueryDSA

等待并行查询的动态共享内存分配。
PostgreSQL 等待事件档案
类别LWLock 事件ParallelQueryDSA 版本PG 13-18 证据3 个源码位置

官方描述译文

等待并行查询的动态共享内存分配。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:157。探针覆盖的操作是:等待并行查询的动态共享内存分配。LWLockAcquire 无法立即取得显示为 ParallelQueryDSA 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/ParallelQueryDSA 的会话
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 = 'LWLock'
  AND wait_event = 'ParallelQueryDSA'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'ParallelQueryDSA'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.43 - LWLock: ParallelVacuumDSA

等待并行 vacuum 的动态共享内存分配。
PostgreSQL 等待事件档案
类别LWLock 事件ParallelVacuumDSA 版本PG 17-18 证据3 个源码位置

官方描述译文

等待并行 vacuum 的动态共享内存分配。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:179。探针覆盖的操作是:等待并行 vacuum 的动态共享内存分配。LWLockAcquire 无法立即取得显示为 ParallelVacuumDSA 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/ParallelVacuumDSA 的会话
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 = 'LWLock'
  AND wait_event = 'ParallelVacuumDSA'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'ParallelVacuumDSA'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.44 - LWLock: PerSessionDSA

等待并行查询的动态共享内存分配。
PostgreSQL 等待事件档案
类别LWLock 事件PerSessionDSA 版本PG 13-18 证据3 个源码位置

官方描述译文

等待并行查询的动态共享内存分配。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:158。探针覆盖的操作是:等待并行查询的动态共享内存分配。LWLockAcquire 无法立即取得显示为 PerSessionDSA 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/PerSessionDSA 的会话
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 = 'LWLock'
  AND wait_event = 'PerSessionDSA'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'PerSessionDSA'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.45 - LWLock: PerSessionRecordType

等待访问并行查询的复合类型信息。
PostgreSQL 等待事件档案
类别LWLock 事件PerSessionRecordType 版本PG 13-18 证据3 个源码位置

官方描述译文

等待访问并行查询的复合类型信息。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:159。探针覆盖的操作是:等待访问并行查询的复合类型信息。LWLockAcquire 无法立即取得显示为 PerSessionRecordType 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/PerSessionRecordType 的会话
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 = 'LWLock'
  AND wait_event = 'PerSessionRecordType'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'PerSessionRecordType'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.46 - LWLock: PerSessionRecordTypmod

等待访问并行查询中用于标识匿名 record 类型的类型修饰符信息。
PostgreSQL 等待事件档案
类别LWLock 事件PerSessionRecordTypmod 版本PG 13-18 证据3 个源码位置

官方描述译文

等待访问并行查询中用于标识匿名 record 类型的类型修饰符信息。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:160。探针覆盖的操作是:等待访问并行查询中用于标识匿名 record 类型的类型修饰符信息。LWLockAcquire 无法立即取得显示为 PerSessionRecordTypmod 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/PerSessionRecordTypmod 的会话
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 = 'LWLock'
  AND wait_event = 'PerSessionRecordTypmod'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'PerSessionRecordTypmod'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.47 - LWLock: PerXactPredicateList

并行查询期间,等待访问当前可串行化事务所持有的谓词锁列表。
PostgreSQL 等待事件档案
类别LWLock 事件PerXactPredicateList 版本PG 13-18 证据3 个源码位置

官方描述译文

并行查询期间,等待访问当前可串行化事务所持有的谓词锁列表。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:164。探针覆盖的操作是:并行查询期间,等待访问当前可串行化事务所持有的谓词锁列表。LWLockAcquire 无法立即取得显示为 PerXactPredicateList 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/PerXactPredicateList 的会话
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 = 'LWLock'
  AND wait_event = 'PerXactPredicateList'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'PerXactPredicateList'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.48 - LWLock: PgStatsDSA

等待访问统计信息的动态共享内存分配器。
PostgreSQL 等待事件档案
类别LWLock 事件PgStatsDSA 版本PG 15-18 证据3 个源码位置

官方描述译文

等待访问统计信息的动态共享内存分配器。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:165。探针覆盖的操作是:等待访问统计信息的动态共享内存分配器。LWLockAcquire 无法立即取得显示为 PgStatsDSA 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/PgStatsDSA 的会话
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 = 'LWLock'
  AND wait_event = 'PgStatsDSA'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'PgStatsDSA'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.49 - LWLock: PgStatsData

等待访问共享内存中的统计数据。
PostgreSQL 等待事件档案
类别LWLock 事件PgStatsData 版本PG 15-18 证据3 个源码位置

官方描述译文

等待访问共享内存中的统计数据。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:167。探针覆盖的操作是:等待访问共享内存中的统计数据。LWLockAcquire 无法立即取得显示为 PgStatsData 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/PgStatsData 的会话
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 = 'LWLock'
  AND wait_event = 'PgStatsData'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'PgStatsData'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.50 - LWLock: PgStatsHash

等待访问统计信息的共享内存哈希表。
PostgreSQL 等待事件档案
类别LWLock 事件PgStatsHash 版本PG 15-18 证据3 个源码位置

官方描述译文

等待访问统计信息的共享内存哈希表。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:166。探针覆盖的操作是:等待访问统计信息的共享内存哈希表。LWLockAcquire 无法立即取得显示为 PgStatsHash 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/PgStatsHash 的会话
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 = 'LWLock'
  AND wait_event = 'PgStatsHash'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'PgStatsHash'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.51 - LWLock: PredicateLockManager

等待访问可串行化事务使用的谓词锁信息。
PostgreSQL 等待事件档案
类别LWLock 事件PredicateLockManager 版本PG 13-18 证据3 个源码位置

官方描述译文

等待访问可串行化事务使用的谓词锁信息。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:154。探针覆盖的操作是:等待访问可串行化事务使用的谓词锁信息。LWLockAcquire 无法立即取得显示为 PredicateLockManager 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/PredicateLockManager 的会话
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 = 'LWLock'
  AND wait_event = 'PredicateLockManager'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'PredicateLockManager'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.52 - LWLock: ProcArray

等待访问共享的进程级数据结构(通常用于获取快照或报告会话的事务 ID)。
PostgreSQL 等待事件档案
类别LWLock 事件ProcArray 版本PG 13-18 证据3 个源码位置

官方描述译文

等待访问共享的进程级数据结构(通常用于获取快照或报告会话的事务 ID)。

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

触发机制

ProcArrayLock 保护用于快照、事务可见性与事务结束处理的共享 PGPROC/PGXACT 数组。获取快照以及更新进程事务状态都必须短暂经过它协调。

正常还是麻烦?

  • 正常: 大量事务开始与结束的繁忙 OLTP 系统中,短暂等待属于预期。
  • 需要调查: 持续竞争可能伴随极高连接数、大量快照、长事务,或事务集中结束。

诊断 SQL

正在等待 LWLock/ProcArray 的会话
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 = 'LWLock'
  AND wait_event = 'ProcArray'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'ProcArray'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 测量活动后端与事务年龄,不要只看总连接数。
  2. 找出让可见性边界停滞的长事务与 idle in transaction 会话。
  3. 使用连接池、缩短事务,并避免大量微事务同步突发。

源码证据

典型事故模式

应用重连风暴制造数千个短事务,同时报表查询持有旧快照,放大了 ProcArray 流量。

5.53 - LWLock: RelCacheInit

等待读取或更新 pg_internal.init relation cache 初始化文件。
PostgreSQL 等待事件档案
类别LWLock 事件RelCacheInit 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新 pg_internal.init relation cache 初始化文件。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:323。探针覆盖的操作是:等待读取或更新 pg_internal.init relation cache 初始化文件。LWLockAcquire 无法立即取得显示为 RelCacheInit 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/RelCacheInit 的会话
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 = 'LWLock'
  AND wait_event = 'RelCacheInit'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'RelCacheInit'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.54 - LWLock: RelationMapping

等待读取或更新 pg_filenode.map 文件(用于跟踪某些系统目录的 filenode 分配)。
PostgreSQL 等待事件档案
类别LWLock 事件RelationMapping 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新 pg_filenode.map 文件(用于跟踪某些系统目录的 filenode 分配)。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:332。探针覆盖的操作是:等待读取或更新 pg_filenode.map 文件(用于跟踪某些系统目录的 filenode 分配)。LWLockAcquire 无法立即取得显示为 RelationMapping 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/RelationMapping 的会话
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 = 'LWLock'
  AND wait_event = 'RelationMapping'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'RelationMapping'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.55 - LWLock: ReplicationOrigin

等待创建、删除或使用复制源。
PostgreSQL 等待事件档案
类别LWLock 事件ReplicationOrigin 版本PG 13-18 证据3 个源码位置

官方描述译文

等待创建、删除或使用复制源。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/replication/logical/origin.c:377。探针覆盖的操作是:等待创建、删除或使用复制源。LWLockAcquire 无法立即取得显示为 ReplicationOrigin 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/ReplicationOrigin 的会话
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 = 'LWLock'
  AND wait_event = 'ReplicationOrigin'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'ReplicationOrigin'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.56 - LWLock: ReplicationOriginState

等待读取或更新一个复制源的进度。
PostgreSQL 等待事件档案
类别LWLock 事件ReplicationOriginState 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新一个复制源的进度。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/replication/logical/origin.c:557。探针覆盖的操作是:等待读取或更新一个复制源的进度。LWLockAcquire 无法立即取得显示为 ReplicationOriginState 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/ReplicationOriginState 的会话
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 = 'LWLock'
  AND wait_event = 'ReplicationOriginState'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'ReplicationOriginState'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.57 - LWLock: ReplicationSlotAllocation

等待分配或释放复制槽。
PostgreSQL 等待事件档案
类别LWLock 事件ReplicationSlotAllocation 版本PG 13-18 证据3 个源码位置

官方描述译文

等待分配或释放复制槽。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/replication/logical/slotsync.c:543。探针覆盖的操作是:等待分配或释放复制槽。LWLockAcquire 无法立即取得显示为 ReplicationSlotAllocation 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/ReplicationSlotAllocation 的会话
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 = 'LWLock'
  AND wait_event = 'ReplicationSlotAllocation'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'ReplicationSlotAllocation'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.58 - LWLock: ReplicationSlotControl

等待读取或更新复制槽状态。
PostgreSQL 等待事件档案
类别LWLock 事件ReplicationSlotControl 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新复制槽状态。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/replication/logical/logical.c:492。探针覆盖的操作是:等待读取或更新复制槽状态。LWLockAcquire 无法立即取得显示为 ReplicationSlotControl 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/ReplicationSlotControl 的会话
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 = 'LWLock'
  AND wait_event = 'ReplicationSlotControl'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'ReplicationSlotControl'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.59 - LWLock: ReplicationSlotIO

等待复制槽上的 I/O。
PostgreSQL 等待事件档案
类别LWLock 事件ReplicationSlotIO 版本PG 13-18 证据3 个源码位置

官方描述译文

等待复制槽上的 I/O。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:150。探针覆盖的操作是:等待复制槽上的 I/O。LWLockAcquire 无法立即取得显示为 ReplicationSlotIO 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/ReplicationSlotIO 的会话
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 = 'LWLock'
  AND wait_event = 'ReplicationSlotIO'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'ReplicationSlotIO'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.60 - LWLock: SInvalRead

等待从共享系统目录失效队列中取出消息。
PostgreSQL 等待事件档案
类别LWLock 事件SInvalRead 版本PG 13-18 证据3 个源码位置

官方描述译文

等待从共享系统目录失效队列中取出消息。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/ipc/sinvaladt.c:497。探针覆盖的操作是:等待从共享系统目录失效队列中取出消息。LWLockAcquire 无法立即取得显示为 SInvalRead 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/SInvalRead 的会话
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 = 'LWLock'
  AND wait_event = 'SInvalRead'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'SInvalRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.61 - LWLock: SInvalWrite

等待向共享系统目录失效队列中添加消息。
PostgreSQL 等待事件档案
类别LWLock 事件SInvalWrite 版本PG 13-18 证据3 个源码位置

官方描述译文

等待向共享系统目录失效队列中添加消息。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/ipc/sinvaladt.c:290。探针覆盖的操作是:等待向共享系统目录失效队列中添加消息。LWLockAcquire 无法立即取得显示为 SInvalWrite 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/SInvalWrite 的会话
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 = 'LWLock'
  AND wait_event = 'SInvalWrite'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'SInvalWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.62 - LWLock: SerialBuffer

等待可串行化事务冲突 SLRU buffer 上的 I/O。
PostgreSQL 等待事件档案
类别LWLock 事件SerialBuffer 版本PG 13-18 证据3 个源码位置

官方描述译文

等待可串行化事务冲突 SLRU buffer 上的 I/O。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:146。探针覆盖的操作是:等待可串行化事务冲突 SLRU buffer 上的 I/O。LWLockAcquire 无法立即取得显示为 SerialBuffer 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/SerialBuffer 的会话
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 = 'LWLock'
  AND wait_event = 'SerialBuffer'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'SerialBuffer'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.63 - LWLock: SerialControl

等待读取或更新共享的 pg_serial 状态。
PostgreSQL 等待事件档案
类别LWLock 事件SerialControl 版本PG 17-18 证据3 个源码位置

官方描述译文

等待读取或更新共享的 pg_serial 状态。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/predicate.c:835。探针覆盖的操作是:等待读取或更新共享的 pg_serial 状态。LWLockAcquire 无法立即取得显示为 SerialControl 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/SerialControl 的会话
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 = 'LWLock'
  AND wait_event = 'SerialControl'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'SerialControl'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.64 - LWLock: SerialSLRU

等待访问可串行化事务冲突 SLRU 缓存。
PostgreSQL 等待事件档案
类别LWLock 事件SerialSLRU 版本PG 13-18 证据3 个源码位置

官方描述译文

等待访问可串行化事务冲突 SLRU 缓存。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:176。探针覆盖的操作是:等待访问可串行化事务冲突 SLRU 缓存。LWLockAcquire 无法立即取得显示为 SerialSLRU 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/SerialSLRU 的会话
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 = 'LWLock'
  AND wait_event = 'SerialSLRU'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'SerialSLRU'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.65 - LWLock: SerializableFinishedList

等待访问已结束的可串行化事务列表。
PostgreSQL 等待事件档案
类别LWLock 事件SerializableFinishedList 版本PG 13-18 证据3 个源码位置

官方描述译文

等待访问已结束的可串行化事务列表。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/predicate.c:1507。探针覆盖的操作是:等待访问已结束的可串行化事务列表。LWLockAcquire 无法立即取得显示为 SerializableFinishedList 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/SerializableFinishedList 的会话
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 = 'LWLock'
  AND wait_event = 'SerializableFinishedList'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'SerializableFinishedList'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.66 - LWLock: SerializablePredicateList

等待访问可串行化事务所持有的谓词锁列表。
PostgreSQL 等待事件档案
类别LWLock 事件SerializablePredicateList 版本PG 13-18 证据3 个源码位置

官方描述译文

等待访问可串行化事务所持有的谓词锁列表。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/predicate.c:2220。探针覆盖的操作是:等待访问可串行化事务所持有的谓词锁列表。LWLockAcquire 无法立即取得显示为 SerializablePredicateList 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/SerializablePredicateList 的会话
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 = 'LWLock'
  AND wait_event = 'SerializablePredicateList'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'SerializablePredicateList'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.67 - LWLock: SerializableXactHash

等待读取或更新可串行化事务的信息。
PostgreSQL 等待事件档案
类别LWLock 事件SerializableXactHash 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新可串行化事务的信息。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/predicate.c:1462。探针覆盖的操作是:等待读取或更新可串行化事务的信息。LWLockAcquire 无法立即取得显示为 SerializableXactHash 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/SerializableXactHash 的会话
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 = 'LWLock'
  AND wait_event = 'SerializableXactHash'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'SerializableXactHash'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.68 - LWLock: SharedTidBitmap

并行 bitmap index scan 期间,等待访问共享 TID bitmap。
PostgreSQL 等待事件档案
类别LWLock 事件SharedTidBitmap 版本PG 13-18 证据3 个源码位置

官方描述译文

并行 bitmap index scan 期间,等待访问共享 TID bitmap。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:162。探针覆盖的操作是:并行 bitmap index scan 期间,等待访问共享 TID bitmap。LWLockAcquire 无法立即取得显示为 SharedTidBitmap 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/SharedTidBitmap 的会话
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 = 'LWLock'
  AND wait_event = 'SharedTidBitmap'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'SharedTidBitmap'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.69 - LWLock: SharedTupleStore

并行查询期间,等待访问共享 tuple store。
PostgreSQL 等待事件档案
类别LWLock 事件SharedTupleStore 版本PG 13-18 证据3 个源码位置

官方描述译文

并行查询期间,等待访问共享 tuple store。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:161。探针覆盖的操作是:并行查询期间,等待访问共享 tuple store。LWLockAcquire 无法立即取得显示为 SharedTupleStore 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/SharedTupleStore 的会话
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 = 'LWLock'
  AND wait_event = 'SharedTupleStore'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'SharedTupleStore'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.70 - LWLock: ShmemIndex

等待在共享内存中查找或分配空间。
PostgreSQL 等待事件档案
类别LWLock 事件ShmemIndex 版本PG 13-18 证据3 个源码位置

官方描述译文

等待在共享内存中查找或分配空间。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/ipc/shmem.c:392。探针覆盖的操作是:等待在共享内存中查找或分配空间。LWLockAcquire 无法立即取得显示为 ShmemIndex 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/ShmemIndex 的会话
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 = 'LWLock'
  AND wait_event = 'ShmemIndex'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'ShmemIndex'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.71 - LWLock: SubtransBuffer

等待子事务 SLRU buffer 上的 I/O。
PostgreSQL 等待事件档案
类别LWLock 事件SubtransBuffer 版本PG 13-18 证据3 个源码位置

官方描述译文

等待子事务 SLRU buffer 上的 I/O。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:142。探针覆盖的操作是:等待子事务 SLRU buffer 上的 I/O。LWLockAcquire 无法立即取得显示为 SubtransBuffer 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/SubtransBuffer 的会话
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 = 'LWLock'
  AND wait_event = 'SubtransBuffer'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'SubtransBuffer'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.72 - LWLock: SubtransSLRU

等待访问子事务 SLRU 缓存。
PostgreSQL 等待事件档案
类别LWLock 事件SubtransSLRU 版本PG 13-18 证据3 个源码位置

官方描述译文

等待访问子事务 SLRU 缓存。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:177。探针覆盖的操作是:等待访问子事务 SLRU 缓存。LWLockAcquire 无法立即取得显示为 SubtransSLRU 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/SubtransSLRU 的会话
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 = 'LWLock'
  AND wait_event = 'SubtransSLRU'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'SubtransSLRU'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.73 - LWLock: SyncRep

等待读取或更新同步复制状态信息。
PostgreSQL 等待事件档案
类别LWLock 事件SyncRep 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新同步复制状态信息。

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

触发机制

SyncRepLock 保护同步复制队列与共享 sender 状态。提交会话入队或检查等待位置,WAL sender 则更新已被同步备库确认的 LSN。

正常还是麻烦?

  • 正常: 同步提交排队、WAL sender 发布确认位置时会有小规模突发。
  • 需要调查: 持续的 SyncRep LWLock 竞争不同于等待备库确认:它表示队列/状态协调本身过热,通常发生在极高提交并发或 sender 抖动时。

诊断 SQL

正在等待 LWLock/SyncRep 的会话
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 = 'LWLock'
  AND wait_event = 'SyncRep'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'SyncRep'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 区分 LWLock/SyncRep、IPC/SyncRep 与复制延迟等待。
  2. 检查同步备库健康度、sender 抖动与提交速率。
  3. 稳定复制并平滑提交突发;只有获得明确事故授权时才改变持久性策略。

源码证据

典型事故模式

备库反复抖动,大量同步提交者频繁进出等待队列,使队列协调本身表现为 LWLock/SyncRep。

5.74 - LWLock: SyncScan

等待选择同步表扫描的起始位置。
PostgreSQL 等待事件档案
类别LWLock 事件SyncScan 版本PG 13-18 证据3 个源码位置

官方描述译文

等待选择同步表扫描的起始位置。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/access/common/syncscan.c:258。探针覆盖的操作是:等待选择同步表扫描的起始位置。LWLockAcquire 无法立即取得显示为 SyncScan 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/SyncScan 的会话
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 = 'LWLock'
  AND wait_event = 'SyncScan'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'SyncScan'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.75 - LWLock: TablespaceCreate

等待创建或删除表空间。
PostgreSQL 等待事件档案
类别LWLock 事件TablespaceCreate 版本PG 13-18 证据3 个源码位置

官方描述译文

等待创建或删除表空间。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/commands/tablespace.c:138。探针覆盖的操作是:等待创建或删除表空间。LWLockAcquire 无法立即取得显示为 TablespaceCreate 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/TablespaceCreate 的会话
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 = 'LWLock'
  AND wait_event = 'TablespaceCreate'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'TablespaceCreate'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.76 - LWLock: TwoPhaseState

等待读取或更新预备事务的状态。
PostgreSQL 等待事件档案
类别LWLock 事件TwoPhaseState 版本PG 13-18 证据3 个源码位置

官方描述译文

等待读取或更新预备事务的状态。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/access/transam/twophase.c:329。探针覆盖的操作是:等待读取或更新预备事务的状态。LWLockAcquire 无法立即取得显示为 TwoPhaseState 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/TwoPhaseState 的会话
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 = 'LWLock'
  AND wait_event = 'TwoPhaseState'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'TwoPhaseState'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.77 - LWLock: WALBufMapping

等待替换 WAL buffer 中的页面。
PostgreSQL 等待事件档案
类别LWLock 事件WALBufMapping 版本PG 13-18 证据3 个源码位置

官方描述译文

等待替换 WAL buffer 中的页面。

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

触发机制

WALBufMappingLock 协调 WAL 页号与有限 wal_buffers 槽位之间的映射。后端推进到新 WAL 页或替换缓冲页时需要取得此锁。

正常还是麻烦?

  • 正常: WAL 生成推进并跨越缓冲页时会短暂出现。
  • 需要调查: 持续竞争说明 WAL 生成换页速度超过写路径推进速度,常见于写突发或检查点期间。

诊断 SQL

正在等待 LWLock/WALBufMapping 的会话
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 = 'LWLock'
  AND wait_event = 'WALBufMapping'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'WALBufMapping'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 关联 WAL 字节量、WAL 写入与检查点时间。
  2. 检查写突发期间 wal_buffers 是否反复耗尽。
  3. 先平滑写突发并解决 WAL 设备延迟,再调整缓冲区大小。

源码证据

典型事故模式

批量导入把 WAL 生成推到极限,同时 WAL 设备发生停顿,导致频繁的 WAL 缓冲页重映射。

5.78 - LWLock: WALInsert

等待将 WAL 数据插入内存 buffer。
PostgreSQL 等待事件档案
类别LWLock 事件WALInsert 版本PG 13-18 证据3 个源码位置

官方描述译文

等待将 WAL 数据插入内存 buffer。

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

触发机制

后端在共享 WAL 缓冲区中预留空间并复制 WAL 记录时,必须持有一个 WAL insertion lock。并发 WAL 生产者很多、插入临界区变长时,会在此排队。

正常还是麻烦?

  • 正常: 并发写入与提交突发期间的瞬时等待很正常。
  • 需要调查: 前台会话反复堆积说明 WAL 插入已成为串行点,常伴随极高写并发、全页镜像或缓冲区换页过慢。

诊断 SQL

正在等待 LWLock/WALInsert 的会话
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 = 'LWLock'
  AND wait_event = 'WALInsert'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'WALInsert'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 按 WAL 生成量与调用频率排序语句。
  2. 检查检查点/全页镜像时机与并发写会话数量。
  3. 批量合并微小写入、减少无效索引抖动,并处理 WAL 写延迟。

源码证据

典型事故模式

扇出任务在检查点后立即发起大量单行提交,全页镜像与写并发共同让 WAL 插入成为瓶颈。

5.79 - LWLock: WALSummarizer

等待读取或更新 WAL 汇总状态。
PostgreSQL 等待事件档案
类别LWLock 事件WALSummarizer 版本PG 17-18 证据3 个源码位置

官方描述译文

等待读取或更新 WAL 汇总状态。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/postmaster/walsummarizer.c:273。探针覆盖的操作是:等待读取或更新 WAL 汇总状态。LWLockAcquire 无法立即取得显示为 WALSummarizer 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/WALSummarizer 的会话
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 = 'LWLock'
  AND wait_event = 'WALSummarizer'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'WALSummarizer'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.80 - LWLock: WALWrite

等待将 WAL buffer 写入磁盘。
PostgreSQL 等待事件档案
类别LWLock 事件WALWrite 版本PG 13-18 证据3 个源码位置

官方描述译文

等待将 WAL buffer 写入磁盘。

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

触发机制

WALWriteLock 串行化共享 WAL 缓冲区写入,以及 written/flushed 位置的推进。等待者正在当前执行或协调这项工作的后端之后排队。

正常还是麻烦?

  • 正常: 多个提交者协助写 WAL 时会短暂出现。
  • 需要调查: WALWrite 持续出现且提交延迟上升,通常表示 WAL 写路径变慢,或吞吐跟不上 WAL 生成速度。

诊断 SQL

正在等待 LWLock/WALWrite 的会话
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 = 'LWLock'
  AND wait_event = 'WALWrite'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'WALWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 把 WAL write/sync 时间与提交延迟对照。
  2. 检查 WAL 文件系统/设备、虚拟化限速与检查点重叠。
  3. 降低突发性;只有存储证据确认后才调整 wal_writer 参数。

源码证据

典型事故模式

云盘耗尽突发积分,WAL 写入变长,提交会话在 WALWrite 上排队,同步提交延迟同步恶化。

5.81 - LWLock: WaitEventCustom

等待读取或更新自定义等待事件信息。
PostgreSQL 等待事件档案
类别LWLock 事件WaitEventCustom 版本PG 17-18 证据3 个源码位置

官方描述译文

等待读取或更新自定义等待事件信息。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:193。探针覆盖的操作是:等待读取或更新自定义等待事件信息。LWLockAcquire 无法立即取得显示为 WaitEventCustom 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/WaitEventCustom 的会话
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 = 'LWLock'
  AND wait_event = 'WaitEventCustom'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'WaitEventCustom'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.82 - LWLock: WrapLimitsVacuum

等待更新事务 ID 和 multixact 的消耗上限。
PostgreSQL 等待事件档案
类别LWLock 事件WrapLimitsVacuum 版本PG 13-18 证据3 个源码位置

官方描述译文

等待更新事务 ID 和 multixact 的消耗上限。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/commands/vacuum.c:1858。探针覆盖的操作是:等待更新事务 ID 和 multixact 的消耗上限。LWLockAcquire 无法立即取得显示为 WrapLimitsVacuum 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/WrapLimitsVacuum 的会话
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 = 'LWLock'
  AND wait_event = 'WrapLimitsVacuum'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'WrapLimitsVacuum'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.83 - LWLock: XactBuffer

等待事务状态 SLRU buffer 上的 I/O。
PostgreSQL 等待事件档案
类别LWLock 事件XactBuffer 版本PG 13-18 证据3 个源码位置

官方描述译文

等待事务状态 SLRU buffer 上的 I/O。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/storage/lmgr/lwlock.c:140。探针覆盖的操作是:等待事务状态 SLRU buffer 上的 I/O。LWLockAcquire 无法立即取得显示为 XactBuffer 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/XactBuffer 的会话
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 = 'LWLock'
  AND wait_event = 'XactBuffer'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'XactBuffer'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.84 - LWLock: XactSLRU

等待访问事务状态 SLRU 缓存。
PostgreSQL 等待事件档案
类别LWLock 事件XactSLRU 版本PG 13-18 证据3 个源码位置

官方描述译文

等待访问事务状态 SLRU 缓存。

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

触发机制

事务状态 SLRU 锁保护 pg_xact 缓存元数据与页面,PostgreSQL 读取或更新事务提交状态时会经过这里。对未缓存或很老 XID 的可见性检查会把这条路径带到前台。

正常还是麻烦?

  • 正常: 事务结束与偶发 pg_xact 缓存未命中会带来短暂等待。
  • 需要调查: 持续等待可能表示事务状态缓存抖动、访问很老的元组,或 pg_xact 路径存在存储延迟。

诊断 SQL

正在等待 LWLock/XactSLRU 的会话
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 = 'LWLock'
  AND wait_event = 'XactSLRU'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'XactSLRU'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 检查老事务以及 vacuum/freeze 健康度。
  2. 关联 XactBuffer 与 pg_xact I/O 等待。
  3. 先消除可见性边界阻塞者并恢复清理进度,再考虑容量调整。

源码证据

典型事故模式

长生命周期快照阻止清理,同时查询反复访问冷的旧元组版本,引发 pg_xact 缓存抖动与 XactSLRU 竞争。

5.85 - LWLock: XactTruncation

等待执行 pg_xact_status,或更新当前进程可用的最旧事务 ID。
PostgreSQL 等待事件档案
类别LWLock 事件XactTruncation 版本PG 13-18 证据3 个源码位置

官方描述译文

等待执行 pg_xact_status,或更新当前进程可用的最旧事务 ID。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/access/transam/varsup.c:357。探针覆盖的操作是:等待执行 pg_xact_status,或更新当前进程可用的最旧事务 ID。LWLockAcquire 无法立即取得显示为 XactTruncation 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/XactTruncation 的会话
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 = 'LWLock'
  AND wait_event = 'XactTruncation'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'XactTruncation'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

5.86 - LWLock: XidGen

等待分配新的事务 ID。
PostgreSQL 等待事件档案
类别LWLock 事件XidGen 版本PG 13-18 证据3 个源码位置

官方描述译文

等待分配新的事务 ID。

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

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:739,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/access/transam/varsup.c:105。探针覆盖的操作是:等待分配新的事务 ID。LWLockAcquire 无法立即取得显示为 XidGen 的轻量级锁 tranche;后端在内部共享内存资源上休眠时,通用 LWLock 报告器发布该 tranche 名称。

正常还是麻烦?

  • 正常: 短暂内部临界区周围的零星样本属于正常。
  • 需要调查: 若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

诊断 SQL

正在等待 LWLock/XidGen 的会话
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 = 'LWLock'
  AND wait_event = 'XidGen'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布
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 = 'LWLock'
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 = 'LWLock'
  AND a.wait_event = 'XidGen'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 重复采样并锁定一个热点 tranche。
  2. 把它与受保护资源及当前负载阶段关联。
  3. 降低具体竞争源;增加并发可能让共享内存热点更糟。

源码证据

6 - I/O 等待

文件读取、写入、同步、分配与异步 I/O 完成。

IO 表示 PostgreSQL 已为某个文件操作设置探针,而后端必须等内核或另一个 I/O worker 推进后才能继续。它指出的是哪条 PostgreSQL 文件路径,但单凭事件本身不能证明存储很慢。

把事件、操作和负载阶段一起读

名称通常同时编码对象与操作:DataFileReadWalSyncSlruWriteReorderBufferRead。先问当前负载是否本来就该执行这项操作,再把持续时间与并发度关联到 pg_stat_io(PG16+)和操作系统延迟。

  • 正常: 扫描读取数据文件,检查点同步脏文件,备份读写,恢复读取 WAL。
  • 关注: 同一个前台 I/O 事件在连续样本中存在,而且设备或查询延迟上升。
  • 紧急: 大量后端排队等待 sync/write、出现错误,或受影响路径达到饱和/限速。

值得先认出的事件

事件 第一解释
DataFileRead 缓存未命中或扫描正在读取关系数据
DataFileWrite 后端/检查点路径正在写关系数据
DataFileSync 关系改动正在持久化
WalWrite 正在写入 WAL 字节
WalSync WAL 持久性边界等待 fsync/fdatasync
SlruRead 读取事务相关 SLRU 页面
BuffileRead 读取临时/溢写文件
AioIoCompletion PG18 AIO 工作尚未完成

PG16+ I/O 上下文

SELECT backend_type, object, context,
       reads, read_time, writes, write_time,
       writebacks, fsyncs, fsync_time
FROM pg_stat_io
ORDER BY coalesce(read_time, 0) + coalesce(write_time, 0) + coalesce(fsync_time, 0) DESC;

常见误读

  • 有意执行顺序扫描时,大量 DataFileRead 可能只是健康吞吐。
  • WalWrite 与 LWLock WALWrite 不是一回事:前者是文件操作,后者是内部协调。
  • 设备平均延迟可能掩盖单块 WAL 卷饱和或长尾延迟尖刺。
  • 增大缓存不能解决所有读取等待;糟糕计划和一次性冷扫描仍可能挤出有用页面。

6.1 - IO: AioIoCompletion

等待另一个进程完成 I/O。
PostgreSQL 等待事件档案
类别IO 事件AioIoCompletion 版本PG 18 证据2 个源码位置

官方描述译文

等待另一个进程完成 I/O。

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

触发机制

WAIT_EVENT_AIO_IO_COMPLETION 位于 src/backend/storage/aio/aio.c:643,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:196。探针覆盖的操作是:等待另一个进程完成 I/O。PostgreSQL 在 AioIoCompletion 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/AioIoCompletion 的会话
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 = 'IO'
  AND wait_event = 'AioIoCompletion'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'AioIoCompletion'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.2 - IO: AioIoUringExecution

等待通过 io_uring 执行 I/O。
PostgreSQL 等待事件档案
类别IO 事件AioIoUringExecution 版本PG 18 证据2 个源码位置

官方描述译文

等待通过 io_uring 执行 I/O。

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

触发机制

WAIT_EVENT_AIO_IO_URING_EXECUTION 位于 src/backend/storage/aio/method_io_uring.c:624,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:198。探针覆盖的操作是:等待通过 io_uring 执行 I/O。PostgreSQL 在 AioIoUringExecution 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/AioIoUringExecution 的会话
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 = 'IO'
  AND wait_event = 'AioIoUringExecution'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'AioIoUringExecution'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.3 - IO: AioIoUringSubmit

等待通过 io_uring 提交 I/O。
PostgreSQL 等待事件档案
类别IO 事件AioIoUringSubmit 版本PG 18 证据2 个源码位置

官方描述译文

等待通过 io_uring 提交 I/O。

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

触发机制

WAIT_EVENT_AIO_IO_URING_SUBMIT 位于 src/backend/storage/aio/method_io_uring.c:451,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:197。探针覆盖的操作是:等待通过 io_uring 提交 I/O。PostgreSQL 在 AioIoUringSubmit 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/AioIoUringSubmit 的会话
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 = 'IO'
  AND wait_event = 'AioIoUringSubmit'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'AioIoUringSubmit'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.4 - IO: BasebackupRead

等待基础备份从文件中读取数据。
PostgreSQL 等待事件档案
类别IO 事件BasebackupRead 版本PG 17-18 证据4 个源码位置

官方描述译文

等待基础备份从文件中读取数据。

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

历史名称:IO/BaseBackupRead (PG 14-16)

触发机制

WAIT_EVENT_BASEBACKUP_READ 位于 src/backend/backup/basebackup.c:1837,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:541。探针覆盖的操作是:等待基础备份从文件中读取数据。PostgreSQL 在 BasebackupRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/BasebackupRead 的会话
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 = 'IO'
  AND wait_event = 'BasebackupRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'BasebackupRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.5 - IO: BasebackupSync

等待基础备份写入的数据到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件BasebackupSync 版本PG 17-18 证据4 个源码位置

官方描述译文

等待基础备份写入的数据到达持久化存储。

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

历史名称:IO/BaseBackupSync (PG 15-16)

触发机制

WAIT_EVENT_BASEBACKUP_SYNC 位于 src/backend/backup/basebackup_server.c:206,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:544。探针覆盖的操作是:等待基础备份写入的数据到达持久化存储。PostgreSQL 在 BasebackupSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/BasebackupSync 的会话
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 = 'IO'
  AND wait_event = 'BasebackupSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'BasebackupSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.6 - IO: BasebackupWrite

等待基础备份向文件写入数据。
PostgreSQL 等待事件档案
类别IO 事件BasebackupWrite 版本PG 17-18 证据4 个源码位置

官方描述译文

等待基础备份向文件写入数据。

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

历史名称:IO/BaseBackupWrite (PG 15-16)

触发机制

WAIT_EVENT_BASEBACKUP_WRITE 位于 src/backend/backup/basebackup_server.c:168,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:547。探针覆盖的操作是:等待基础备份向文件写入数据。PostgreSQL 在 BasebackupWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/BasebackupWrite 的会话
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 = 'IO'
  AND wait_event = 'BasebackupWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'BasebackupWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.7 - IO: BuffileRead

等待从缓冲文件中读取数据。
PostgreSQL 等待事件档案
类别IO 事件BuffileRead 版本PG 17-18 证据4 个源码位置

官方描述译文

等待从缓冲文件中读取数据。

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

历史名称:IO/BufFileRead (PG 13-16)

触发机制

WAIT_EVENT_BUFFILE_READ 位于 src/backend/storage/file/buffile.c:464,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:550。探针覆盖的操作是:等待从缓冲文件中读取数据。PostgreSQL 在 BuffileRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/BuffileRead 的会话
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 = 'IO'
  AND wait_event = 'BuffileRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'BuffileRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.8 - IO: BuffileTruncate

等待截断缓冲文件。
PostgreSQL 等待事件档案
类别IO 事件BuffileTruncate 版本PG 17-18 证据4 个源码位置

官方描述译文

等待截断缓冲文件。

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

历史名称:IO/BufFileTruncate (PG 14-16)

触发机制

WAIT_EVENT_BUFFILE_TRUNCATE 位于 src/backend/storage/file/buffile.c:989,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:556。探针覆盖的操作是:等待截断缓冲文件。PostgreSQL 在 BuffileTruncate 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/BuffileTruncate 的会话
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 = 'IO'
  AND wait_event = 'BuffileTruncate'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'BuffileTruncate'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.9 - IO: BuffileWrite

等待向缓冲文件写入数据。
PostgreSQL 等待事件档案
类别IO 事件BuffileWrite 版本PG 17-18 证据4 个源码位置

官方描述译文

等待向缓冲文件写入数据。

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

历史名称:IO/BufFileWrite (PG 13-16)

触发机制

WAIT_EVENT_BUFFILE_WRITE 位于 src/backend/storage/file/buffile.c:541,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:553。探针覆盖的操作是:等待向缓冲文件写入数据。PostgreSQL 在 BuffileWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/BuffileWrite 的会话
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 = 'IO'
  AND wait_event = 'BuffileWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'BuffileWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.10 - IO: ControlFileRead

等待从 pg_control 文件中读取数据。
PostgreSQL 等待事件档案
类别IO 事件ControlFileRead 版本PG 13-18 证据2 个源码位置

官方描述译文

等待从 pg_control 文件中读取数据。

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

触发机制

WAIT_EVENT_CONTROL_FILE_READ 位于 src/backend/access/transam/xlog.c:4362,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:205。探针覆盖的操作是:等待从 pg_control 文件中读取数据。PostgreSQL 在 ControlFileRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/ControlFileRead 的会话
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 = 'IO'
  AND wait_event = 'ControlFileRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'ControlFileRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.11 - IO: ControlFileSync

等待 pg_control 文件到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件ControlFileSync 版本PG 13-18 证据2 个源码位置

官方描述译文

等待 pg_control 文件到达持久化存储。

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

触发机制

WAIT_EVENT_CONTROL_FILE_SYNC 位于 src/backend/access/transam/xlog.c:4328,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:206。探针覆盖的操作是:等待 pg_control 文件到达持久化存储。PostgreSQL 在 ControlFileSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/ControlFileSync 的会话
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 = 'IO'
  AND wait_event = 'ControlFileSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'ControlFileSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.12 - IO: ControlFileSyncUpdate

等待 pg_control 文件的更新内容到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件ControlFileSyncUpdate 版本PG 13-18 证据2 个源码位置

官方描述译文

等待 pg_control 文件的更新内容到达持久化存储。

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

触发机制

WAIT_EVENT_CONTROL_FILE_SYNC_UPDATE 位于 src/common/controldata_utils.c:259,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:207。探针覆盖的操作是:等待 pg_control 文件的更新内容到达持久化存储。PostgreSQL 在 ControlFileSyncUpdate 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/ControlFileSyncUpdate 的会话
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 = 'IO'
  AND wait_event = 'ControlFileSyncUpdate'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'ControlFileSyncUpdate'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.13 - IO: ControlFileWrite

等待向 pg_control 文件写入数据。
PostgreSQL 等待事件档案
类别IO 事件ControlFileWrite 版本PG 13-18 证据2 个源码位置

官方描述译文

等待向 pg_control 文件写入数据。

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

触发机制

WAIT_EVENT_CONTROL_FILE_WRITE 位于 src/backend/access/transam/xlog.c:4315,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:208。探针覆盖的操作是:等待向 pg_control 文件写入数据。PostgreSQL 在 ControlFileWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/ControlFileWrite 的会话
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 = 'IO'
  AND wait_event = 'ControlFileWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'ControlFileWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.14 - IO: ControlFileWriteUpdate

等待通过写入来更新 pg_control 文件。
PostgreSQL 等待事件档案
类别IO 事件ControlFileWriteUpdate 版本PG 13-18 证据2 个源码位置

官方描述译文

等待通过写入来更新 pg_control 文件。

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

触发机制

WAIT_EVENT_CONTROL_FILE_WRITE_UPDATE 位于 src/common/controldata_utils.c:235,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:209。探针覆盖的操作是:等待通过写入来更新 pg_control 文件。PostgreSQL 在 ControlFileWriteUpdate 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/ControlFileWriteUpdate 的会话
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 = 'IO'
  AND wait_event = 'ControlFileWriteUpdate'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'ControlFileWriteUpdate'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.15 - IO: CopyFileCopy

等待文件复制操作完成。
PostgreSQL 等待事件档案
类别IO 事件CopyFileCopy 版本PG 18 证据2 个源码位置

官方描述译文

等待文件复制操作完成。

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

触发机制

WAIT_EVENT_COPY_FILE_COPY 位于 src/backend/storage/file/copydir.c:270,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:210。探针覆盖的操作是:等待文件复制操作完成。PostgreSQL 在 CopyFileCopy 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/CopyFileCopy 的会话
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 = 'IO'
  AND wait_event = 'CopyFileCopy'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'CopyFileCopy'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.16 - IO: CopyFileRead

等待在文件复制操作期间读取数据。
PostgreSQL 等待事件档案
类别IO 事件CopyFileRead 版本PG 13-18 证据2 个源码位置

官方描述译文

等待在文件复制操作期间读取数据。

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

触发机制

WAIT_EVENT_COPY_FILE_READ 位于 src/backend/storage/file/copydir.c:195,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:211。探针覆盖的操作是:等待在文件复制操作期间读取数据。PostgreSQL 在 CopyFileRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/CopyFileRead 的会话
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 = 'IO'
  AND wait_event = 'CopyFileRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'CopyFileRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.17 - IO: CopyFileWrite

等待在文件复制操作期间写入数据。
PostgreSQL 等待事件档案
类别IO 事件CopyFileWrite 版本PG 13-18 证据2 个源码位置

官方描述译文

等待在文件复制操作期间写入数据。

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

触发机制

WAIT_EVENT_COPY_FILE_WRITE 位于 src/backend/storage/file/copydir.c:205,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:212。探针覆盖的操作是:等待在文件复制操作期间写入数据。PostgreSQL 在 CopyFileWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/CopyFileWrite 的会话
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 = 'IO'
  AND wait_event = 'CopyFileWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'CopyFileWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.18 - IO: DataFileExtend

等待扩展 relation 数据文件。
PostgreSQL 等待事件档案
类别IO 事件DataFileExtend 版本PG 13-18 证据2 个源码位置

官方描述译文

等待扩展 relation 数据文件。

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

触发机制

WAIT_EVENT_DATA_FILE_EXTEND 位于 src/backend/storage/smgr/md.c:512,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:213。探针覆盖的操作是:等待扩展 relation 数据文件。PostgreSQL 在 DataFileExtend 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/DataFileExtend 的会话
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 = 'IO'
  AND wait_event = 'DataFileExtend'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'DataFileExtend'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.19 - IO: DataFileFlush

等待 relation 数据文件到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件DataFileFlush 版本PG 13-18 证据2 个源码位置

官方描述译文

等待 relation 数据文件到达持久化存储。

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

触发机制

WAIT_EVENT_DATA_FILE_FLUSH 位于 src/backend/storage/smgr/md.c:1208,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:214。探针覆盖的操作是:等待 relation 数据文件到达持久化存储。PostgreSQL 在 DataFileFlush 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/DataFileFlush 的会话
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 = 'IO'
  AND wait_event = 'DataFileFlush'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'DataFileFlush'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.20 - IO: DataFileImmediateSync

等待将 relation 数据文件立即同步到持久化存储。
PostgreSQL 等待事件档案
类别IO 事件DataFileImmediateSync 版本PG 13-18 证据2 个源码位置

官方描述译文

等待将 relation 数据文件立即同步到持久化存储。

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

触发机制

WAIT_EVENT_DATA_FILE_IMMEDIATE_SYNC 位于 src/backend/storage/smgr/md.c:1466,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:215。探针覆盖的操作是:等待将 relation 数据文件立即同步到持久化存储。PostgreSQL 在 DataFileImmediateSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/DataFileImmediateSync 的会话
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 = 'IO'
  AND wait_event = 'DataFileImmediateSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'DataFileImmediateSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.21 - IO: DataFilePrefetch

等待从 relation 数据文件异步预取数据。
PostgreSQL 等待事件档案
类别IO 事件DataFilePrefetch 版本PG 13-18 证据2 个源码位置

官方描述译文

等待从 relation 数据文件异步预取数据。

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

触发机制

WAIT_EVENT_DATA_FILE_PREFETCH 位于 src/backend/storage/smgr/md.c:767,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:216。探针覆盖的操作是:等待从 relation 数据文件异步预取数据。PostgreSQL 在 DataFilePrefetch 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/DataFilePrefetch 的会话
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 = 'IO'
  AND wait_event = 'DataFilePrefetch'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'DataFilePrefetch'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.22 - IO: DataFileRead

等待从 relation 数据文件中读取数据。
PostgreSQL 等待事件档案
类别IO 事件DataFileRead 版本PG 13-18 证据2 个源码位置

官方描述译文

等待从 relation 数据文件中读取数据。

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

触发机制

WAIT_EVENT_DATA_FILE_READ 位于 src/backend/storage/aio/aio_io.c:127,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:217。探针覆盖的操作是:等待从 relation 数据文件中读取数据。PostgreSQL 在 DataFileRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/DataFileRead 的会话
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 = 'IO'
  AND wait_event = 'DataFileRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'DataFileRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.23 - IO: DataFileSync

等待 relation 数据文件的变更到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件DataFileSync 版本PG 13-18 证据2 个源码位置

官方描述译文

等待 relation 数据文件的变更到达持久化存储。

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

触发机制

WAIT_EVENT_DATA_FILE_SYNC 位于 src/backend/storage/smgr/md.c:1526,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:218。探针覆盖的操作是:等待 relation 数据文件的变更到达持久化存储。PostgreSQL 在 DataFileSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/DataFileSync 的会话
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 = 'IO'
  AND wait_event = 'DataFileSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'DataFileSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.24 - IO: DataFileTruncate

等待截断 relation 数据文件。
PostgreSQL 等待事件档案
类别IO 事件DataFileTruncate 版本PG 13-18 证据2 个源码位置

官方描述译文

等待截断 relation 数据文件。

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

触发机制

WAIT_EVENT_DATA_FILE_TRUNCATE 位于 src/backend/storage/smgr/md.c:1329,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:219。探针覆盖的操作是:等待截断 relation 数据文件。PostgreSQL 在 DataFileTruncate 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/DataFileTruncate 的会话
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 = 'IO'
  AND wait_event = 'DataFileTruncate'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'DataFileTruncate'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.25 - IO: DataFileWrite

等待向 relation 数据文件写入数据。
PostgreSQL 等待事件档案
类别IO 事件DataFileWrite 版本PG 13-18 证据2 个源码位置

官方描述译文

等待向 relation 数据文件写入数据。

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

触发机制

WAIT_EVENT_DATA_FILE_WRITE 位于 src/backend/storage/aio/aio_io.c:134,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:220。探针覆盖的操作是:等待向 relation 数据文件写入数据。PostgreSQL 在 DataFileWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/DataFileWrite 的会话
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 = 'IO'
  AND wait_event = 'DataFileWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'DataFileWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.26 - IO: DsmAllocate

等待分配动态共享内存段。
PostgreSQL 等待事件档案
类别IO 事件DsmAllocate 版本PG 17-18 证据4 个源码位置

官方描述译文

等待分配动态共享内存段。

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

历史名称:IO/DSMAllocate (PG 16)

触发机制

WAIT_EVENT_DSM_ALLOCATE 位于 src/backend/storage/ipc/dsm_impl.c:366,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:604。探针覆盖的操作是:等待分配动态共享内存段。PostgreSQL 在 DsmAllocate 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/DsmAllocate 的会话
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 = 'IO'
  AND wait_event = 'DsmAllocate'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'DsmAllocate'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.27 - IO: DsmFillZeroWrite

等待用零值填充动态共享内存的后备文件。
PostgreSQL 等待事件档案
类别IO 事件DsmFillZeroWrite 版本PG 17-18 证据4 个源码位置

官方描述译文

等待用零值填充动态共享内存的后备文件。

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

历史名称:IO/DSMFillZeroWrite (PG 13-16)

触发机制

WAIT_EVENT_DSM_FILL_ZERO_WRITE 位于 src/backend/storage/ipc/dsm_impl.c:891,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:607。探针覆盖的操作是:等待用零值填充动态共享内存的后备文件。PostgreSQL 在 DsmFillZeroWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/DsmFillZeroWrite 的会话
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 = 'IO'
  AND wait_event = 'DsmFillZeroWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'DsmFillZeroWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.28 - IO: LockFileAddtodatadirRead

等待在向数据目录锁文件添加一行时读取数据。
PostgreSQL 等待事件档案
类别IO 事件LockFileAddtodatadirRead 版本PG 17-18 证据4 个源码位置

官方描述译文

等待在向数据目录锁文件添加一行时读取数据。

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

历史名称:IO/LockFileAddToDataDirRead (PG 13-16)

触发机制

WAIT_EVENT_LOCK_FILE_ADDTODATADIR_READ 位于 src/backend/utils/init/miscinit.c:1586,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:610。探针覆盖的操作是:等待在向数据目录锁文件添加一行时读取数据。PostgreSQL 在 LockFileAddtodatadirRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/LockFileAddtodatadirRead 的会话
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 = 'IO'
  AND wait_event = 'LockFileAddtodatadirRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'LockFileAddtodatadirRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.29 - IO: LockFileAddtodatadirSync

等待向数据目录锁文件添加一行时写入的数据到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件LockFileAddtodatadirSync 版本PG 17-18 证据4 个源码位置

官方描述译文

等待向数据目录锁文件添加一行时写入的数据到达持久化存储。

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

历史名称:IO/LockFileAddToDataDirSync (PG 13-16)

触发机制

WAIT_EVENT_LOCK_FILE_ADDTODATADIR_SYNC 位于 src/backend/utils/init/miscinit.c:1663,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:613。探针覆盖的操作是:等待向数据目录锁文件添加一行时写入的数据到达持久化存储。PostgreSQL 在 LockFileAddtodatadirSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/LockFileAddtodatadirSync 的会话
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 = 'IO'
  AND wait_event = 'LockFileAddtodatadirSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'LockFileAddtodatadirSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.30 - IO: LockFileAddtodatadirWrite

等待在向数据目录锁文件添加一行时写入数据。
PostgreSQL 等待事件档案
类别IO 事件LockFileAddtodatadirWrite 版本PG 17-18 证据4 个源码位置

官方描述译文

等待在向数据目录锁文件添加一行时写入数据。

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

历史名称:IO/LockFileAddToDataDirWrite (PG 13-16)

触发机制

WAIT_EVENT_LOCK_FILE_ADDTODATADIR_WRITE 位于 src/backend/utils/init/miscinit.c:1648,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:616。探针覆盖的操作是:等待在向数据目录锁文件添加一行时写入数据。PostgreSQL 在 LockFileAddtodatadirWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/LockFileAddtodatadirWrite 的会话
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 = 'IO'
  AND wait_event = 'LockFileAddtodatadirWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'LockFileAddtodatadirWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.31 - IO: LockFileCreateRead

等待在创建数据目录锁文件时读取数据。
PostgreSQL 等待事件档案
类别IO 事件LockFileCreateRead 版本PG 13-18 证据2 个源码位置

官方描述译文

等待在创建数据目录锁文件时读取数据。

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

触发机制

WAIT_EVENT_LOCK_FILE_CREATE_READ 位于 src/backend/utils/init/miscinit.c:1302,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:226。探针覆盖的操作是:等待在创建数据目录锁文件时读取数据。PostgreSQL 在 LockFileCreateRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/LockFileCreateRead 的会话
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 = 'IO'
  AND wait_event = 'LockFileCreateRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'LockFileCreateRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.32 - IO: LockFileCreateSync

等待创建数据目录锁文件时写入的数据到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件LockFileCreateSync 版本PG 13-18 证据2 个源码位置

官方描述译文

等待创建数据目录锁文件时写入的数据到达持久化存储。

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

触发机制

WAIT_EVENT_LOCK_FILE_CREATE_SYNC 位于 src/backend/utils/init/miscinit.c:1465,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:227。探针覆盖的操作是:等待创建数据目录锁文件时写入的数据到达持久化存储。PostgreSQL 在 LockFileCreateSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/LockFileCreateSync 的会话
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 = 'IO'
  AND wait_event = 'LockFileCreateSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'LockFileCreateSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.33 - IO: LockFileCreateWrite

等待在创建数据目录锁文件时写入数据。
PostgreSQL 等待事件档案
类别IO 事件LockFileCreateWrite 版本PG 13-18 证据2 个源码位置

官方描述译文

等待在创建数据目录锁文件时写入数据。

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

触发机制

WAIT_EVENT_LOCK_FILE_CREATE_WRITE 位于 src/backend/utils/init/miscinit.c:1450,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:228。探针覆盖的操作是:等待在创建数据目录锁文件时写入数据。PostgreSQL 在 LockFileCreateWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/LockFileCreateWrite 的会话
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 = 'IO'
  AND wait_event = 'LockFileCreateWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'LockFileCreateWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.34 - IO: LockFileRecheckdatadirRead

等待在重新检查数据目录锁文件时读取数据。
PostgreSQL 等待事件档案
类别IO 事件LockFileRecheckdatadirRead 版本PG 17-18 证据4 个源码位置

官方描述译文

等待在重新检查数据目录锁文件时读取数据。

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

历史名称:IO/LockFileReCheckDataDirRead (PG 13-16)

触发机制

WAIT_EVENT_LOCK_FILE_RECHECKDATADIR_READ 位于 src/backend/utils/init/miscinit.c:1728,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:628。探针覆盖的操作是:等待在重新检查数据目录锁文件时读取数据。PostgreSQL 在 LockFileRecheckdatadirRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/LockFileRecheckdatadirRead 的会话
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 = 'IO'
  AND wait_event = 'LockFileRecheckdatadirRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'LockFileRecheckdatadirRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.35 - IO: LogicalChangesRead

等待从逻辑变更文件中读取数据。
PostgreSQL 等待事件档案
类别IO 事件LogicalChangesRead 版本PG 14 证据1 个源码位置

官方描述译文

等待从逻辑变更文件中读取数据。

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

触发机制

目录中仍保留该身份,但源码审计确认在 14 已没有活动报告点。已知曾可触发范围:none。下方定义位置作为负面证据保留;当前精确版本不会从核心代码路径发出此事件。 证据:pgsql-hackers confirmation

正常还是麻烦?

  • 正常: 在已审计的精确版本上,不应出现活动的核心触发。
  • 需要调查: 若监控仍显示它,应核对精确小版本、扩展来源,并确认样本是否陈旧或来自另一台服务器。

诊断 SQL

正在等待 IO/LogicalChangesRead 的会话
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 = 'IO'
  AND wait_event = 'LogicalChangesRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'LogicalChangesRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.36 - IO: LogicalChangesWrite

等待向逻辑变更文件写入数据。
PostgreSQL 等待事件档案
类别IO 事件LogicalChangesWrite 版本PG 14 证据1 个源码位置

官方描述译文

等待向逻辑变更文件写入数据。

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

触发机制

目录中仍保留该身份,但源码审计确认在 14 已没有活动报告点。已知曾可触发范围:none。下方定义位置作为负面证据保留;当前精确版本不会从核心代码路径发出此事件。 证据:pgsql-hackers confirmation

正常还是麻烦?

  • 正常: 在已审计的精确版本上,不应出现活动的核心触发。
  • 需要调查: 若监控仍显示它,应核对精确小版本、扩展来源,并确认样本是否陈旧或来自另一台服务器。

诊断 SQL

正在等待 IO/LogicalChangesWrite 的会话
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 = 'IO'
  AND wait_event = 'LogicalChangesWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'LogicalChangesWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.37 - IO: LogicalRewriteCheckpointSync

等待检查点期间的逻辑重写映射到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件LogicalRewriteCheckpointSync 版本PG 13-18 证据2 个源码位置

官方描述译文

等待检查点期间的逻辑重写映射到达持久化存储。

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

触发机制

WAIT_EVENT_LOGICAL_REWRITE_CHECKPOINT_SYNC 位于 src/backend/access/heap/rewriteheap.c:1236,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:230。探针覆盖的操作是:等待检查点期间的逻辑重写映射到达持久化存储。PostgreSQL 在 LogicalRewriteCheckpointSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/LogicalRewriteCheckpointSync 的会话
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 = 'IO'
  AND wait_event = 'LogicalRewriteCheckpointSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'LogicalRewriteCheckpointSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.38 - IO: LogicalRewriteMappingSync

等待逻辑重写期间的映射数据到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件LogicalRewriteMappingSync 版本PG 13-18 证据2 个源码位置

官方描述译文

等待逻辑重写期间的映射数据到达持久化存储。

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

触发机制

WAIT_EVENT_LOGICAL_REWRITE_MAPPING_SYNC 位于 src/backend/access/heap/rewriteheap.c:1131,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:231。探针覆盖的操作是:等待逻辑重写期间的映射数据到达持久化存储。PostgreSQL 在 LogicalRewriteMappingSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/LogicalRewriteMappingSync 的会话
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 = 'IO'
  AND wait_event = 'LogicalRewriteMappingSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'LogicalRewriteMappingSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.39 - IO: LogicalRewriteMappingWrite

等待在逻辑重写期间写入映射数据。
PostgreSQL 等待事件档案
类别IO 事件LogicalRewriteMappingWrite 版本PG 13-18 证据2 个源码位置

官方描述译文

等待在逻辑重写期间写入映射数据。

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

触发机制

WAIT_EVENT_LOGICAL_REWRITE_MAPPING_WRITE 位于 src/backend/access/heap/rewriteheap.c:1114,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:232。探针覆盖的操作是:等待在逻辑重写期间写入映射数据。PostgreSQL 在 LogicalRewriteMappingWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/LogicalRewriteMappingWrite 的会话
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 = 'IO'
  AND wait_event = 'LogicalRewriteMappingWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'LogicalRewriteMappingWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.40 - IO: LogicalRewriteSync

等待逻辑重写映射到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件LogicalRewriteSync 版本PG 13-18 证据2 个源码位置

官方描述译文

等待逻辑重写映射到达持久化存储。

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

触发机制

WAIT_EVENT_LOGICAL_REWRITE_SYNC 位于 src/backend/access/heap/rewriteheap.c:922,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:233。探针覆盖的操作是:等待逻辑重写映射到达持久化存储。PostgreSQL 在 LogicalRewriteSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/LogicalRewriteSync 的会话
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 = 'IO'
  AND wait_event = 'LogicalRewriteSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'LogicalRewriteSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.41 - IO: LogicalRewriteTruncate

等待在逻辑重写期间截断映射数据。
PostgreSQL 等待事件档案
类别IO 事件LogicalRewriteTruncate 版本PG 13-18 证据2 个源码位置

官方描述译文

等待在逻辑重写期间截断映射数据。

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

触发机制

WAIT_EVENT_LOGICAL_REWRITE_TRUNCATE 位于 src/backend/access/heap/rewriteheap.c:1100,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:234。探针覆盖的操作是:等待在逻辑重写期间截断映射数据。PostgreSQL 在 LogicalRewriteTruncate 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/LogicalRewriteTruncate 的会话
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 = 'IO'
  AND wait_event = 'LogicalRewriteTruncate'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'LogicalRewriteTruncate'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.42 - IO: LogicalRewriteWrite

等待写入逻辑重写映射。
PostgreSQL 等待事件档案
类别IO 事件LogicalRewriteWrite 版本PG 13-18 证据2 个源码位置

官方描述译文

等待写入逻辑重写映射。

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

触发机制

WAIT_EVENT_LOGICAL_REWRITE_WRITE 位于 src/backend/access/heap/rewriteheap.c:881,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:235。探针覆盖的操作是:等待写入逻辑重写映射。PostgreSQL 在 LogicalRewriteWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/LogicalRewriteWrite 的会话
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 = 'IO'
  AND wait_event = 'LogicalRewriteWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'LogicalRewriteWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.43 - IO: LogicalSubxactRead

等待从逻辑子事务文件中读取数据。
PostgreSQL 等待事件档案
类别IO 事件LogicalSubxactRead 版本PG 14 证据1 个源码位置

官方描述译文

等待从逻辑子事务文件中读取数据。

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

触发机制

目录中仍保留该身份,但源码审计确认在 14 已没有活动报告点。已知曾可触发范围:none。下方定义位置作为负面证据保留;当前精确版本不会从核心代码路径发出此事件。 证据:pgsql-hackers confirmation

正常还是麻烦?

  • 正常: 在已审计的精确版本上,不应出现活动的核心触发。
  • 需要调查: 若监控仍显示它,应核对精确小版本、扩展来源,并确认样本是否陈旧或来自另一台服务器。

诊断 SQL

正在等待 IO/LogicalSubxactRead 的会话
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 = 'IO'
  AND wait_event = 'LogicalSubxactRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'LogicalSubxactRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.44 - IO: LogicalSubxactWrite

等待向逻辑子事务文件写入数据。
PostgreSQL 等待事件档案
类别IO 事件LogicalSubxactWrite 版本PG 14 证据1 个源码位置

官方描述译文

等待向逻辑子事务文件写入数据。

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

触发机制

目录中仍保留该身份,但源码审计确认在 14 已没有活动报告点。已知曾可触发范围:none。下方定义位置作为负面证据保留;当前精确版本不会从核心代码路径发出此事件。 证据:pgsql-hackers confirmation

正常还是麻烦?

  • 正常: 在已审计的精确版本上,不应出现活动的核心触发。
  • 需要调查: 若监控仍显示它,应核对精确小版本、扩展来源,并确认样本是否陈旧或来自另一台服务器。

诊断 SQL

正在等待 IO/LogicalSubxactWrite 的会话
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 = 'IO'
  AND wait_event = 'LogicalSubxactWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'LogicalSubxactWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.45 - IO: RelationMapRead

等待读取 relation map 文件。
PostgreSQL 等待事件档案
类别IO 事件RelationMapRead 版本PG 13-18 证据2 个源码位置

官方描述译文

等待读取 relation map 文件。

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

触发机制

WAIT_EVENT_RELATION_MAP_READ 位于 src/backend/utils/cache/relmapper.c:822,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:236。探针覆盖的操作是:等待读取 relation map 文件。PostgreSQL 在 RelationMapRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/RelationMapRead 的会话
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 = 'IO'
  AND wait_event = 'RelationMapRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'RelationMapRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.46 - IO: RelationMapReplace

等待以持久化方式替换 relation map 文件。
PostgreSQL 等待事件档案
类别IO 事件RelationMapReplace 版本PG 16-18 证据2 个源码位置

官方描述译文

等待以持久化方式替换 relation map 文件。

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

触发机制

WAIT_EVENT_RELATION_MAP_REPLACE 位于 src/backend/utils/cache/relmapper.c:988,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:237。探针覆盖的操作是:等待以持久化方式替换 relation map 文件。PostgreSQL 在 RelationMapReplace 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/RelationMapReplace 的会话
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 = 'IO'
  AND wait_event = 'RelationMapReplace'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'RelationMapReplace'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.47 - IO: RelationMapSync

等待 relation map 文件到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件RelationMapSync 版本PG 13-15 证据2 个源码位置

官方描述译文

等待 relation map 文件到达持久化存储。

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

触发机制

WAIT_EVENT_RELATION_MAP_SYNC 位于 src/backend/utils/cache/relmapper.c:957,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:637。探针覆盖的操作是:等待 relation map 文件到达持久化存储。PostgreSQL 在 RelationMapSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/RelationMapSync 的会话
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 = 'IO'
  AND wait_event = 'RelationMapSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'RelationMapSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.48 - IO: RelationMapWrite

等待向 relation map 文件写入数据。
PostgreSQL 等待事件档案
类别IO 事件RelationMapWrite 版本PG 13-18 证据2 个源码位置

官方描述译文

等待向 relation map 文件写入数据。

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

触发机制

WAIT_EVENT_RELATION_MAP_WRITE 位于 src/backend/utils/cache/relmapper.c:939,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:238。探针覆盖的操作是:等待向 relation map 文件写入数据。PostgreSQL 在 RelationMapWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/RelationMapWrite 的会话
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 = 'IO'
  AND wait_event = 'RelationMapWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'RelationMapWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.49 - IO: ReorderBufferRead

等待在 reorder buffer 管理期间读取数据。
PostgreSQL 等待事件档案
类别IO 事件ReorderBufferRead 版本PG 13-18 证据2 个源码位置

官方描述译文

等待在 reorder buffer 管理期间读取数据。

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

触发机制

WAIT_EVENT_REORDER_BUFFER_READ 位于 src/backend/replication/logical/reorderbuffer.c:4609,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:239。探针覆盖的操作是:等待在 reorder buffer 管理期间读取数据。PostgreSQL 在 ReorderBufferRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/ReorderBufferRead 的会话
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 = 'IO'
  AND wait_event = 'ReorderBufferRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'ReorderBufferRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.50 - IO: ReorderBufferWrite

等待在 reorder buffer 管理期间写入数据。
PostgreSQL 等待事件档案
类别IO 事件ReorderBufferWrite 版本PG 13-18 证据2 个源码位置

官方描述译文

等待在 reorder buffer 管理期间写入数据。

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

触发机制

WAIT_EVENT_REORDER_BUFFER_WRITE 位于 src/backend/replication/logical/reorderbuffer.c:4265,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:240。探针覆盖的操作是:等待在 reorder buffer 管理期间写入数据。PostgreSQL 在 ReorderBufferWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/ReorderBufferWrite 的会话
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 = 'IO'
  AND wait_event = 'ReorderBufferWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'ReorderBufferWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.51 - IO: ReorderLogicalMappingRead

等待在 reorder buffer 管理期间读取逻辑映射。
PostgreSQL 等待事件档案
类别IO 事件ReorderLogicalMappingRead 版本PG 13-18 证据2 个源码位置

官方描述译文

等待在 reorder buffer 管理期间读取逻辑映射。

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

触发机制

WAIT_EVENT_REORDER_LOGICAL_MAPPING_READ 位于 src/backend/replication/logical/reorderbuffer.c:5383,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:241。探针覆盖的操作是:等待在 reorder buffer 管理期间读取逻辑映射。PostgreSQL 在 ReorderLogicalMappingRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/ReorderLogicalMappingRead 的会话
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 = 'IO'
  AND wait_event = 'ReorderLogicalMappingRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'ReorderLogicalMappingRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.52 - IO: ReplicationSlotRead

等待从复制槽控制文件中读取数据。
PostgreSQL 等待事件档案
类别IO 事件ReplicationSlotRead 版本PG 13-18 证据2 个源码位置

官方描述译文

等待从复制槽控制文件中读取数据。

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

触发机制

WAIT_EVENT_REPLICATION_SLOT_READ 位于 src/backend/replication/slot.c:2540,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:242。探针覆盖的操作是:等待从复制槽控制文件中读取数据。PostgreSQL 在 ReplicationSlotRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/ReplicationSlotRead 的会话
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 = 'IO'
  AND wait_event = 'ReplicationSlotRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'ReplicationSlotRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.53 - IO: ReplicationSlotRestoreSync

等待在将复制槽恢复到内存的过程中,使其控制文件到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件ReplicationSlotRestoreSync 版本PG 13-18 证据2 个源码位置

官方描述译文

等待在将复制槽恢复到内存的过程中,使其控制文件到达持久化存储。

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

触发机制

WAIT_EVENT_REPLICATION_SLOT_RESTORE_SYNC 位于 src/backend/replication/slot.c:2526,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:243。探针覆盖的操作是:等待在将复制槽恢复到内存的过程中,使其控制文件到达持久化存储。PostgreSQL 在 ReplicationSlotRestoreSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/ReplicationSlotRestoreSync 的会话
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 = 'IO'
  AND wait_event = 'ReplicationSlotRestoreSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'ReplicationSlotRestoreSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.54 - IO: ReplicationSlotSync

等待复制槽控制文件到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件ReplicationSlotSync 版本PG 13-18 证据2 个源码位置

官方描述译文

等待复制槽控制文件到达持久化存储。

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

触发机制

WAIT_EVENT_REPLICATION_SLOT_SYNC 位于 src/backend/replication/slot.c:2405,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:244。探针覆盖的操作是:等待复制槽控制文件到达持久化存储。PostgreSQL 在 ReplicationSlotSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/ReplicationSlotSync 的会话
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 = 'IO'
  AND wait_event = 'ReplicationSlotSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'ReplicationSlotSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.55 - IO: ReplicationSlotWrite

等待向复制槽控制文件写入数据。
PostgreSQL 等待事件档案
类别IO 事件ReplicationSlotWrite 版本PG 13-18 证据2 个源码位置

官方描述译文

等待向复制槽控制文件写入数据。

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

触发机制

WAIT_EVENT_REPLICATION_SLOT_WRITE 位于 src/backend/replication/slot.c:2384,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:245。探针覆盖的操作是:等待向复制槽控制文件写入数据。PostgreSQL 在 ReplicationSlotWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/ReplicationSlotWrite 的会话
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 = 'IO'
  AND wait_event = 'ReplicationSlotWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'ReplicationSlotWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.56 - IO: SlruFlushSync

等待检查点或数据库关闭期间的 SLRU 数据到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件SlruFlushSync 版本PG 17-18 证据4 个源码位置

官方描述译文

等待检查点或数据库关闭期间的 SLRU 数据到达持久化存储。

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

历史名称:IO/SLRUFlushSync (PG 13-16)

触发机制

WAIT_EVENT_SLRU_FLUSH_SYNC 位于 src/backend/access/transam/slru.c:1606,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:679。探针覆盖的操作是:等待检查点或数据库关闭期间的 SLRU 数据到达持久化存储。PostgreSQL 在 SlruFlushSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/SlruFlushSync 的会话
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 = 'IO'
  AND wait_event = 'SlruFlushSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'SlruFlushSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.57 - IO: SlruRead

等待读取 SLRU 页面。
PostgreSQL 等待事件档案
类别IO 事件SlruRead 版本PG 17-18 证据4 个源码位置

官方描述译文

等待读取 SLRU 页面。

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

历史名称:IO/SLRURead (PG 13-16)

触发机制

WAIT_EVENT_SLRU_READ 位于 src/backend/access/transam/slru.c:721,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:682。探针覆盖的操作是:等待读取 SLRU 页面。PostgreSQL 在 SlruRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/SlruRead 的会话
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 = 'IO'
  AND wait_event = 'SlruRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'SlruRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.58 - IO: SlruSync

等待页面写入后的 SLRU 数据到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件SlruSync 版本PG 17-18 证据4 个源码位置

官方描述译文

等待页面写入后的 SLRU 数据到达持久化存储。

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

历史名称:IO/SLRUSync (PG 13-16)

触发机制

WAIT_EVENT_SLRU_SYNC 位于 src/backend/access/transam/slru.c:900,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:685。探针覆盖的操作是:等待页面写入后的 SLRU 数据到达持久化存储。PostgreSQL 在 SlruSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/SlruSync 的会话
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 = 'IO'
  AND wait_event = 'SlruSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'SlruSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.59 - IO: SlruWrite

等待写入 SLRU 页面。
PostgreSQL 等待事件档案
类别IO 事件SlruWrite 版本PG 17-18 证据4 个源码位置

官方描述译文

等待写入 SLRU 页面。

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

历史名称:IO/SLRUWrite (PG 13-16)

触发机制

WAIT_EVENT_SLRU_WRITE 位于 src/backend/access/transam/slru.c:876,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:688。探针覆盖的操作是:等待写入 SLRU 页面。PostgreSQL 在 SlruWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/SlruWrite 的会话
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 = 'IO'
  AND wait_event = 'SlruWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'SlruWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.60 - IO: SnapbuildRead

等待读取序列化的历史系统目录 snapshot。
PostgreSQL 等待事件档案
类别IO 事件SnapbuildRead 版本PG 13-18 证据2 个源码位置

官方描述译文

等待读取序列化的历史系统目录 snapshot。

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

触发机制

WAIT_EVENT_SNAPBUILD_READ 位于 src/backend/replication/logical/snapbuild.c:1937,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:250。探针覆盖的操作是:等待读取序列化的历史系统目录 snapshot。PostgreSQL 在 SnapbuildRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/SnapbuildRead 的会话
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 = 'IO'
  AND wait_event = 'SnapbuildRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'SnapbuildRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.61 - IO: SnapbuildSync

等待序列化的历史系统目录 snapshot 到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件SnapbuildSync 版本PG 13-18 证据2 个源码位置

官方描述译文

等待序列化的历史系统目录 snapshot 到达持久化存储。

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

触发机制

WAIT_EVENT_SNAPBUILD_SYNC 位于 src/backend/replication/logical/snapbuild.c:1680,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:251。探针覆盖的操作是:等待序列化的历史系统目录 snapshot 到达持久化存储。PostgreSQL 在 SnapbuildSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/SnapbuildSync 的会话
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 = 'IO'
  AND wait_event = 'SnapbuildSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'SnapbuildSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.62 - IO: SnapbuildWrite

等待写入序列化的历史系统目录 snapshot。
PostgreSQL 等待事件档案
类别IO 事件SnapbuildWrite 版本PG 13-18 证据2 个源码位置

官方描述译文

等待写入序列化的历史系统目录 snapshot。

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

触发机制

WAIT_EVENT_SNAPBUILD_WRITE 位于 src/backend/replication/logical/snapbuild.c:1654,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:252。探针覆盖的操作是:等待写入序列化的历史系统目录 snapshot。PostgreSQL 在 SnapbuildWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/SnapbuildWrite 的会话
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 = 'IO'
  AND wait_event = 'SnapbuildWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'SnapbuildWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.63 - IO: TimelineHistoryFileSync

等待通过流复制接收的时间线历史文件到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件TimelineHistoryFileSync 版本PG 13-18 证据2 个源码位置

官方描述译文

等待通过流复制接收的时间线历史文件到达持久化存储。

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

触发机制

WAIT_EVENT_TIMELINE_HISTORY_FILE_SYNC 位于 src/backend/access/transam/timeline.c:502,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:253。探针覆盖的操作是:等待通过流复制接收的时间线历史文件到达持久化存储。PostgreSQL 在 TimelineHistoryFileSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/TimelineHistoryFileSync 的会话
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 = 'IO'
  AND wait_event = 'TimelineHistoryFileSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'TimelineHistoryFileSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.64 - IO: TimelineHistoryFileWrite

等待写入通过流复制接收的时间线历史文件。
PostgreSQL 等待事件档案
类别IO 事件TimelineHistoryFileWrite 版本PG 13-18 证据2 个源码位置

官方描述译文

等待写入通过流复制接收的时间线历史文件。

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

触发机制

WAIT_EVENT_TIMELINE_HISTORY_FILE_WRITE 位于 src/backend/access/transam/timeline.c:484,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:254。探针覆盖的操作是:等待写入通过流复制接收的时间线历史文件。PostgreSQL 在 TimelineHistoryFileWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/TimelineHistoryFileWrite 的会话
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 = 'IO'
  AND wait_event = 'TimelineHistoryFileWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'TimelineHistoryFileWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.65 - IO: TimelineHistoryRead

等待读取时间线历史文件。
PostgreSQL 等待事件档案
类别IO 事件TimelineHistoryRead 版本PG 13-18 证据2 个源码位置

官方描述译文

等待读取时间线历史文件。

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

触发机制

WAIT_EVENT_TIMELINE_HISTORY_READ 位于 src/backend/access/transam/timeline.c:135,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:255。探针覆盖的操作是:等待读取时间线历史文件。PostgreSQL 在 TimelineHistoryRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/TimelineHistoryRead 的会话
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 = 'IO'
  AND wait_event = 'TimelineHistoryRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'TimelineHistoryRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.66 - IO: TimelineHistorySync

等待新建的时间线历史文件到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件TimelineHistorySync 版本PG 13-18 证据2 个源码位置

官方描述译文

等待新建的时间线历史文件到达持久化存储。

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

触发机制

WAIT_EVENT_TIMELINE_HISTORY_SYNC 位于 src/backend/access/transam/timeline.c:428,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:256。探针覆盖的操作是:等待新建的时间线历史文件到达持久化存储。PostgreSQL 在 TimelineHistorySync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/TimelineHistorySync 的会话
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 = 'IO'
  AND wait_event = 'TimelineHistorySync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'TimelineHistorySync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.67 - IO: TimelineHistoryWrite

等待写入新建的时间线历史文件。
PostgreSQL 等待事件档案
类别IO 事件TimelineHistoryWrite 版本PG 13-18 证据2 个源码位置

官方描述译文

等待写入新建的时间线历史文件。

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

触发机制

WAIT_EVENT_TIMELINE_HISTORY_WRITE 位于 src/backend/access/transam/timeline.c:366,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:257。探针覆盖的操作是:等待写入新建的时间线历史文件。PostgreSQL 在 TimelineHistoryWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/TimelineHistoryWrite 的会话
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 = 'IO'
  AND wait_event = 'TimelineHistoryWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'TimelineHistoryWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.68 - IO: TwophaseFileRead

等待读取两阶段状态文件。
PostgreSQL 等待事件档案
类别IO 事件TwophaseFileRead 版本PG 13-18 证据2 个源码位置

官方描述译文

等待读取两阶段状态文件。

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

触发机制

WAIT_EVENT_TWOPHASE_FILE_READ 位于 src/backend/access/transam/twophase.c:1347,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:258。探针覆盖的操作是:等待读取两阶段状态文件。PostgreSQL 在 TwophaseFileRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/TwophaseFileRead 的会话
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 = 'IO'
  AND wait_event = 'TwophaseFileRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'TwophaseFileRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.69 - IO: TwophaseFileSync

等待两阶段状态文件到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件TwophaseFileSync 版本PG 13-18 证据2 个源码位置

官方描述译文

等待两阶段状态文件到达持久化存储。

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

触发机制

WAIT_EVENT_TWOPHASE_FILE_SYNC 位于 src/backend/access/transam/twophase.c:1774,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:259。探针覆盖的操作是:等待两阶段状态文件到达持久化存储。PostgreSQL 在 TwophaseFileSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/TwophaseFileSync 的会话
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 = 'IO'
  AND wait_event = 'TwophaseFileSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'TwophaseFileSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.70 - IO: TwophaseFileWrite

等待写入两阶段状态文件。
PostgreSQL 等待事件档案
类别IO 事件TwophaseFileWrite 版本PG 13-18 证据2 个源码位置

官方描述译文

等待写入两阶段状态文件。

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

触发机制

WAIT_EVENT_TWOPHASE_FILE_WRITE 位于 src/backend/access/transam/twophase.c:1749,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:260。探针覆盖的操作是:等待写入两阶段状态文件。PostgreSQL 在 TwophaseFileWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/TwophaseFileWrite 的会话
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 = 'IO'
  AND wait_event = 'TwophaseFileWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'TwophaseFileWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.71 - IO: VersionFileSync

等待创建数据库时的版本文件到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件VersionFileSync 版本PG 15-18 证据2 个源码位置

官方描述译文

等待创建数据库时的版本文件到达持久化存储。

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

触发机制

WAIT_EVENT_VERSION_FILE_SYNC 位于 src/backend/commands/dbcommands.c:511,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:261。探针覆盖的操作是:等待创建数据库时的版本文件到达持久化存储。PostgreSQL 在 VersionFileSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/VersionFileSync 的会话
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 = 'IO'
  AND wait_event = 'VersionFileSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'VersionFileSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.72 - IO: VersionFileWrite

等待在创建数据库时写入版本文件。
PostgreSQL 等待事件档案
类别IO 事件VersionFileWrite 版本PG 15-18 证据2 个源码位置

官方描述译文

等待在创建数据库时写入版本文件。

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

触发机制

WAIT_EVENT_VERSION_FILE_WRITE 位于 src/backend/commands/dbcommands.c:498,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:262。探针覆盖的操作是:等待在创建数据库时写入版本文件。PostgreSQL 在 VersionFileWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/VersionFileWrite 的会话
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 = 'IO'
  AND wait_event = 'VersionFileWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'VersionFileWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.73 - IO: WalBootstrapSync

等待引导初始化期间的 WAL 到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件WalBootstrapSync 版本PG 17-18 证据4 个源码位置

官方描述译文

等待引导初始化期间的 WAL 到达持久化存储。

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

历史名称:IO/WALBootstrapSync (PG 13-16)

触发机制

WAIT_EVENT_WAL_BOOTSTRAP_SYNC 位于 src/backend/access/transam/xlog.c:4776,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:733。探针覆盖的操作是:等待引导初始化期间的 WAL 到达持久化存储。PostgreSQL 在 WalBootstrapSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/WalBootstrapSync 的会话
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 = 'IO'
  AND wait_event = 'WalBootstrapSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'WalBootstrapSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.74 - IO: WalBootstrapWrite

等待在引导初始化期间写入 WAL 页面。
PostgreSQL 等待事件档案
类别IO 事件WalBootstrapWrite 版本PG 17-18 证据4 个源码位置

官方描述译文

等待在引导初始化期间写入 WAL 页面。

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

历史名称:IO/WALBootstrapWrite (PG 13-16)

触发机制

WAIT_EVENT_WAL_BOOTSTRAP_WRITE 位于 src/backend/access/transam/xlog.c:4764,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:736。探针覆盖的操作是:等待在引导初始化期间写入 WAL 页面。PostgreSQL 在 WalBootstrapWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/WalBootstrapWrite 的会话
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 = 'IO'
  AND wait_event = 'WalBootstrapWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'WalBootstrapWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.75 - IO: WalCopyRead

等待通过复制现有 WAL segment 创建新 WAL segment 时读取数据。
PostgreSQL 等待事件档案
类别IO 事件WalCopyRead 版本PG 17-18 证据4 个源码位置

官方描述译文

等待通过复制现有 WAL segment 创建新 WAL segment 时读取数据。

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

历史名称:IO/WALCopyRead (PG 13-16)

触发机制

WAIT_EVENT_WAL_COPY_READ 位于 src/backend/access/transam/xlog.c:3190,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:739。探针覆盖的操作是:等待通过复制现有 WAL segment 创建新 WAL segment 时读取数据。PostgreSQL 在 WalCopyRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/WalCopyRead 的会话
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 = 'IO'
  AND wait_event = 'WalCopyRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'WalCopyRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.76 - IO: WalCopySync

等待通过复制现有 WAL segment 创建的新 WAL segment 到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件WalCopySync 版本PG 17-18 证据4 个源码位置

官方描述译文

等待通过复制现有 WAL segment 创建的新 WAL segment 到达持久化存储。

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

历史名称:IO/WALCopySync (PG 13-16)

触发机制

WAIT_EVENT_WAL_COPY_SYNC 位于 src/backend/access/transam/xlog.c:3227,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:742。探针覆盖的操作是:等待通过复制现有 WAL segment 创建的新 WAL segment 到达持久化存储。PostgreSQL 在 WalCopySync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/WalCopySync 的会话
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 = 'IO'
  AND wait_event = 'WalCopySync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'WalCopySync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.77 - IO: WalCopyWrite

等待通过复制现有 WAL segment 创建新 WAL segment 时写入数据。
PostgreSQL 等待事件档案
类别IO 事件WalCopyWrite 版本PG 17-18 证据4 个源码位置

官方描述译文

等待通过复制现有 WAL segment 创建新 WAL segment 时写入数据。

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

历史名称:IO/WALCopyWrite (PG 13-16)

触发机制

WAIT_EVENT_WAL_COPY_WRITE 位于 src/backend/access/transam/xlog.c:3208,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:745。探针覆盖的操作是:等待通过复制现有 WAL segment 创建新 WAL segment 时写入数据。PostgreSQL 在 WalCopyWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/WalCopyWrite 的会话
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 = 'IO'
  AND wait_event = 'WalCopyWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'WalCopyWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.78 - IO: WalInitSync

等待新初始化的 WAL 文件到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件WalInitSync 版本PG 17-18 证据4 个源码位置

官方描述译文

等待新初始化的 WAL 文件到达持久化存储。

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

历史名称:IO/WALInitSync (PG 13-16)

触发机制

WAIT_EVENT_WAL_INIT_SYNC 位于 src/backend/access/transam/xlog.c:3028,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:748。探针覆盖的操作是:等待新初始化的 WAL 文件到达持久化存储。PostgreSQL 在 WalInitSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/WalInitSync 的会话
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 = 'IO'
  AND wait_event = 'WalInitSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'WalInitSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.79 - IO: WalInitWrite

等待在初始化新 WAL 文件时写入数据。
PostgreSQL 等待事件档案
类别IO 事件WalInitWrite 版本PG 17-18 证据4 个源码位置

官方描述译文

等待在初始化新 WAL 文件时写入数据。

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

历史名称:IO/WALInitWrite (PG 13-16)

触发机制

WAIT_EVENT_WAL_INIT_WRITE 位于 src/backend/access/transam/xlog.c:2977,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:751。探针覆盖的操作是:等待在初始化新 WAL 文件时写入数据。PostgreSQL 在 WalInitWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/WalInitWrite 的会话
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 = 'IO'
  AND wait_event = 'WalInitWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'WalInitWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.80 - IO: WalRead

等待从 WAL 文件中读取数据。
PostgreSQL 等待事件档案
类别IO 事件WalRead 版本PG 17-18 证据4 个源码位置

官方描述译文

等待从 WAL 文件中读取数据。

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

历史名称:IO/WALRead (PG 13-16)

触发机制

WAIT_EVENT_WAL_READ 位于 src/backend/access/transam/xlogreader.c:1570,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:754。探针覆盖的操作是:等待从 WAL 文件中读取数据。PostgreSQL 在 WalRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/WalRead 的会话
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 = 'IO'
  AND wait_event = 'WalRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'WalRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.81 - IO: WalSummaryRead

等待从 WAL summary 文件中读取数据。
PostgreSQL 等待事件档案
类别IO 事件WalSummaryRead 版本PG 17-18 证据2 个源码位置

官方描述译文

等待从 WAL summary 文件中读取数据。

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

触发机制

WAIT_EVENT_WAL_SUMMARY_READ 位于 src/backend/backup/walsummary.c:279,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:272。探针覆盖的操作是:等待从 WAL summary 文件中读取数据。PostgreSQL 在 WalSummaryRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/WalSummaryRead 的会话
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 = 'IO'
  AND wait_event = 'WalSummaryRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'WalSummaryRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.82 - IO: WalSummaryWrite

等待向 WAL summary 文件写入数据。
PostgreSQL 等待事件档案
类别IO 事件WalSummaryWrite 版本PG 17-18 证据2 个源码位置

官方描述译文

等待向 WAL summary 文件写入数据。

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

触发机制

WAIT_EVENT_WAL_SUMMARY_WRITE 位于 src/backend/backup/walsummary.c:300,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:273。探针覆盖的操作是:等待向 WAL summary 文件写入数据。PostgreSQL 在 WalSummaryWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/WalSummaryWrite 的会话
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 = 'IO'
  AND wait_event = 'WalSummaryWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'WalSummaryWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.83 - IO: WalSync

等待 WAL 文件到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件WalSync 版本PG 17-18 证据4 个源码位置

官方描述译文

等待 WAL 文件到达持久化存储。

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

历史名称:IO/WALSync (PG 13-16)

触发机制

WAIT_EVENT_WAL_SYNC 位于 src/backend/access/transam/xlog.c:8303,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:757。探针覆盖的操作是:等待 WAL 文件到达持久化存储。PostgreSQL 在 WalSync 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/WalSync 的会话
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 = 'IO'
  AND wait_event = 'WalSync'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'WalSync'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.84 - IO: WalSyncMethodAssign

等待分配新的 WAL 同步方法时写入的数据到达持久化存储。
PostgreSQL 等待事件档案
类别IO 事件WalSyncMethodAssign 版本PG 17-18 证据4 个源码位置

官方描述译文

等待分配新的 WAL 同步方法时写入的数据到达持久化存储。

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

历史名称:IO/WALSyncMethodAssign (PG 13-16)

触发机制

WAIT_EVENT_WAL_SYNC_METHOD_ASSIGN 位于 src/backend/access/transam/xlog.c:8251,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:760。探针覆盖的操作是:等待分配新的 WAL 同步方法时写入的数据到达持久化存储。PostgreSQL 在 WalSyncMethodAssign 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/WalSyncMethodAssign 的会话
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 = 'IO'
  AND wait_event = 'WalSyncMethodAssign'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'WalSyncMethodAssign'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.85 - IO: WalWrite

等待向 WAL 文件写入数据。
PostgreSQL 等待事件档案
类别IO 事件WalWrite 版本PG 17-18 证据4 个源码位置

官方描述译文

等待向 WAL 文件写入数据。

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

历史名称:IO/WALWrite (PG 13-16)

触发机制

WAIT_EVENT_WAL_WRITE 位于 src/backend/access/transam/xlog.c:2200,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:763。探针覆盖的操作是:等待向 WAL 文件写入数据。PostgreSQL 在 WalWrite 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/WalWrite 的会话
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 = 'IO'
  AND wait_event = 'WalWrite'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'WalWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

6.86 - IO: WalsenderTimelineHistoryRead

等待在 WAL sender 执行 timeline 命令期间从时间线历史文件中读取数据。
PostgreSQL 等待事件档案
类别IO 事件WalsenderTimelineHistoryRead 版本PG 17-18 证据4 个源码位置

官方描述译文

等待在 WAL sender 执行 timeline 命令期间从时间线历史文件中读取数据。

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

历史名称:IO/WALSenderTimelineHistoryRead (PG 13-16)

触发机制

WAIT_EVENT_WALSENDER_TIMELINE_HISTORY_READ 位于 src/backend/replication/walsender.c:654,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:730。探针覆盖的操作是:等待在 WAL sender 执行 timeline 命令期间从时间线历史文件中读取数据。PostgreSQL 在 WalsenderTimelineHistoryRead 所表示的文件或异步 I/O 操作周围报告此事件;内核、存储栈或 I/O worker 完成该步骤后,后端继续执行。

正常还是麻烦?

  • 正常: 当负载本来就应以当前速率执行对应的读取、写入、同步、分配或完成操作时,这项等待正常。
  • 需要调查: 若它持续存在并伴随前台延迟、大量并发等待者、存储长尾延迟、限速或错误,应当调查。

诊断 SQL

正在等待 IO/WalsenderTimelineHistoryRead 的会话
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 = 'IO'
  AND wait_event = 'WalsenderTimelineHistoryRead'
ORDER BY query_age DESC NULLS LAST;
当前 IO 等待分布
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 = 'IO'
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 = 'IO'
  AND a.wait_event = 'WalsenderTimelineHistoryRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认当前负载阶段本来就应访问这类文件。
  2. 在可用版本上关联 pg_stat_io 与具体设备延迟。
  3. 先修复访问路径、突发形状或受影响存储层,再调整无关的内存参数。

源码证据

7 - IPC 等待

PostgreSQL 进程等待对端、worker、屏障、队列或阶段变化。

IPC 表示协调:当前进程已经走到一个依赖另一个 PostgreSQL 进程或执行参与者的位置。对端可能是并行 worker、WAL receiver、checkpointer、archiver、复制进程,或共享内存协议里的另一个后端。

找到缺席的对端或阶段

等待者本身往往是健康的。先问谁应该向它发信号,再检查该参与者的状态。并行查询事件按阶段图阅读;复制事件按 sender/receiver 流水线阅读;检查点事件按全局屏障阅读。

  • 正常: 并行计划汇合、检查点开始/完成、worker 启动或同步复制中的短暂等待。
  • 关注: 前台等待者连续三次采样都停在同一阶段,而对端没有可见进展。
  • 紧急: 对端已退出或被阻塞、队列无法排空、复制/故障切换停滞,或大量会话依赖同一个卡住的协调者。

值得先认出的事件

事件 对端或阶段
BufferIo 正在为共享缓冲区执行 I/O 的另一个后端
ExecuteGather 向 Gather 节点提供数据的子进程
ParallelFinish 并行 worker 到达计划完成点
CheckpointDone checkpointer 完成请求的检查点
SyncRep 远端同步备库确认
WalReceiverWaitStart startup 进程等待流复制数据
MessageQueueReceive 共享内存消息队列的生产者
RecoveryPause 恢复被运维策略有意暂停

常见误读

  • 杀掉等待者无法修复已死亡或被阻塞的对端。
  • IPC/SyncRep 是确认延迟;LWLock/SyncRep 是共享队列/状态元数据上的竞争。
  • 许多并行等待名称本来就是屏障。真正的问题是所有参与者是否最终推进。
  • RecoveryPause 可能完全是有意行为;先检查 pg_is_wal_replay_paused()

7.1 - IPC: AppendReady

等待 Append 计划节点的子计划节点就绪。
PostgreSQL 等待事件档案
类别IPC 事件AppendReady 版本PG 14-18 证据2 个源码位置

官方描述译文

等待 Append 计划节点的子计划节点就绪。

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

触发机制

WAIT_EVENT_APPEND_READY 位于 src/backend/executor/nodeAppend.c:1079,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:106。探针覆盖的操作是:等待 Append 计划节点的子计划节点就绪。AppendReady 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/AppendReady 的会话
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 = 'IPC'
  AND wait_event = 'AppendReady'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'AppendReady'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.2 - IPC: ArchiveCleanupCommand

等待 archive_cleanup_command 完成。
PostgreSQL 等待事件档案
类别IPC 事件ArchiveCleanupCommand 版本PG 15-18 证据2 个源码位置

官方描述译文

等待 archive_cleanup_command 完成。

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

触发机制

WAIT_EVENT_ARCHIVE_CLEANUP_COMMAND 位于 src/backend/access/transam/xlog.c:7885,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:107。探针覆盖的操作是:等待 archive_cleanup_command 完成。ArchiveCleanupCommand 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/ArchiveCleanupCommand 的会话
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 = 'IPC'
  AND wait_event = 'ArchiveCleanupCommand'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'ArchiveCleanupCommand'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.3 - IPC: ArchiveCommand

等待 archive_command 完成。
PostgreSQL 等待事件档案
类别IPC 事件ArchiveCommand 版本PG 15-18 证据2 个源码位置

官方描述译文

等待 archive_command 完成。

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

触发机制

WAIT_EVENT_ARCHIVE_COMMAND 位于 src/backend/archive/shell_archive.c:79,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:108。探针覆盖的操作是:等待 archive_command 完成。ArchiveCommand 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/ArchiveCommand 的会话
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 = 'IPC'
  AND wait_event = 'ArchiveCommand'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'ArchiveCommand'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.4 - IPC: BackendTermination

等待另一个后端终止。
PostgreSQL 等待事件档案
类别IPC 事件BackendTermination 版本PG 14-18 证据2 个源码位置

官方描述译文

等待另一个后端终止。

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

触发机制

WAIT_EVENT_BACKEND_TERMINATION 位于 src/backend/storage/ipc/signalfuncs.c:210,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:109。探针覆盖的操作是:等待另一个后端终止。BackendTermination 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/BackendTermination 的会话
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 = 'IPC'
  AND wait_event = 'BackendTermination'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'BackendTermination'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.5 - IPC: BackupWaitWalArchive

等待备份所需的 WAL 文件成功归档。
PostgreSQL 等待事件档案
类别IPC 事件BackupWaitWalArchive 版本PG 13-18 证据2 个源码位置

官方描述译文

等待备份所需的 WAL 文件成功归档。

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

触发机制

WAIT_EVENT_BACKUP_WAIT_WAL_ARCHIVE 位于 src/backend/access/transam/xlog.c:9405,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:110。探针覆盖的操作是:等待备份所需的 WAL 文件成功归档。BackupWaitWalArchive 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/BackupWaitWalArchive 的会话
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 = 'IPC'
  AND wait_event = 'BackupWaitWalArchive'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'BackupWaitWalArchive'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.6 - IPC: BgworkerShutdown

等待后台工作进程关闭。
PostgreSQL 等待事件档案
类别IPC 事件BgworkerShutdown 版本PG 17-18 证据4 个源码位置

官方描述译文

等待后台工作进程关闭。

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

历史名称:IPC/BgWorkerShutdown (PG 13-16)

触发机制

WAIT_EVENT_BGWORKER_SHUTDOWN 位于 src/backend/postmaster/bgworker.c:1188,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:329。探针覆盖的操作是:等待后台工作进程关闭。BgworkerShutdown 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/BgworkerShutdown 的会话
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 = 'IPC'
  AND wait_event = 'BgworkerShutdown'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'BgworkerShutdown'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.7 - IPC: BgworkerStartup

等待后台工作进程启动。
PostgreSQL 等待事件档案
类别IPC 事件BgworkerStartup 版本PG 17-18 证据4 个源码位置

官方描述译文

等待后台工作进程启动。

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

历史名称:IPC/BgWorkerStartup (PG 13-16)

触发机制

WAIT_EVENT_BGWORKER_STARTUP 位于 src/backend/access/transam/parallel.c:771,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:332。探针覆盖的操作是:等待后台工作进程启动。BgworkerStartup 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/BgworkerStartup 的会话
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 = 'IPC'
  AND wait_event = 'BgworkerStartup'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'BgworkerStartup'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.8 - IPC: BtreePage

等待继续并行 B-tree 扫描所需的页号可用。
PostgreSQL 等待事件档案
类别IPC 事件BtreePage 版本PG 13-18 证据2 个源码位置

官方描述译文

等待继续并行 B-tree 扫描所需的页号可用。

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

触发机制

WAIT_EVENT_BTREE_PAGE 位于 src/backend/access/nbtree/nbtree.c:927,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:113。探针覆盖的操作是:等待继续并行 B-tree 扫描所需的页号可用。BtreePage 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/BtreePage 的会话
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 = 'IPC'
  AND wait_event = 'BtreePage'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'BtreePage'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.9 - IPC: BufferIo

等待缓冲区 I/O 完成。
PostgreSQL 等待事件档案
类别IPC 事件BufferIo 版本PG 17-18 证据7 个源码位置

官方描述译文

等待缓冲区 I/O 完成。

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

历史名称:IPC/BufferIO (PG 14-16), LWLock/BufferIO (PG 13)

触发机制

pgstat_report_wait_start 位于 src/backend/storage/lmgr/lwlock.c:765,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/access/transam/xact.c:2627。探针覆盖的操作是:等待缓冲区 I/O 完成。BufferIo 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/BufferIo 的会话
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 = 'IPC'
  AND wait_event = 'BufferIo'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'BufferIo'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.10 - IPC: CheckpointDelayComplete

等待后端解除对检查点完成的阻塞。
PostgreSQL 等待事件档案
类别IPC 事件CheckpointDelayComplete 版本PG 17-18 证据2 个源码位置

官方描述译文

等待后端解除对检查点完成的阻塞。

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

触发机制

WAIT_EVENT_CHECKPOINT_DELAY_COMPLETE 位于 src/backend/access/transam/xlog.c:7228,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:115。探针覆盖的操作是:等待后端解除对检查点完成的阻塞。CheckpointDelayComplete 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/CheckpointDelayComplete 的会话
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 = 'IPC'
  AND wait_event = 'CheckpointDelayComplete'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'CheckpointDelayComplete'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.11 - IPC: CheckpointDelayStart

等待后端解除对检查点启动的阻塞。
PostgreSQL 等待事件档案
类别IPC 事件CheckpointDelayStart 版本PG 17-18 证据2 个源码位置

官方描述译文

等待后端解除对检查点启动的阻塞。

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

触发机制

WAIT_EVENT_CHECKPOINT_DELAY_START 位于 src/backend/access/transam/xlog.c:7211,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:116。探针覆盖的操作是:等待后端解除对检查点启动的阻塞。CheckpointDelayStart 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/CheckpointDelayStart 的会话
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 = 'IPC'
  AND wait_event = 'CheckpointDelayStart'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'CheckpointDelayStart'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.12 - IPC: CheckpointDone

等待检查点完成。
PostgreSQL 等待事件档案
类别IPC 事件CheckpointDone 版本PG 13-18 证据2 个源码位置

官方描述译文

等待检查点完成。

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

触发机制

WAIT_EVENT_CHECKPOINT_DONE 位于 src/backend/postmaster/checkpointer.c:1121,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:117。探针覆盖的操作是:等待检查点完成。CheckpointDone 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/CheckpointDone 的会话
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 = 'IPC'
  AND wait_event = 'CheckpointDone'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'CheckpointDone'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.13 - IPC: CheckpointStart

等待检查点启动。
PostgreSQL 等待事件档案
类别IPC 事件CheckpointStart 版本PG 13-18 证据2 个源码位置

官方描述译文

等待检查点启动。

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

触发机制

WAIT_EVENT_CHECKPOINT_START 位于 src/backend/postmaster/checkpointer.c:1100,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:118。探针覆盖的操作是:等待检查点启动。CheckpointStart 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/CheckpointStart 的会话
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 = 'IPC'
  AND wait_event = 'CheckpointStart'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'CheckpointStart'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.14 - IPC: ExecuteGather

等待执行 Gather 计划节点时来自子进程的活动。
PostgreSQL 等待事件档案
类别IPC 事件ExecuteGather 版本PG 13-18 证据2 个源码位置

官方描述译文

等待执行 Gather 计划节点时来自子进程的活动。

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

触发机制

WAIT_EVENT_EXECUTE_GATHER 位于 src/backend/executor/nodeGather.c:386,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:119。探针覆盖的操作是:等待执行 Gather 计划节点时来自子进程的活动。ExecuteGather 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/ExecuteGather 的会话
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 = 'IPC'
  AND wait_event = 'ExecuteGather'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'ExecuteGather'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.15 - IPC: HashBatchAllocate

等待被选出的 Parallel Hash 参与者分配哈希表。
PostgreSQL 等待事件档案
类别IPC 事件HashBatchAllocate 版本PG 13-18 证据2 个源码位置

官方描述译文

等待被选出的 Parallel Hash 参与者分配哈希表。

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

触发机制

WAIT_EVENT_HASH_BATCH_ALLOCATE 位于 src/backend/executor/nodeHashjoin.c:1321,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:120。探针覆盖的操作是:等待被选出的 Parallel Hash 参与者分配哈希表。HashBatchAllocate 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/HashBatchAllocate 的会话
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 = 'IPC'
  AND wait_event = 'HashBatchAllocate'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'HashBatchAllocate'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.16 - IPC: HashBatchElect

等待选出一个负责分配哈希表的 Parallel Hash 参与者。
PostgreSQL 等待事件档案
类别IPC 事件HashBatchElect 版本PG 13-18 证据2 个源码位置

官方描述译文

等待选出一个负责分配哈希表的 Parallel Hash 参与者。

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

触发机制

WAIT_EVENT_HASH_BATCH_ELECT 位于 src/backend/executor/nodeHashjoin.c:1314,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:121。探针覆盖的操作是:等待选出一个负责分配哈希表的 Parallel Hash 参与者。HashBatchElect 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/HashBatchElect 的会话
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 = 'IPC'
  AND wait_event = 'HashBatchElect'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'HashBatchElect'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.17 - IPC: HashBatchLoad

等待其他 Parallel Hash 参与者完成哈希表加载。
PostgreSQL 等待事件档案
类别IPC 事件HashBatchLoad 版本PG 13-18 证据2 个源码位置

官方描述译文

等待其他 Parallel Hash 参与者完成哈希表加载。

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

触发机制

WAIT_EVENT_HASH_BATCH_LOAD 位于 src/backend/executor/nodeHashjoin.c:1341,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:122。探针覆盖的操作是:等待其他 Parallel Hash 参与者完成哈希表加载。HashBatchLoad 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/HashBatchLoad 的会话
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 = 'IPC'
  AND wait_event = 'HashBatchLoad'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'HashBatchLoad'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.18 - IPC: HashBuildAllocate

等待被选出的 Parallel Hash 参与者分配初始哈希表。
PostgreSQL 等待事件档案
类别IPC 事件HashBuildAllocate 版本PG 13-18 证据2 个源码位置

官方描述译文

等待被选出的 Parallel Hash 参与者分配初始哈希表。

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

触发机制

WAIT_EVENT_HASH_BUILD_ALLOCATE 位于 src/backend/executor/nodeHash.c:261,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:123。探针覆盖的操作是:等待被选出的 Parallel Hash 参与者分配初始哈希表。HashBuildAllocate 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/HashBuildAllocate 的会话
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 = 'IPC'
  AND wait_event = 'HashBuildAllocate'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'HashBuildAllocate'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.19 - IPC: HashBuildElect

等待选出一个负责分配初始哈希表的 Parallel Hash 参与者。
PostgreSQL 等待事件档案
类别IPC 事件HashBuildElect 版本PG 13-18 证据2 个源码位置

官方描述译文

等待选出一个负责分配初始哈希表的 Parallel Hash 参与者。

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

触发机制

WAIT_EVENT_HASH_BUILD_ELECT 位于 src/backend/executor/nodeHash.c:598,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:124。探针覆盖的操作是:等待选出一个负责分配初始哈希表的 Parallel Hash 参与者。HashBuildElect 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/HashBuildElect 的会话
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 = 'IPC'
  AND wait_event = 'HashBuildElect'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'HashBuildElect'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.20 - IPC: HashBuildHashInner

等待其他 Parallel Hash 参与者完成对 inner relation 的哈希处理。
PostgreSQL 等待事件档案
类别IPC 事件HashBuildHashInner 版本PG 13-18 证据2 个源码位置

官方描述译文

等待其他 Parallel Hash 参与者完成对 inner relation 的哈希处理。

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

触发机制

WAIT_EVENT_HASH_BUILD_HASH_INNER 位于 src/backend/executor/nodeHash.c:324,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:125。探针覆盖的操作是:等待其他 Parallel Hash 参与者完成对 inner relation 的哈希处理。HashBuildHashInner 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/HashBuildHashInner 的会话
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 = 'IPC'
  AND wait_event = 'HashBuildHashInner'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'HashBuildHashInner'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.21 - IPC: HashBuildHashOuter

等待其他 Parallel Hash 参与者完成对 outer relation 的分区。
PostgreSQL 等待事件档案
类别IPC 事件HashBuildHashOuter 版本PG 13-18 证据2 个源码位置

官方描述译文

等待其他 Parallel Hash 参与者完成对 outer relation 的分区。

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

触发机制

WAIT_EVENT_HASH_BUILD_HASH_OUTER 位于 src/backend/executor/nodeHashjoin.c:397,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:126。探针覆盖的操作是:等待其他 Parallel Hash 参与者完成对 outer relation 的分区。HashBuildHashOuter 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/HashBuildHashOuter 的会话
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 = 'IPC'
  AND wait_event = 'HashBuildHashOuter'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'HashBuildHashOuter'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.22 - IPC: HashGrowBatchesDecide

等待选出一个 Parallel Hash 参与者,以决定后续 batch 扩容。
PostgreSQL 等待事件档案
类别IPC 事件HashGrowBatchesDecide 版本PG 13-18 证据2 个源码位置

官方描述译文

等待选出一个 Parallel Hash 参与者,以决定后续 batch 扩容。

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

触发机制

WAIT_EVENT_HASH_GROW_BATCHES_DECIDE 位于 src/backend/executor/nodeHash.c:1363,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:127。探针覆盖的操作是:等待选出一个 Parallel Hash 参与者,以决定后续 batch 扩容。HashGrowBatchesDecide 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/HashGrowBatchesDecide 的会话
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 = 'IPC'
  AND wait_event = 'HashGrowBatchesDecide'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'HashGrowBatchesDecide'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.23 - IPC: HashGrowBatchesElect

等待选出一个负责分配更多 batch 的 Parallel Hash 参与者。
PostgreSQL 等待事件档案
类别IPC 事件HashGrowBatchesElect 版本PG 13-18 证据2 个源码位置

官方描述译文

等待选出一个负责分配更多 batch 的 Parallel Hash 参与者。

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

触发机制

WAIT_EVENT_HASH_GROW_BATCHES_ELECT 位于 src/backend/executor/nodeHash.c:1220,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:128。探针覆盖的操作是:等待选出一个负责分配更多 batch 的 Parallel Hash 参与者。HashGrowBatchesElect 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/HashGrowBatchesElect 的会话
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 = 'IPC'
  AND wait_event = 'HashGrowBatchesElect'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'HashGrowBatchesElect'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.24 - IPC: HashGrowBatchesFinish

等待被选出的 Parallel Hash 参与者决定后续 batch 扩容。
PostgreSQL 等待事件档案
类别IPC 事件HashGrowBatchesFinish 版本PG 13-18 证据2 个源码位置

官方描述译文

等待被选出的 Parallel Hash 参与者决定后续 batch 扩容。

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

触发机制

WAIT_EVENT_HASH_GROW_BATCHES_FINISH 位于 src/backend/executor/nodeHash.c:1420,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:129。探针覆盖的操作是:等待被选出的 Parallel Hash 参与者决定后续 batch 扩容。HashGrowBatchesFinish 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/HashGrowBatchesFinish 的会话
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 = 'IPC'
  AND wait_event = 'HashGrowBatchesFinish'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'HashGrowBatchesFinish'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.25 - IPC: HashGrowBatchesReallocate

等待被选出的 Parallel Hash 参与者分配更多 batch。
PostgreSQL 等待事件档案
类别IPC 事件HashGrowBatchesReallocate 版本PG 16-18 证据4 个源码位置

官方描述译文

等待被选出的 Parallel Hash 参与者分配更多 batch。

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

历史名称:IPC/HashGrowBatchesAllocate (PG 13-15)

触发机制

WAIT_EVENT_HASH_GROW_BATCHES_ALLOCATE 位于 src/backend/executor/nodeHash.c:1229,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:368。探针覆盖的操作是:等待被选出的 Parallel Hash 参与者分配更多 batch。HashGrowBatchesReallocate 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/HashGrowBatchesReallocate 的会话
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 = 'IPC'
  AND wait_event = 'HashGrowBatchesReallocate'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'HashGrowBatchesReallocate'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.26 - IPC: HashGrowBatchesRepartition

等待其他 Parallel Hash 参与者完成重新分区。
PostgreSQL 等待事件档案
类别IPC 事件HashGrowBatchesRepartition 版本PG 13-18 证据2 个源码位置

官方描述译文

等待其他 Parallel Hash 参与者完成重新分区。

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

触发机制

WAIT_EVENT_HASH_GROW_BATCHES_REPARTITION 位于 src/backend/executor/nodeHash.c:1352,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:131。探针覆盖的操作是:等待其他 Parallel Hash 参与者完成重新分区。HashGrowBatchesRepartition 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/HashGrowBatchesRepartition 的会话
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 = 'IPC'
  AND wait_event = 'HashGrowBatchesRepartition'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'HashGrowBatchesRepartition'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.27 - IPC: HashGrowBucketsElect

等待选出一个负责分配更多 bucket 的 Parallel Hash 参与者。
PostgreSQL 等待事件档案
类别IPC 事件HashGrowBucketsElect 版本PG 13-18 证据2 个源码位置

官方描述译文

等待选出一个负责分配更多 bucket 的 Parallel Hash 参与者。

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

触发机制

WAIT_EVENT_HASH_GROW_BUCKETS_ELECT 位于 src/backend/executor/nodeHash.c:1669,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:132。探针覆盖的操作是:等待选出一个负责分配更多 bucket 的 Parallel Hash 参与者。HashGrowBucketsElect 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/HashGrowBucketsElect 的会话
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 = 'IPC'
  AND wait_event = 'HashGrowBucketsElect'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'HashGrowBucketsElect'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.28 - IPC: HashGrowBucketsReallocate

等待被选出的 Parallel Hash 参与者完成更多 bucket 的分配。
PostgreSQL 等待事件档案
类别IPC 事件HashGrowBucketsReallocate 版本PG 16-18 证据4 个源码位置

官方描述译文

等待被选出的 Parallel Hash 参与者完成更多 bucket 的分配。

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

历史名称:IPC/HashGrowBucketsAllocate (PG 13-15)

触发机制

WAIT_EVENT_HASH_GROW_BUCKETS_ALLOCATE 位于 src/backend/executor/nodeHash.c:1588,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:383。探针覆盖的操作是:等待被选出的 Parallel Hash 参与者完成更多 bucket 的分配。HashGrowBucketsReallocate 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/HashGrowBucketsReallocate 的会话
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 = 'IPC'
  AND wait_event = 'HashGrowBucketsReallocate'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'HashGrowBucketsReallocate'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.29 - IPC: HashGrowBucketsReinsert

等待其他 Parallel Hash 参与者完成将元组插入新 bucket。
PostgreSQL 等待事件档案
类别IPC 事件HashGrowBucketsReinsert 版本PG 13-18 证据2 个源码位置

官方描述译文

等待其他 Parallel Hash 参与者完成将元组插入新 bucket。

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

触发机制

WAIT_EVENT_HASH_GROW_BUCKETS_REINSERT 位于 src/backend/executor/nodeHash.c:1733,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:134。探针覆盖的操作是:等待其他 Parallel Hash 参与者完成将元组插入新 bucket。HashGrowBucketsReinsert 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/HashGrowBucketsReinsert 的会话
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 = 'IPC'
  AND wait_event = 'HashGrowBucketsReinsert'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'HashGrowBucketsReinsert'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.30 - IPC: LogicalApplySendData

等待逻辑复制 leader apply 进程向 parallel apply 进程发送数据。
PostgreSQL 等待事件档案
类别IPC 事件LogicalApplySendData 版本PG 16-18 证据2 个源码位置

官方描述译文

等待逻辑复制 leader apply 进程向 parallel apply 进程发送数据。

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

触发机制

WAIT_EVENT_LOGICAL_APPLY_SEND_DATA 位于 src/backend/replication/logical/applyparallelworker.c:1204,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:135。探针覆盖的操作是:等待逻辑复制 leader apply 进程向 parallel apply 进程发送数据。LogicalApplySendData 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/LogicalApplySendData 的会话
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 = 'IPC'
  AND wait_event = 'LogicalApplySendData'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'LogicalApplySendData'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.31 - IPC: LogicalParallelApplyStateChange

等待逻辑复制 parallel apply 进程改变状态。
PostgreSQL 等待事件档案
类别IPC 事件LogicalParallelApplyStateChange 版本PG 16-18 证据2 个源码位置

官方描述译文

等待逻辑复制 parallel apply 进程改变状态。

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

触发机制

WAIT_EVENT_LOGICAL_PARALLEL_APPLY_STATE_CHANGE 位于 src/backend/replication/logical/applyparallelworker.c:1276,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:136。探针覆盖的操作是:等待逻辑复制 parallel apply 进程改变状态。LogicalParallelApplyStateChange 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/LogicalParallelApplyStateChange 的会话
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 = 'IPC'
  AND wait_event = 'LogicalParallelApplyStateChange'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'LogicalParallelApplyStateChange'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.32 - IPC: LogicalSyncData

等待逻辑复制远端服务器发送用于初始表同步的数据。
PostgreSQL 等待事件档案
类别IPC 事件LogicalSyncData 版本PG 13-18 证据2 个源码位置

官方描述译文

等待逻辑复制远端服务器发送用于初始表同步的数据。

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

触发机制

WAIT_EVENT_LOGICAL_SYNC_DATA 位于 src/backend/replication/logical/tablesync.c:807,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:137。探针覆盖的操作是:等待逻辑复制远端服务器发送用于初始表同步的数据。LogicalSyncData 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/LogicalSyncData 的会话
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 = 'IPC'
  AND wait_event = 'LogicalSyncData'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'LogicalSyncData'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.33 - IPC: LogicalSyncStateChange

等待逻辑复制远端服务器改变状态。
PostgreSQL 等待事件档案
类别IPC 事件LogicalSyncStateChange 版本PG 13-18 证据2 个源码位置

官方描述译文

等待逻辑复制远端服务器改变状态。

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

触发机制

WAIT_EVENT_LOGICAL_SYNC_STATE_CHANGE 位于 src/backend/replication/logical/tablesync.c:214,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:138。探针覆盖的操作是:等待逻辑复制远端服务器改变状态。LogicalSyncStateChange 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/LogicalSyncStateChange 的会话
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 = 'IPC'
  AND wait_event = 'LogicalSyncStateChange'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'LogicalSyncStateChange'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.34 - IPC: MessageQueueInternal

等待另一个进程附加到共享消息队列。
PostgreSQL 等待事件档案
类别IPC 事件MessageQueueInternal 版本PG 13-18 证据2 个源码位置

官方描述译文

等待另一个进程附加到共享消息队列。

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

触发机制

WAIT_EVENT_MESSAGE_QUEUE_INTERNAL 位于 src/backend/storage/ipc/shm_mq.c:1254,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:139。探针覆盖的操作是:等待另一个进程附加到共享消息队列。MessageQueueInternal 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/MessageQueueInternal 的会话
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 = 'IPC'
  AND wait_event = 'MessageQueueInternal'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'MessageQueueInternal'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.35 - IPC: MessageQueuePutMessage

等待向共享消息队列写入协议消息。
PostgreSQL 等待事件档案
类别IPC 事件MessageQueuePutMessage 版本PG 13-18 证据2 个源码位置

官方描述译文

等待向共享消息队列写入协议消息。

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

触发机制

WAIT_EVENT_MESSAGE_QUEUE_PUT_MESSAGE 位于 src/backend/libpq/pqmq.c:185,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:140。探针覆盖的操作是:等待向共享消息队列写入协议消息。MessageQueuePutMessage 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/MessageQueuePutMessage 的会话
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 = 'IPC'
  AND wait_event = 'MessageQueuePutMessage'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'MessageQueuePutMessage'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.36 - IPC: MessageQueueReceive

等待从共享消息队列接收字节。
PostgreSQL 等待事件档案
类别IPC 事件MessageQueueReceive 版本PG 13-18 证据2 个源码位置

官方描述译文

等待从共享消息队列接收字节。

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

触发机制

WAIT_EVENT_MESSAGE_QUEUE_RECEIVE 位于 src/backend/storage/ipc/shm_mq.c:1165,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:141。探针覆盖的操作是:等待从共享消息队列接收字节。MessageQueueReceive 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/MessageQueueReceive 的会话
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 = 'IPC'
  AND wait_event = 'MessageQueueReceive'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'MessageQueueReceive'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.37 - IPC: MessageQueueSend

等待向共享消息队列发送字节。
PostgreSQL 等待事件档案
类别IPC 事件MessageQueueSend 版本PG 13-18 证据2 个源码位置

官方描述译文

等待向共享消息队列发送字节。

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

触发机制

WAIT_EVENT_MESSAGE_QUEUE_SEND 位于 src/backend/storage/ipc/shm_mq.c:1019,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:142。探针覆盖的操作是:等待向共享消息队列发送字节。MessageQueueSend 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/MessageQueueSend 的会话
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 = 'IPC'
  AND wait_event = 'MessageQueueSend'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'MessageQueueSend'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.38 - IPC: MultixactCreation

等待 multixact 创建完成。
PostgreSQL 等待事件档案
类别IPC 事件MultixactCreation 版本PG 17-18 证据1 个源码位置

官方描述译文

等待 multixact 创建完成。

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

触发机制

目录中仍保留该身份,但源码审计确认在 17.8+, 18.2+ 已没有活动报告点。已知曾可触发范围:17.0-17.7, 18.0-18.1。下方定义位置作为负面证据保留;当前精确版本不会从核心代码路径发出此事件。 证据:PostgreSQL 17.8 release notePostgreSQL 18.2 release note

正常还是麻烦?

  • 正常: 在已审计的精确版本上,不应出现活动的核心触发。
  • 需要调查: 若监控仍显示它,应核对精确小版本、扩展来源,并确认样本是否陈旧或来自另一台服务器。

诊断 SQL

正在等待 IPC/MultixactCreation 的会话
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 = 'IPC'
  AND wait_event = 'MultixactCreation'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'MultixactCreation'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.39 - IPC: ParallelBitmapScan

等待并行位图扫描完成初始化。
PostgreSQL 等待事件档案
类别IPC 事件ParallelBitmapScan 版本PG 13-18 证据2 个源码位置

官方描述译文

等待并行位图扫描完成初始化。

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

触发机制

WAIT_EVENT_PARALLEL_BITMAP_SCAN 位于 src/backend/executor/nodeBitmapHeapscan.c:437,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:144。探针覆盖的操作是:等待并行位图扫描完成初始化。ParallelBitmapScan 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/ParallelBitmapScan 的会话
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 = 'IPC'
  AND wait_event = 'ParallelBitmapScan'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'ParallelBitmapScan'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.40 - IPC: ParallelCreateIndexScan

等待并行 CREATE INDEX 工作进程完成 heap 扫描。
PostgreSQL 等待事件档案
类别IPC 事件ParallelCreateIndexScan 版本PG 13-18 证据2 个源码位置

官方描述译文

等待并行 CREATE INDEX 工作进程完成 heap 扫描。

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

触发机制

WAIT_EVENT_PARALLEL_CREATE_INDEX_SCAN 位于 src/backend/access/brin/brin.c:2600,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:145。探针覆盖的操作是:等待并行 CREATE INDEX 工作进程完成 heap 扫描。ParallelCreateIndexScan 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/ParallelCreateIndexScan 的会话
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 = 'IPC'
  AND wait_event = 'ParallelCreateIndexScan'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'ParallelCreateIndexScan'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.41 - IPC: ParallelFinish

等待并行工作进程完成计算。
PostgreSQL 等待事件档案
类别IPC 事件ParallelFinish 版本PG 13-18 证据2 个源码位置

官方描述译文

等待并行工作进程完成计算。

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

触发机制

WAIT_EVENT_PARALLEL_FINISH 位于 src/backend/access/transam/parallel.c:894,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:146。探针覆盖的操作是:等待并行工作进程完成计算。ParallelFinish 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/ParallelFinish 的会话
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 = 'IPC'
  AND wait_event = 'ParallelFinish'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'ParallelFinish'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.42 - IPC: ProcSignalBarrier

等待所有后端处理完 barrier 事件。
PostgreSQL 等待事件档案
类别IPC 事件ProcSignalBarrier 版本PG 13-18 证据2 个源码位置

官方描述译文

等待所有后端处理完 barrier 事件。

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

触发机制

WAIT_EVENT_PROC_SIGNAL_BARRIER 位于 src/backend/storage/ipc/procsignal.c:458,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:148。探针覆盖的操作是:等待所有后端处理完 barrier 事件。ProcSignalBarrier 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/ProcSignalBarrier 的会话
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 = 'IPC'
  AND wait_event = 'ProcSignalBarrier'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'ProcSignalBarrier'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.43 - IPC: ProcarrayGroupUpdate

等待 group leader 在事务结束时清除事务 ID。
PostgreSQL 等待事件档案
类别IPC 事件ProcarrayGroupUpdate 版本PG 17-18 证据4 个源码位置

官方描述译文

等待 group leader 在事务结束时清除事务 ID。

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

历史名称:IPC/ProcArrayGroupUpdate (PG 13-16)

触发机制

WAIT_EVENT_PROCARRAY_GROUP_UPDATE 位于 src/backend/storage/ipc/procarray.c:829,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:428。探针覆盖的操作是:等待 group leader 在事务结束时清除事务 ID。ProcarrayGroupUpdate 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/ProcarrayGroupUpdate 的会话
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 = 'IPC'
  AND wait_event = 'ProcarrayGroupUpdate'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'ProcarrayGroupUpdate'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.44 - IPC: Promote

等待备库提升。
PostgreSQL 等待事件档案
类别IPC 事件Promote 版本PG 13-18 证据2 个源码位置

官方描述译文

等待备库提升。

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

触发机制

WAIT_EVENT_PROMOTE 位于 src/backend/access/transam/xlogfuncs.c:731,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:149。探针覆盖的操作是:等待备库提升。Promote 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/Promote 的会话
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 = 'IPC'
  AND wait_event = 'Promote'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'Promote'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.45 - IPC: RecoveryConflictSnapshot

等待解决与 vacuum cleanup 有关的恢复冲突。
PostgreSQL 等待事件档案
类别IPC 事件RecoveryConflictSnapshot 版本PG 13-18 证据2 个源码位置

官方描述译文

等待解决与 vacuum cleanup 有关的恢复冲突。

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

触发机制

WAIT_EVENT_RECOVERY_CONFLICT_SNAPSHOT 位于 src/backend/storage/ipc/standby.c:493,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:150。探针覆盖的操作是:等待解决与 vacuum cleanup 有关的恢复冲突。RecoveryConflictSnapshot 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/RecoveryConflictSnapshot 的会话
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 = 'IPC'
  AND wait_event = 'RecoveryConflictSnapshot'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'RecoveryConflictSnapshot'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.46 - IPC: RecoveryConflictTablespace

等待解决与删除表空间有关的恢复冲突。
PostgreSQL 等待事件档案
类别IPC 事件RecoveryConflictTablespace 版本PG 13-18 证据2 个源码位置

官方描述译文

等待解决与删除表空间有关的恢复冲突。

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

触发机制

WAIT_EVENT_RECOVERY_CONFLICT_TABLESPACE 位于 src/backend/storage/ipc/standby.c:564,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:151。探针覆盖的操作是:等待解决与删除表空间有关的恢复冲突。RecoveryConflictTablespace 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/RecoveryConflictTablespace 的会话
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 = 'IPC'
  AND wait_event = 'RecoveryConflictTablespace'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'RecoveryConflictTablespace'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.47 - IPC: RecoveryEndCommand

等待 recovery_end_command 完成。
PostgreSQL 等待事件档案
类别IPC 事件RecoveryEndCommand 版本PG 15-18 证据2 个源码位置

官方描述译文

等待 recovery_end_command 完成。

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

触发机制

WAIT_EVENT_RECOVERY_END_COMMAND 位于 src/backend/access/transam/xlog.c:5337,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:152。探针覆盖的操作是:等待 recovery_end_command 完成。RecoveryEndCommand 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/RecoveryEndCommand 的会话
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 = 'IPC'
  AND wait_event = 'RecoveryEndCommand'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'RecoveryEndCommand'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.48 - IPC: RecoveryPause

等待恢复操作继续执行。
PostgreSQL 等待事件档案
类别IPC 事件RecoveryPause 版本PG 13-18 证据2 个源码位置

官方描述译文

等待恢复操作继续执行。

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

触发机制

WAIT_EVENT_RECOVERY_PAUSE 位于 src/backend/access/transam/xlogrecovery.c:2994,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:153。探针覆盖的操作是:等待恢复操作继续执行。RecoveryPause 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/RecoveryPause 的会话
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 = 'IPC'
  AND wait_event = 'RecoveryPause'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'RecoveryPause'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.49 - IPC: ReplicationOriginDrop

等待复制源变为非活动状态,以便将其删除。
PostgreSQL 等待事件档案
类别IPC 事件ReplicationOriginDrop 版本PG 13-18 证据2 个源码位置

官方描述译文

等待复制源变为非活动状态,以便将其删除。

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

触发机制

WAIT_EVENT_REPLICATION_ORIGIN_DROP 位于 src/backend/replication/logical/origin.c:408,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:154。探针覆盖的操作是:等待复制源变为非活动状态,以便将其删除。ReplicationOriginDrop 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/ReplicationOriginDrop 的会话
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 = 'IPC'
  AND wait_event = 'ReplicationOriginDrop'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'ReplicationOriginDrop'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.50 - IPC: ReplicationSlotDrop

等待复制槽变为非活动状态,以便将其删除。
PostgreSQL 等待事件档案
类别IPC 事件ReplicationSlotDrop 版本PG 13-18 证据2 个源码位置

官方描述译文

等待复制槽变为非活动状态,以便将其删除。

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

触发机制

WAIT_EVENT_REPLICATION_SLOT_DROP 位于 src/backend/replication/slot.c:657,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:155。探针覆盖的操作是:等待复制槽变为非活动状态,以便将其删除。ReplicationSlotDrop 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/ReplicationSlotDrop 的会话
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 = 'IPC'
  AND wait_event = 'ReplicationSlotDrop'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'ReplicationSlotDrop'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.51 - IPC: RestoreCommand

等待 restore_command 完成。
PostgreSQL 等待事件档案
类别IPC 事件RestoreCommand 版本PG 15-18 证据2 个源码位置

官方描述译文

等待 restore_command 完成。

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

触发机制

WAIT_EVENT_RESTORE_COMMAND 位于 src/backend/access/transam/xlogarchive.c:162,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:156。探针覆盖的操作是:等待 restore_command 完成。RestoreCommand 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/RestoreCommand 的会话
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 = 'IPC'
  AND wait_event = 'RestoreCommand'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'RestoreCommand'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.52 - IPC: SafeSnapshot

等待为 READ ONLY DEFERRABLE 事务获取有效 snapshot。
PostgreSQL 等待事件档案
类别IPC 事件SafeSnapshot 版本PG 13-18 证据2 个源码位置

官方描述译文

等待为 READ ONLY DEFERRABLE 事务获取有效 snapshot。

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

触发机制

WAIT_EVENT_SAFE_SNAPSHOT 位于 src/backend/storage/lmgr/predicate.c:1589,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:157。探针覆盖的操作是:等待为 READ ONLY DEFERRABLE 事务获取有效 snapshot。SafeSnapshot 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/SafeSnapshot 的会话
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 = 'IPC'
  AND wait_event = 'SafeSnapshot'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'SafeSnapshot'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.53 - IPC: SyncRep

等待同步复制期间来自远端服务器的确认。
PostgreSQL 等待事件档案
类别IPC 事件SyncRep 版本PG 13-18 证据2 个源码位置

官方描述译文

等待同步复制期间来自远端服务器的确认。

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

触发机制

WAIT_EVENT_SYNC_REP 位于 src/backend/replication/syncrep.c:332,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:158。探针覆盖的操作是:等待同步复制期间来自远端服务器的确认。SyncRep 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/SyncRep 的会话
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 = 'IPC'
  AND wait_event = 'SyncRep'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'SyncRep'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.54 - IPC: WalReceiverExit

等待 WAL receiver 退出。
PostgreSQL 等待事件档案
类别IPC 事件WalReceiverExit 版本PG 14-18 证据2 个源码位置

官方描述译文

等待 WAL receiver 退出。

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

触发机制

WAIT_EVENT_WAL_RECEIVER_EXIT 位于 src/backend/replication/walreceiverfuncs.c:228,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:159。探针覆盖的操作是:等待 WAL receiver 退出。WalReceiverExit 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/WalReceiverExit 的会话
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 = 'IPC'
  AND wait_event = 'WalReceiverExit'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'WalReceiverExit'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.55 - IPC: WalReceiverUpstreamCatchup

等待上游服务器的 WAL flush 位置追上请求的起始点。
PostgreSQL 等待事件档案
类别IPC 事件WalReceiverUpstreamCatchup 版本PG 17-18 证据2 个源码位置

官方描述译文

等待上游服务器的 WAL flush 位置追上请求的起始点。

PG 13 PG 14 PG 15 PG 16 PG 17 PG 18
重要

小版本可用性: 实测从 17.11+ 与 18.6+ 出现;17.10 与 18.4 中不存在,因此不能只写大版本范围。

触发机制

WAIT_EVENT_WAL_RECEIVER_UPSTREAM_CATCHUP 位于 src/backend/replication/walreceiver.c:398,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:165。探针覆盖的操作是:等待上游服务器的 WAL flush 位置追上请求的起始点。WalReceiverUpstreamCatchup 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/WalReceiverUpstreamCatchup 的会话
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 = 'IPC'
  AND wait_event = 'WalReceiverUpstreamCatchup'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'WalReceiverUpstreamCatchup'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.56 - IPC: WalReceiverWaitStart

等待 startup 进程发送流复制的初始数据。
PostgreSQL 等待事件档案
类别IPC 事件WalReceiverWaitStart 版本PG 14-18 证据4 个源码位置

官方描述译文

等待 startup 进程发送流复制的初始数据。

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

历史名称:Client/WalReceiverWaitStart (PG 13)

触发机制

WAIT_EVENT_WAL_RECEIVER_WAIT_START 位于 src/backend/postmaster/pgstat.c:3738,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/postmaster/pgstat.c:3739。探针覆盖的操作是:等待 startup 进程发送流复制的初始数据。WalReceiverWaitStart 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/WalReceiverWaitStart 的会话
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 = 'IPC'
  AND wait_event = 'WalReceiverWaitStart'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'WalReceiverWaitStart'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.57 - IPC: WalSummaryReady

等待生成新的 WAL summary。
PostgreSQL 等待事件档案
类别IPC 事件WalSummaryReady 版本PG 17-18 证据2 个源码位置

官方描述译文

等待生成新的 WAL summary。

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

触发机制

WAIT_EVENT_WAL_SUMMARY_READY 位于 src/backend/postmaster/walsummarizer.c:821,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:161。探针覆盖的操作是:等待生成新的 WAL summary。WalSummaryReady 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/WalSummaryReady 的会话
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 = 'IPC'
  AND wait_event = 'WalSummaryReady'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'WalSummaryReady'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

7.58 - IPC: XactGroupUpdate

等待 group leader 在事务结束时更新事务状态。
PostgreSQL 等待事件档案
类别IPC 事件XactGroupUpdate 版本PG 13-18 证据2 个源码位置

官方描述译文

等待 group leader 在事务结束时更新事务状态。

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

触发机制

WAIT_EVENT_XACT_GROUP_UPDATE 位于 src/backend/access/transam/clog.c:535,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:162。探针覆盖的操作是:等待 group leader 在事务结束时更新事务状态。XactGroupUpdate 路径已经到达进程协调点,会休眠到对端、worker、屏障、队列或复制阶段发出进展信号。

正常还是麻烦?

  • 正常: 只要所有参与者都在继续推进,短暂汇合就属正常。
  • 需要调查: 同一阶段连续三次采样仍存在、预期对端缺失或被阻塞,或队列及其依赖者停止推进时,应当调查。

诊断 SQL

正在等待 IPC/XactGroupUpdate 的会话
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 = 'IPC'
  AND wait_event = 'XactGroupUpdate'
ORDER BY query_age DESC NULLS LAST;
当前 IPC 等待分布
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 = 'IPC'
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 = 'IPC'
  AND a.wait_event = 'XactGroupUpdate'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认事件所指的对端或阶段。
  2. 检查该参与者的等待、错误与进展状态。
  3. 修复停滞的参与者或上游依赖,不要把等待者当作根因。

源码证据

8 - Client 等待

PostgreSQL 等待应用、网络套接字、TLS/GSS 握手或复制客户端。

Client 颠倒了通常的怀疑方向:PostgreSQL 已准备好读取、写入或完成协议步骤,但远端或网络没有推进。连接池里的空闲连接很多时,大量 Client 等待往往完全正常。

状态与事务年龄决定严重度

ClientReadstate = 'idle' 属于预期。同一个事件若是 idle in transactionxact_start 很老,就可能保留锁、快照和死元组。活动会话上的 ClientWrite 则说明服务器无法足够快地把结果交给消费者。

  • 正常: 空闲池化连接等待下一条命令。
  • 关注: 很老的 idle in transaction、活动状态的 ClientWrite、握手等待,或应用延迟同步上升。
  • 紧急: 客户端停止消费结果、连接槽耗尽、打开的事务阻碍清理,或复制客户端反复断开。

值得先认出的事件

事件 第一个责任方
ClientRead 应用/连接池
ClientWrite 应用消费者或网络
GssOpenServer 认证/网络路径
SslOpenServer TLS 握手路径
LibpqwalreceiverReceive 上游主库/网络
WalSenderWriteData 备库或复制客户端

常见误读

  • “大多数会话都在 ClientRead” 不是数据库瓶颈证据;还要看状态、事务年龄与连接池规模。
  • 取消空闲客户端不能修复过大的连接池,只会让连接池重新连接。
  • 即使数据库主机的网络看起来空闲,慢消费者仍会导致 ClientWrite
  • 带复制语义的 Client 等待仍位于协议边界,但运维责任方不同。

8.1 - Client: ClientRead

等待从客户端读取数据。
PostgreSQL 等待事件档案
类别Client 事件ClientRead 版本PG 13-18 证据2 个源码位置

官方描述译文

等待从客户端读取数据。

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

触发机制

WAIT_EVENT_CLIENT_READ 位于 src/backend/libpq/be-secure.c:219,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:85。探针覆盖的操作是:等待从客户端读取数据。前端协议路径在套接字、TLS/GSS 或复制客户端操作即将阻塞前报告 ClientRead;PostgreSQL 正在等待远端或网络推进。

正常还是麻烦?

  • 正常: 空闲状态的 ClientRead 通常只是连接池存量。
  • 需要调查: 活动写入、握手、很老的 idle in transaction、连接耗尽或复制客户端停滞时需要调查。

诊断 SQL

正在等待 Client/ClientRead 的会话
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 = 'Client'
  AND wait_event = 'ClientRead'
ORDER BY query_age DESC NULLS LAST;
当前 Client 等待分布
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 = 'Client'
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 = 'Client'
  AND a.wait_event = 'ClientRead'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先看 state 与事务年龄,再决定它是否算负载。
  2. 关联负责的应用、连接池与网络路径。
  3. 修复消费者背压或连接池策略,不要反复终止连接。

源码证据

8.2 - Client: ClientWrite

等待向客户端写入数据。
PostgreSQL 等待事件档案
类别Client 事件ClientWrite 版本PG 13-18 证据2 个源码位置

官方描述译文

等待向客户端写入数据。

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

触发机制

WAIT_EVENT_CLIENT_WRITE 位于 src/backend/libpq/be-secure.c:344,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:86。探针覆盖的操作是:等待向客户端写入数据。前端协议路径在套接字、TLS/GSS 或复制客户端操作即将阻塞前报告 ClientWrite;PostgreSQL 正在等待远端或网络推进。

正常还是麻烦?

  • 正常: 空闲状态的 ClientRead 通常只是连接池存量。
  • 需要调查: 活动写入、握手、很老的 idle in transaction、连接耗尽或复制客户端停滞时需要调查。

诊断 SQL

正在等待 Client/ClientWrite 的会话
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 = 'Client'
  AND wait_event = 'ClientWrite'
ORDER BY query_age DESC NULLS LAST;
当前 Client 等待分布
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 = 'Client'
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 = 'Client'
  AND a.wait_event = 'ClientWrite'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先看 state 与事务年龄,再决定它是否算负载。
  2. 关联负责的应用、连接池与网络路径。
  3. 修复消费者背压或连接池策略,不要反复终止连接。

源码证据

8.3 - Client: GssOpenServer

建立 GSSAPI 会话时,等待从客户端读取数据。
PostgreSQL 等待事件档案
类别Client 事件GssOpenServer 版本PG 17-18 证据4 个源码位置

官方描述译文

建立 GSSAPI 会话时,等待从客户端读取数据。

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

历史名称:Client/GSSOpenServer (PG 13-16)

触发机制

WAIT_EVENT_GSS_OPEN_SERVER 位于 src/backend/libpq/be-secure-gssapi.c:461,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:277。探针覆盖的操作是:建立 GSSAPI 会话时,等待从客户端读取数据。前端协议路径在套接字、TLS/GSS 或复制客户端操作即将阻塞前报告 GssOpenServer;PostgreSQL 正在等待远端或网络推进。

正常还是麻烦?

  • 正常: 空闲状态的 ClientRead 通常只是连接池存量。
  • 需要调查: 活动写入、握手、很老的 idle in transaction、连接耗尽或复制客户端停滞时需要调查。

诊断 SQL

正在等待 Client/GssOpenServer 的会话
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 = 'Client'
  AND wait_event = 'GssOpenServer'
ORDER BY query_age DESC NULLS LAST;
当前 Client 等待分布
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 = 'Client'
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 = 'Client'
  AND a.wait_event = 'GssOpenServer'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先看 state 与事务年龄,再决定它是否算负载。
  2. 关联负责的应用、连接池与网络路径。
  3. 修复消费者背压或连接池策略,不要反复终止连接。

源码证据

8.4 - Client: LibpqwalreceiverConnect

在 WAL receiver 中等待与远程服务器建立连接。
PostgreSQL 等待事件档案
类别Client 事件LibpqwalreceiverConnect 版本PG 17-18 证据4 个源码位置

官方描述译文

在 WAL receiver 中等待与远程服务器建立连接。

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

历史名称:Client/LibPQWalReceiverConnect (PG 13-16)

触发机制

WAIT_EVENT_LIBPQWALRECEIVER_CONNECT 位于 src/backend/replication/libpqwalreceiver/libpqwalreceiver.c:231,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:280。探针覆盖的操作是:在 WAL receiver 中等待与远程服务器建立连接。前端协议路径在套接字、TLS/GSS 或复制客户端操作即将阻塞前报告 LibpqwalreceiverConnect;PostgreSQL 正在等待远端或网络推进。

正常还是麻烦?

  • 正常: 空闲状态的 ClientRead 通常只是连接池存量。
  • 需要调查: 活动写入、握手、很老的 idle in transaction、连接耗尽或复制客户端停滞时需要调查。

诊断 SQL

正在等待 Client/LibpqwalreceiverConnect 的会话
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 = 'Client'
  AND wait_event = 'LibpqwalreceiverConnect'
ORDER BY query_age DESC NULLS LAST;
当前 Client 等待分布
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 = 'Client'
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 = 'Client'
  AND a.wait_event = 'LibpqwalreceiverConnect'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先看 state 与事务年龄,再决定它是否算负载。
  2. 关联负责的应用、连接池与网络路径。
  3. 修复消费者背压或连接池策略,不要反复终止连接。

源码证据

8.5 - Client: LibpqwalreceiverReceive

在 WAL receiver 中等待从远程服务器接收数据。
PostgreSQL 等待事件档案
类别Client 事件LibpqwalreceiverReceive 版本PG 17-18 证据4 个源码位置

官方描述译文

在 WAL receiver 中等待从远程服务器接收数据。

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

历史名称:Client/LibPQWalReceiverReceive (PG 13-16)

触发机制

WAIT_EVENT_LIBPQWALRECEIVER_RECEIVE 位于 src/backend/replication/libpqwalreceiver/libpqwalreceiver.c:876,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:283。探针覆盖的操作是:在 WAL receiver 中等待从远程服务器接收数据。前端协议路径在套接字、TLS/GSS 或复制客户端操作即将阻塞前报告 LibpqwalreceiverReceive;PostgreSQL 正在等待远端或网络推进。

正常还是麻烦?

  • 正常: 空闲状态的 ClientRead 通常只是连接池存量。
  • 需要调查: 活动写入、握手、很老的 idle in transaction、连接耗尽或复制客户端停滞时需要调查。

诊断 SQL

正在等待 Client/LibpqwalreceiverReceive 的会话
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 = 'Client'
  AND wait_event = 'LibpqwalreceiverReceive'
ORDER BY query_age DESC NULLS LAST;
当前 Client 等待分布
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 = 'Client'
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 = 'Client'
  AND a.wait_event = 'LibpqwalreceiverReceive'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先看 state 与事务年龄,再决定它是否算负载。
  2. 关联负责的应用、连接池与网络路径。
  3. 修复消费者背压或连接池策略,不要反复终止连接。

源码证据

8.6 - Client: SslOpenServer

尝试建立连接时等待 SSL。
PostgreSQL 等待事件档案
类别Client 事件SslOpenServer 版本PG 17-18 证据4 个源码位置

官方描述译文

尝试建立连接时等待 SSL。

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

历史名称:Client/SSLOpenServer (PG 13-16)

触发机制

WAIT_EVENT_SSL_OPEN_SERVER 位于 src/backend/libpq/be-secure-openssl.c:508,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:286。探针覆盖的操作是:尝试建立连接时等待 SSL。前端协议路径在套接字、TLS/GSS 或复制客户端操作即将阻塞前报告 SslOpenServer;PostgreSQL 正在等待远端或网络推进。

正常还是麻烦?

  • 正常: 空闲状态的 ClientRead 通常只是连接池存量。
  • 需要调查: 活动写入、握手、很老的 idle in transaction、连接耗尽或复制客户端停滞时需要调查。

诊断 SQL

正在等待 Client/SslOpenServer 的会话
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 = 'Client'
  AND wait_event = 'SslOpenServer'
ORDER BY query_age DESC NULLS LAST;
当前 Client 等待分布
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 = 'Client'
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 = 'Client'
  AND a.wait_event = 'SslOpenServer'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先看 state 与事务年龄,再决定它是否算负载。
  2. 关联负责的应用、连接池与网络路径。
  3. 修复消费者背压或连接池策略,不要反复终止连接。

源码证据

8.7 - Client: WaitForStandbyConfirmation

等待物理备库接收并刷写 WAL。
PostgreSQL 等待事件档案
类别Client 事件WaitForStandbyConfirmation 版本PG 17-18 证据2 个源码位置

官方描述译文

等待物理备库接收并刷写 WAL。

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

触发机制

WAIT_EVENT_WAIT_FOR_STANDBY_CONFIRMATION 位于 src/backend/replication/slot.c:3083,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:91。探针覆盖的操作是:等待物理备库接收并刷写 WAL。前端协议路径在套接字、TLS/GSS 或复制客户端操作即将阻塞前报告 WaitForStandbyConfirmation;PostgreSQL 正在等待远端或网络推进。

正常还是麻烦?

  • 正常: 空闲状态的 ClientRead 通常只是连接池存量。
  • 需要调查: 活动写入、握手、很老的 idle in transaction、连接耗尽或复制客户端停滞时需要调查。

诊断 SQL

正在等待 Client/WaitForStandbyConfirmation 的会话
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 = 'Client'
  AND wait_event = 'WaitForStandbyConfirmation'
ORDER BY query_age DESC NULLS LAST;
当前 Client 等待分布
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 = 'Client'
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 = 'Client'
  AND a.wait_event = 'WaitForStandbyConfirmation'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先看 state 与事务年龄,再决定它是否算负载。
  2. 关联负责的应用、连接池与网络路径。
  3. 修复消费者背压或连接池策略,不要反复终止连接。

源码证据

8.8 - Client: WalSenderWaitForWal

在 WAL sender 进程中等待 WAL 完成刷写。
PostgreSQL 等待事件档案
类别Client 事件WalSenderWaitForWal 版本PG 17-18 证据4 个源码位置

官方描述译文

在 WAL sender 进程中等待 WAL 完成刷写。

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

历史名称:Client/WalSenderWaitForWAL (PG 13-16)

触发机制

WAIT_EVENT_WAL_SENDER_WAIT_WAL 位于 src/backend/replication/walsender.c:1714,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event.c:289。探针覆盖的操作是:在 WAL sender 进程中等待 WAL 完成刷写。前端协议路径在套接字、TLS/GSS 或复制客户端操作即将阻塞前报告 WalSenderWaitForWal;PostgreSQL 正在等待远端或网络推进。

正常还是麻烦?

  • 正常: 空闲状态的 ClientRead 通常只是连接池存量。
  • 需要调查: 活动写入、握手、很老的 idle in transaction、连接耗尽或复制客户端停滞时需要调查。

诊断 SQL

正在等待 Client/WalSenderWaitForWal 的会话
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 = 'Client'
  AND wait_event = 'WalSenderWaitForWal'
ORDER BY query_age DESC NULLS LAST;
当前 Client 等待分布
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 = 'Client'
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 = 'Client'
  AND a.wait_event = 'WalSenderWaitForWal'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先看 state 与事务年龄,再决定它是否算负载。
  2. 关联负责的应用、连接池与网络路径。
  3. 修复消费者背压或连接池策略,不要反复终止连接。

源码证据

8.9 - Client: WalSenderWriteData

在 WAL sender 进程中处理 WAL receiver 的回复时,等待发生任何活动。
PostgreSQL 等待事件档案
类别Client 事件WalSenderWriteData 版本PG 13-18 证据2 个源码位置

官方描述译文

在 WAL sender 进程中处理 WAL receiver 的回复时,等待发生任何活动。

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

触发机制

WAIT_EVENT_WAL_SENDER_WRITE_DATA 位于 src/backend/replication/walsender.c:1653,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:93。探针覆盖的操作是:在 WAL sender 进程中处理 WAL receiver 的回复时,等待发生任何活动。前端协议路径在套接字、TLS/GSS 或复制客户端操作即将阻塞前报告 WalSenderWriteData;PostgreSQL 正在等待远端或网络推进。

正常还是麻烦?

  • 正常: 空闲状态的 ClientRead 通常只是连接池存量。
  • 需要调查: 活动写入、握手、很老的 idle in transaction、连接耗尽或复制客户端停滞时需要调查。

诊断 SQL

正在等待 Client/WalSenderWriteData 的会话
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 = 'Client'
  AND wait_event = 'WalSenderWriteData'
ORDER BY query_age DESC NULLS LAST;
当前 Client 等待分布
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 = 'Client'
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 = 'Client'
  AND a.wait_event = 'WalSenderWriteData'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 先看 state 与事务年龄,再决定它是否算负载。
  2. 关联负责的应用、连接池与网络路径。
  3. 修复消费者背压或连接池策略,不要反复终止连接。

源码证据

9 - 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 等待更重要。

9.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。

源码证据

9.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。

源码证据

9.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。

源码证据

9.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。

源码证据

9.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。

源码证据

9.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。

源码证据

9.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。

源码证据

9.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.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。

源码证据

9.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。

源码证据

9.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。

源码证据

9.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。

源码证据

9.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。

源码证据

9.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。

源码证据

9.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。

源码证据

9.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。

源码证据

9.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。

源码证据

9.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。

源码证据

9.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。

源码证据

10 - Timeout 等待

有意休眠、重试间隔、节流与限速延迟。

Timeout 通常表示 PostgreSQL 有意延迟工作,直到计时器到期。关键问题不是“内核为什么慢”,而是“哪条策略或安全机制插入了这段延迟”。

找到策略责任方

Vacuum 成本延迟、恢复延迟、备份节流、检查点摊平、重试间隔与 pg_sleep() 都是设计好的等待。当策略不再匹配服务目标,或另一瓶颈让延迟过度重复时,它们才成为问题。

  • 正常: 配置策略正在生效,而且有效工作按预期速率推进。
  • 关注: 前台延迟包含有意休眠,或维护任务大量时间都在节流而逐渐落后。
  • 紧急: 恢复/备份/检查点错过时限、spin delay 持续,或运维人员并未打算启用这条策略。

值得先认出的事件

事件 策略
VacuumDelay 基于成本的 vacuum 节流
CheckpointWriteDelay 把检查点写入摊平到整个间隔
RecoveryApplyDelay 有意延迟备库回放
RecoveryRetrieveRetryInterval 对不可用 WAL 源进行重试
BaseBackupThrottle 备份传输限速
PgSleep SQL 或内部 sleep 函数
SpinDelay 获取竞争 spinlock 时退避

常见误读

  • Timeout 不表示 statement timeout 或 lock timeout 已经触发;它表示进程此刻在计时器上休眠。
  • 减少 vacuum delay 能恢复维护吞吐,但也可能增加 I/O 与 CPU 压力。
  • RecoveryApplyDelay 可能是有意的灾备策略。
  • 持续的 SpinDelay 应当升级处理:spinlock 正常只会被持有极短时间。

10.1 - Timeout: BaseBackupThrottle

基础备份期间,因限速而等待。
PostgreSQL 等待事件档案
类别Timeout 事件BaseBackupThrottle 版本PG 13-18 证据2 个源码位置

官方描述译文

基础备份期间,因限速而等待。

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

触发机制

WAIT_EVENT_BASE_BACKUP_THROTTLE 位于 src/backend/backup/basebackup_throttle.c:178,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:175。探针覆盖的操作是:基础备份期间,因限速而等待。BaseBackupThrottle 路径有意等待计时器、重试间隔、节流或安全退避;latch 超时后才重新评估工作。

正常还是麻烦?

  • 正常: 当配置策略是有意的,而且有效工作按预期速率推进时,这项等待正常。
  • 需要调查: 策略导致维护、恢复、备份或延迟目标无法达成,或者 spin delay 持续时,应当调查。

诊断 SQL

正在等待 Timeout/BaseBackupThrottle 的会话
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 = 'Timeout'
  AND wait_event = 'BaseBackupThrottle'
ORDER BY query_age DESC NULLS LAST;
当前 Timeout 等待分布
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 = 'Timeout'
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 = 'Timeout'
  AND a.wait_event = 'BaseBackupThrottle'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认拥有该计时器的 GUC 或函数。
  2. 比较有效工作量与延迟时间。
  3. 先检查它原本要控制的 CPU、I/O 与持久性压力,再调整策略。

源码证据

10.2 - Timeout: CheckpointWriteDelay

执行检查点时,在两次写入之间等待。
PostgreSQL 等待事件档案
类别Timeout 事件CheckpointWriteDelay 版本PG 14-18 证据2 个源码位置

官方描述译文

执行检查点时,在两次写入之间等待。

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

触发机制

WAIT_EVENT_CHECKPOINT_WRITE_DELAY 位于 src/backend/postmaster/checkpointer.c:814,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:176。探针覆盖的操作是:执行检查点时,在两次写入之间等待。CheckpointWriteDelay 路径有意等待计时器、重试间隔、节流或安全退避;latch 超时后才重新评估工作。

正常还是麻烦?

  • 正常: 当配置策略是有意的,而且有效工作按预期速率推进时,这项等待正常。
  • 需要调查: 策略导致维护、恢复、备份或延迟目标无法达成,或者 spin delay 持续时,应当调查。

诊断 SQL

正在等待 Timeout/CheckpointWriteDelay 的会话
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 = 'Timeout'
  AND wait_event = 'CheckpointWriteDelay'
ORDER BY query_age DESC NULLS LAST;
当前 Timeout 等待分布
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 = 'Timeout'
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 = 'Timeout'
  AND a.wait_event = 'CheckpointWriteDelay'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认拥有该计时器的 GUC 或函数。
  2. 比较有效工作量与延迟时间。
  3. 先检查它原本要控制的 CPU、I/O 与持久性压力,再调整策略。

源码证据

10.3 - Timeout: PgSleep

因调用 pg_sleep 或同类函数而等待。
PostgreSQL 等待事件档案
类别Timeout 事件PgSleep 版本PG 13-18 证据2 个源码位置

官方描述译文

因调用 pg_sleep 或同类函数而等待。

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

触发机制

WAIT_EVENT_PG_SLEEP 位于 src/backend/utils/adt/misc.c:409,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:177。探针覆盖的操作是:因调用 pg_sleep 或同类函数而等待。PgSleep 路径有意等待计时器、重试间隔、节流或安全退避;latch 超时后才重新评估工作。

正常还是麻烦?

  • 正常: 当配置策略是有意的,而且有效工作按预期速率推进时,这项等待正常。
  • 需要调查: 策略导致维护、恢复、备份或延迟目标无法达成,或者 spin delay 持续时,应当调查。

诊断 SQL

正在等待 Timeout/PgSleep 的会话
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 = 'Timeout'
  AND wait_event = 'PgSleep'
ORDER BY query_age DESC NULLS LAST;
当前 Timeout 等待分布
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 = 'Timeout'
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 = 'Timeout'
  AND a.wait_event = 'PgSleep'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认拥有该计时器的 GUC 或函数。
  2. 比较有效工作量与延迟时间。
  3. 先检查它原本要控制的 CPU、I/O 与持久性压力,再调整策略。

源码证据

10.4 - Timeout: RecoveryApplyDelay

恢复期间,因延迟设置而等待应用 WAL。
PostgreSQL 等待事件档案
类别Timeout 事件RecoveryApplyDelay 版本PG 13-18 证据2 个源码位置

官方描述译文

恢复期间,因延迟设置而等待应用 WAL。

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

触发机制

WAIT_EVENT_RECOVERY_APPLY_DELAY 位于 src/backend/access/transam/xlogrecovery.c:3092,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:178。探针覆盖的操作是:恢复期间,因延迟设置而等待应用 WAL。RecoveryApplyDelay 路径有意等待计时器、重试间隔、节流或安全退避;latch 超时后才重新评估工作。

正常还是麻烦?

  • 正常: 当配置策略是有意的,而且有效工作按预期速率推进时,这项等待正常。
  • 需要调查: 策略导致维护、恢复、备份或延迟目标无法达成,或者 spin delay 持续时,应当调查。

诊断 SQL

正在等待 Timeout/RecoveryApplyDelay 的会话
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 = 'Timeout'
  AND wait_event = 'RecoveryApplyDelay'
ORDER BY query_age DESC NULLS LAST;
当前 Timeout 等待分布
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 = 'Timeout'
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 = 'Timeout'
  AND a.wait_event = 'RecoveryApplyDelay'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认拥有该计时器的 GUC 或函数。
  2. 比较有效工作量与延迟时间。
  3. 先检查它原本要控制的 CPU、I/O 与持久性压力,再调整策略。

源码证据

10.5 - Timeout: RecoveryRetrieveRetryInterval

恢复期间,当所有来源(pg_wal、归档或流式传输)均无 WAL 数据可用时等待。
PostgreSQL 等待事件档案
类别Timeout 事件RecoveryRetrieveRetryInterval 版本PG 13-18 证据2 个源码位置

官方描述译文

恢复期间,当所有来源(pg_wal、归档或流式传输)均无 WAL 数据可用时等待。

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

触发机制

WAIT_EVENT_RECOVERY_RETRIEVE_RETRY_INTERVAL 位于 src/backend/access/transam/xlogrecovery.c:3764,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:179。探针覆盖的操作是:恢复期间,当所有来源(pg_wal、归档或流式传输)均无 WAL 数据可用时等待。RecoveryRetrieveRetryInterval 路径有意等待计时器、重试间隔、节流或安全退避;latch 超时后才重新评估工作。

正常还是麻烦?

  • 正常: 当配置策略是有意的,而且有效工作按预期速率推进时,这项等待正常。
  • 需要调查: 策略导致维护、恢复、备份或延迟目标无法达成,或者 spin delay 持续时,应当调查。

诊断 SQL

正在等待 Timeout/RecoveryRetrieveRetryInterval 的会话
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 = 'Timeout'
  AND wait_event = 'RecoveryRetrieveRetryInterval'
ORDER BY query_age DESC NULLS LAST;
当前 Timeout 等待分布
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 = 'Timeout'
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 = 'Timeout'
  AND a.wait_event = 'RecoveryRetrieveRetryInterval'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认拥有该计时器的 GUC 或函数。
  2. 比较有效工作量与延迟时间。
  3. 先检查它原本要控制的 CPU、I/O 与持久性压力,再调整策略。

源码证据

10.6 - Timeout: RegisterSyncRequest

由于请求队列已满,在向 checkpointer 发送同步请求时等待。
PostgreSQL 等待事件档案
类别Timeout 事件RegisterSyncRequest 版本PG 13-18 证据2 个源码位置

官方描述译文

由于请求队列已满,在向 checkpointer 发送同步请求时等待。

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

触发机制

WAIT_EVENT_REGISTER_SYNC_REQUEST 位于 src/backend/storage/sync/sync.c:615,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:180。探针覆盖的操作是:由于请求队列已满,在向 checkpointer 发送同步请求时等待。RegisterSyncRequest 路径有意等待计时器、重试间隔、节流或安全退避;latch 超时后才重新评估工作。

正常还是麻烦?

  • 正常: 当配置策略是有意的,而且有效工作按预期速率推进时,这项等待正常。
  • 需要调查: 策略导致维护、恢复、备份或延迟目标无法达成,或者 spin delay 持续时,应当调查。

诊断 SQL

正在等待 Timeout/RegisterSyncRequest 的会话
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 = 'Timeout'
  AND wait_event = 'RegisterSyncRequest'
ORDER BY query_age DESC NULLS LAST;
当前 Timeout 等待分布
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 = 'Timeout'
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 = 'Timeout'
  AND a.wait_event = 'RegisterSyncRequest'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认拥有该计时器的 GUC 或函数。
  2. 比较有效工作量与延迟时间。
  3. 先检查它原本要控制的 CPU、I/O 与持久性压力,再调整策略。

源码证据

10.7 - Timeout: SpinDelay

获取发生争用的 spinlock 时等待。
PostgreSQL 等待事件档案
类别Timeout 事件SpinDelay 版本PG 16-18 证据2 个源码位置

官方描述译文

获取发生争用的 spinlock 时等待。

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

触发机制

WAIT_EVENT_SPIN_DELAY 位于 src/backend/storage/lmgr/s_lock.c:148,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:181。探针覆盖的操作是:获取发生争用的 spinlock 时等待。SpinDelay 路径有意等待计时器、重试间隔、节流或安全退避;latch 超时后才重新评估工作。

正常还是麻烦?

  • 正常: 当配置策略是有意的,而且有效工作按预期速率推进时,这项等待正常。
  • 需要调查: 策略导致维护、恢复、备份或延迟目标无法达成,或者 spin delay 持续时,应当调查。

诊断 SQL

正在等待 Timeout/SpinDelay 的会话
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 = 'Timeout'
  AND wait_event = 'SpinDelay'
ORDER BY query_age DESC NULLS LAST;
当前 Timeout 等待分布
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 = 'Timeout'
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 = 'Timeout'
  AND a.wait_event = 'SpinDelay'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认拥有该计时器的 GUC 或函数。
  2. 比较有效工作量与延迟时间。
  3. 先检查它原本要控制的 CPU、I/O 与持久性压力,再调整策略。

源码证据

10.8 - Timeout: VacuumDelay

在基于成本的 vacuum 延迟点等待。
PostgreSQL 等待事件档案
类别Timeout 事件VacuumDelay 版本PG 13-18 证据2 个源码位置

官方描述译文

在基于成本的 vacuum 延迟点等待。

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

触发机制

WAIT_EVENT_VACUUM_DELAY 位于 src/backend/commands/vacuum.c:2495,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:182。探针覆盖的操作是:在基于成本的 vacuum 延迟点等待。VacuumDelay 路径有意等待计时器、重试间隔、节流或安全退避;latch 超时后才重新评估工作。

正常还是麻烦?

  • 正常: 当配置策略是有意的,而且有效工作按预期速率推进时,这项等待正常。
  • 需要调查: 策略导致维护、恢复、备份或延迟目标无法达成,或者 spin delay 持续时,应当调查。

诊断 SQL

正在等待 Timeout/VacuumDelay 的会话
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 = 'Timeout'
  AND wait_event = 'VacuumDelay'
ORDER BY query_age DESC NULLS LAST;
当前 Timeout 等待分布
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 = 'Timeout'
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 = 'Timeout'
  AND a.wait_event = 'VacuumDelay'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认拥有该计时器的 GUC 或函数。
  2. 比较有效工作量与延迟时间。
  3. 先检查它原本要控制的 CPU、I/O 与持久性压力,再调整策略。

源码证据

10.9 - Timeout: VacuumTruncate

等待获取独占锁,以截去正在执行 vacuum 的表末尾所有空页。
PostgreSQL 等待事件档案
类别Timeout 事件VacuumTruncate 版本PG 15-18 证据2 个源码位置

官方描述译文

等待获取独占锁,以截去正在执行 vacuum 的表末尾所有空页。

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

触发机制

WAIT_EVENT_VACUUM_TRUNCATE 位于 src/backend/access/heap/vacuumlazy.c:3280,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:183。探针覆盖的操作是:等待获取独占锁,以截去正在执行 vacuum 的表末尾所有空页。VacuumTruncate 路径有意等待计时器、重试间隔、节流或安全退避;latch 超时后才重新评估工作。

正常还是麻烦?

  • 正常: 当配置策略是有意的,而且有效工作按预期速率推进时,这项等待正常。
  • 需要调查: 策略导致维护、恢复、备份或延迟目标无法达成,或者 spin delay 持续时,应当调查。

诊断 SQL

正在等待 Timeout/VacuumTruncate 的会话
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 = 'Timeout'
  AND wait_event = 'VacuumTruncate'
ORDER BY query_age DESC NULLS LAST;
当前 Timeout 等待分布
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 = 'Timeout'
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 = 'Timeout'
  AND a.wait_event = 'VacuumTruncate'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认拥有该计时器的 GUC 或函数。
  2. 比较有效工作量与延迟时间。
  3. 先检查它原本要控制的 CPU、I/O 与持久性压力,再调整策略。

源码证据

10.10 - Timeout: WalSummarizerError

WAL summarizer 出错后等待。
PostgreSQL 等待事件档案
类别Timeout 事件WalSummarizerError 版本PG 17-18 证据2 个源码位置

官方描述译文

WAL summarizer 出错后等待。

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

触发机制

WAIT_EVENT_WAL_SUMMARIZER_ERROR 位于 src/backend/postmaster/walsummarizer.c:337,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:184。探针覆盖的操作是:WAL summarizer 出错后等待。WalSummarizerError 路径有意等待计时器、重试间隔、节流或安全退避;latch 超时后才重新评估工作。

正常还是麻烦?

  • 正常: 当配置策略是有意的,而且有效工作按预期速率推进时,这项等待正常。
  • 需要调查: 策略导致维护、恢复、备份或延迟目标无法达成,或者 spin delay 持续时,应当调查。

诊断 SQL

正在等待 Timeout/WalSummarizerError 的会话
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 = 'Timeout'
  AND wait_event = 'WalSummarizerError'
ORDER BY query_age DESC NULLS LAST;
当前 Timeout 等待分布
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 = 'Timeout'
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 = 'Timeout'
  AND a.wait_event = 'WalSummarizerError'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 确认拥有该计时器的 GUC 或函数。
  2. 比较有效工作量与延迟时间。
  3. 先检查它原本要控制的 CPU、I/O 与持久性压力,再调整策略。

源码证据

11 - BufferPin 等待

后端需要独占缓冲区 pin,但另一个后端仍持有 pin。

BufferPin 类只有一个核心事件,也叫 BufferPin。它表示 PostgreSQL 需要独占访问某个共享缓冲区,但另一个后端仍钉住该页,使其不能被移除或进行结构修改。

持续出现就值得怀疑

执行器检查页面时,pin 很正常而且生命周期很短。持续的独占 pin 等待并不常见,可能来自另一个会话保持游标打开、执行器停在某页,或并发索引工作需要删除/回收该页。

  • 正常: 扫描或索引维护期间孤立的亚秒级样本。
  • 关注: 同一前台会话在 BufferPin 上停留超过一秒。
  • 紧急: 大量会话排队、索引清理/DDL 无法推进,或持有游标的会话空闲却仍握着 pin。

应该检查什么

  1. 确认等待查询及其关系锁。
  2. 查找长游标、idle in transaction,以及访问同一关系的执行器会话。
  3. 把事件开始时间与 VACUUM、索引删除/回收、DDL 或长扫描关联。
  4. 取消任何会话前,先保全持有者的查询与事务上下文。

常见误读

  • Buffer pin 不是重量级锁,在 pg_locks 中没有直接的持有者行。
  • 调大 shared_buffers 不能让已持有的 pin 消失。
  • 等待者可能是 vacuum/索引维护,而持有 pin 的应用会话看起来毫不起眼。

11.1 - BufferPin: BufferPin

等待获取 buffer 上的独占 pin。
PostgreSQL 等待事件档案
类别BufferPin 事件BufferPin 版本PG 13-18 证据2 个源码位置

官方描述译文

等待获取 buffer 上的独占 pin。

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

触发机制

WAIT_EVENT_BUFFER_PIN 位于 src/backend/storage/buffer/bufmgr.c:5819,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:286。探针覆盖的操作是:等待获取 buffer 上的独占 pin。缓冲区管理器需要独占 pin,但另一个后端仍在同一共享缓冲区上持有 pin;当前后端会休眠到最后一个冲突 pin 被释放。

正常还是麻烦?

  • 正常: 扫描或索引维护期间,孤立的亚秒级样本可能正常。
  • 需要调查: 等待超过一秒就值得怀疑,尤其要检查游标或空闲事务是否持续钉住页面。

诊断 SQL

正在等待 BufferPin/BufferPin 的会话
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 = 'BufferPin'
  AND wait_event = 'BufferPin'
ORDER BY query_age DESC NULLS LAST;
当前 BufferPin 等待分布
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 = 'BufferPin'
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 = 'BufferPin'
  AND a.wait_event = 'BufferPin'
ORDER BY a.pid, l.granted, l.locktype, l.mode;

处置建议

  1. 保全等待查询与关系上下文。
  2. 查找访问同一关系的长游标与 idle in transaction 会话。
  3. 确认最安全的持有者或维护受害者后再取消。

源码证据

12 - 扩展等待事件

PostgreSQL 扩展如何注册并报告自定义等待名称,以及它们为什么不进入核心大典。

PostgreSQL 为扩展代码报告的等待保留了 Extension 类型。内置清单中包含通用的 Extension 身份;较新版本还提供 API,让扩展注册人类可读的自定义名称。

本大典的边界

本站枚举 PostgreSQL 13–18 随核心发布的名称,不会试图穷举第三方扩展在运行时创建的名称,因为它取决于已加载二进制,同一版本的不同集群也可能不同。

看到扩展定义的等待时:

  1. 记录 extversion 与扩展包的精确构建版本。
  2. 在 PG17+ 查询本机 pg_wait_events;它是该实例已注册名称的权威来源。
  3. 在扩展源码中搜索注册调用,以及配对的 pgstat_report_wait_start() / pgstat_report_wait_end()
  4. 用扩展自身 runbook 判断正常/异常;PostgreSQL 核心描述无法替它给出边界。
已安装扩展与扩展等待
SELECT e.extname, e.extversion
FROM pg_extension AS e
ORDER BY e.extname;

SELECT type, name, description
FROM pg_wait_events
WHERE type = 'Extension'
ORDER BY name;
说明

pg_wait_events 从 PostgreSQL 17 开始提供。在 PG13–16 上,应从 pg_stat_activity 取得等待名称,再直接检查扩展版本与源码。

给扩展作者的安全契约

在阻塞操作紧前方报告等待,并保证包括错误在内的每条退出路径都会清除状态。名称应足够稳定,能被仪表盘与 runbook 引用;同时说明哪个资源或对端能够推进。没有这种责任契约的自定义名称只是可观测性债务。

13 - 关联 GUC

等待事件处置建议引用的配置控制项。

等待事件处置建议引用的配置控制项。 本索引包含 21 个条目.

13.1 - [[guc:autovacuum_freeze_max_age]]

触发防回卷 vacuum 的事务年龄。

触发防回卷 vacuum 的事务年龄。

PostgreSQL 18 官方参数参考

被哪些等待事件引用

13.2 - [[guc:autovacuum_multixact_freeze_max_age]]

触发 multixact 防回卷 vacuum 的年龄。

触发 multixact 防回卷 vacuum 的年龄。

PostgreSQL 18 官方参数参考

被哪些等待事件引用

13.3 - [[guc:autovacuum_naptime]]

autovacuum launcher 对每个数据库两轮调度之间的最短间隔。

autovacuum launcher 对每个数据库两轮调度之间的最短间隔。

PostgreSQL 18 官方参数参考

被哪些等待事件引用

13.5 - [[guc:deadlock_timeout]]

PostgreSQL 对锁等待执行死锁检查前的延迟。

PostgreSQL 对锁等待执行死锁检查前的延迟。

PostgreSQL 18 官方参数参考

被哪些等待事件引用

13.6 - [[guc:full_page_writes]]

控制检查点后用于崩溃安全的全页镜像。

控制检查点后用于崩溃安全的全页镜像。

PostgreSQL 18 官方参数参考

被哪些等待事件引用

13.7 - [[guc:idle_in_transaction_session_timeout]]

终止在打开事务中空闲过久的会话。

终止在打开事务中空闲过久的会话。

PostgreSQL 18 官方参数参考

被哪些等待事件引用

13.8 - [[guc:lock_timeout]]

中止等待获取锁时间过长的语句。

中止等待获取锁时间过长的语句。

PostgreSQL 18 官方参数参考

被哪些等待事件引用

13.10 - [[guc:max_locks_per_transaction]]

每个事务在共享锁表中的容量预算。

每个事务在共享锁表中的容量预算。

PostgreSQL 18 官方参数参考

被哪些等待事件引用

13.11 - [[guc:max_parallel_workers_per_gather]]

每个 Gather/Gather Merge 节点可用的最大并行 worker 数。

每个 Gather/Gather Merge 节点可用的最大并行 worker 数。

PostgreSQL 18 官方参数参考

被哪些等待事件引用

13.13 - [[guc:shared_buffers]]

PostgreSQL 共享缓冲区缓存大小。

PostgreSQL 共享缓冲区缓存大小。

PostgreSQL 18 官方参数参考

被哪些等待事件引用

13.15 - [[guc:synchronous_standby_names]]

选择能够满足同步提交的备库。

选择能够满足同步提交的备库。

PostgreSQL 18 官方参数参考

被哪些等待事件引用

13.16 - [[guc:vacuum_freeze_table_age]]

VACUUM 开始为冻结而扫描的表年龄。

VACUUM 开始为冻结而扫描的表年龄。

PostgreSQL 18 官方参数参考

被哪些等待事件引用

13.17 - [[guc:vacuum_multixact_freeze_table_age]]

VACUUM 开始为 multixact 冻结而扫描的表年龄。

VACUUM 开始为 multixact 冻结而扫描的表年龄。

PostgreSQL 18 官方参数参考

被哪些等待事件引用

13.19 - [[guc:wal_sender_timeout]]

超时后断开无活动的复制连接。

超时后断开无活动的复制连接。

PostgreSQL 18 官方参数参考

被哪些等待事件引用

13.20 - [[guc:wal_writer_delay]]

WAL writer 两轮活动之间的延迟。

WAL writer 两轮活动之间的延迟。

PostgreSQL 18 官方参数参考

被哪些等待事件引用

13.21 - [[guc:wal_writer_flush_after]]

WAL writer 请求刷盘前累计写入的 WAL 量。

WAL writer 请求刷盘前累计写入的 WAL 量。

PostgreSQL 18 官方参数参考

被哪些等待事件引用

14 - 关联指标

用于判断等待正常还是有害的观测信号。

用于判断等待正常还是有害的观测信号。 本索引包含 22 个条目.

14.2 - [[metric:blocked_sessions]]

存在一个或多个阻塞 PID 的会话数。

存在一个或多个阻塞 PID 的会话数。

被哪些等待事件引用

14.3 - [[metric:blocks_read]]

按数据库或语句统计的关系块读取量。

按数据库或语句统计的关系块读取量。

被哪些等待事件引用

14.4 - [[metric:buffer_hit_ratio]]

从 shared buffers 命中的块与实际读取块的比例。

从 shared buffers 命中的块与实际读取块的比例。

被哪些等待事件引用

14.6 - [[metric:commit_latency]]

事务提交的端到端延迟。

事务提交的端到端延迟。

被哪些等待事件引用

14.7 - [[metric:io_read_time]]

来自 pg_stat_io 或操作系统遥测的读取延迟。

来自 pg_stat_io 或操作系统遥测的读取延迟。

被哪些等待事件引用

14.8 - [[metric:io_write_time]]

来自 pg_stat_io 或操作系统遥测的写入延迟。

来自 pg_stat_io 或操作系统遥测的写入延迟。

被哪些等待事件引用

14.9 - [[metric:locks_per_backend]]

按后端分组的 pg_locks 行数。

按后端分组的 pg_locks 行数。

被哪些等待事件引用

14.10 - [[metric:multixact_member_io]]

multixact member 存储的读写量。

multixact member 存储的读写量。

被哪些等待事件引用

14.11 - [[metric:oldest_multixact_age]]

仍需保留的最老 multixact 年龄。

仍需保留的最老 multixact 年龄。

被哪些等待事件引用

14.13 - [[metric:replication_flush_lag]]

主库 WAL 与备库 flush 位置之间的距离或时间。

主库 WAL 与备库 flush 位置之间的距离或时间。

被哪些等待事件引用

14.14 - [[metric:statement_latency]]

与该等待相关语句的延迟分布。

与该等待相关语句的延迟分布。

被哪些等待事件引用

14.15 - [[metric:statement_wal_bytes]]

启用 pg_stat_statements WAL 统计时归属于语句的 WAL 字节数。

启用 pg_stat_statements WAL 统计时归属于语句的 WAL 字节数。

被哪些等待事件引用

14.16 - [[metric:wait_event_share]]

重复活动会话采样中归属于某事件的比例。

重复活动会话采样中归属于某事件的比例。

被哪些等待事件引用

14.17 - [[metric:waiting_sessions]]

按等待类型与事件分组的当前会话数。

按等待类型与事件分组的当前会话数。

被哪些等待事件引用

14.19 - [[metric:wal_fpi]]

WAL 中生成的全页镜像数。

WAL 中生成的全页镜像数。

被哪些等待事件引用

14.20 - [[metric:wal_sync_time]]

把 WAL 同步到持久存储所花时间。

把 WAL 同步到持久存储所花时间。

被哪些等待事件引用

14.22 - [[metric:xact_slru_io]]

事务状态 SLRU 的读写量。

事务状态 SLRU 的读写量。

被哪些等待事件引用