选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

文档 / 等待事件 / 轻量级锁

WAIT EVENT · LWLOCK轻量级锁

LWLockSInvalRead

等待从共享目录失效队列中检索消息。

Waiting to retrieve messages from the shared catalog invalidation queue

轻量级锁 引入 9.6(机制起点) 现存至 20 devel 2 次变动 动态触发图谱档案

类型
轻量级锁
引入版本
9.6(机制起点)
版本状态
当前稳定版
覆盖版本
12 个 · 9.6 – 20
触发路径
动态触发
实测发行版
18.6
名称变动
曾用名 SInvalReadLock · 曾属 LWLockNamed
手册章节
监控统计

PostgreSQL 18 手册 官方文档 源码 wait.pg.center

版本轨迹

相对 PostgreSQL 17 无变化。

各版本描述

相邻版本里类型、名称与英文描述都相同的合并成一段,旧的在前。中文取自图谱或本站手册译文,没有译文的只给英文原文。

  1. 9.6

    LWLockNamedSInvalReadLock曾用名

    等待从共享失效队列中取出或移除消息。

    Waiting to retrieve or remove messages from shared invalidation queue.

  2. 1012

    LWLockSInvalReadLock曾用名

    等待从共享失效队列中取出或移除消息。

    Waiting to retrieve or remove messages from shared invalidation queue.

  3. 1320

    LWLockSInvalRead

    等待从共享目录失效队列中检索消息。

    Waiting to retrieve messages from the shared catalog invalidation queue.

触发机制

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

pgstat_report_wait_start at src/backend/storage/lmgr/lwlock.c:739 is the grep-verified reporting path. The public identity/resource is mapped at src/backend/storage/ipc/sinvaladt.c:497. The instrumented operation is: Waiting to retrieve messages from the shared catalog invalidation queue. LWLockAcquire could not immediately take the lightweight-lock tranche displayed as SInvalRead. The generic LWLock reporter publishes the tranche name while the backend sleeps on the internal shared-memory resource.

通常正常

短暂内部临界区周围的零星样本属于正常。

A brief sample is normal around short internal critical sections.

值得警惕

若同一 tranche 在连续三次一秒采样中影响至少 10% 的活动前台会话,应当调查;达到 25% 或持续超过五秒按紧急处理。

Investigate when the same tranche affects at least 10% of active foreground sessions in three consecutive one-second samples; treat 25% or waits beyond five seconds as urgent.

诊断 SQL

直接在 psql 里跑;标注的是语句里用到的视图与列所要求的最低版本。

正在等待 LWLock/SInvalRead 的会话Sessions waiting on LWLock/SInvalRead

PG ≥ 13
SELECT pid, backend_type, usename, datname, application_name,
       state, now() - query_start AS query_age,
       now() - xact_start AS xact_age,
       wait_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 等待分布Current LWLock cohort

PG ≥ 13
SELECT wait_event, count(*) AS waiting_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;

这些会话的锁与关系上下文Lock and relation context for these sessions

PG ≥ 13
SELECT a.pid, l.locktype, l.mode, l.granted, l.fastpath,
       d.datname, n.nspname, c.relname,
       l.page, l.tuple, l.virtualxid, l.transactionid,
       l.classid, l.objid, l.objsubid
FROM pg_stat_activity AS a
LEFT JOIN pg_locks AS l ON l.pid = a.pid
LEFT JOIN pg_database AS d ON d.oid = l.database
LEFT JOIN pg_class AS c
  ON c.oid = l.relation
 AND l.database = (
       SELECT 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. 降低具体竞争源;增加并发可能让共享内存热点更糟。
英文原文
  1. Repeat the snapshot and isolate one hot tranche.
  2. Correlate it with the protected resource and current workload phase.
  3. Reduce the specific contention source; adding concurrency can make a shared-memory hotspot worse.

相关参数与指标

waiting_sessionswait_event_share

源码证据

图谱在各版本源码树里核对到的位置,新的在前。「触发点」是真正上报等待事件的调用处,「目录定义」只说明这个名字在枚举里存在。

PostgreSQL 18REL_18_6

演化历史

相邻两个大版本之间的差异,新的在前。版本号链到该版的变动清单。

  1. PostgreSQL 13 ← 12 更名

    更名 SInvalReadLockSInvalRead 描述措辞更新

    等待从共享目录失效队列中检索消息。

    描述前后对照
    Waiting to retrieve or remove messages from shared invalidation queue. Waiting to retrieve messages from the shared catalog invalidation queue.
  2. PostgreSQL 10 ← 9.6 类型变动

    类型 LWLockNamedLWLock

    等待从共享失效队列中取出或移除消息。

  3. PostgreSQL 9.6 新增此事件

    9.6 引入等待事件机制,此为本事件的首个版本

    等待从共享失效队列中取出或移除消息。

同类事件

事件 引入 版本变动 最近变动
LWLOCK 轻量级锁 92 个
AddinShmemInit档案 9.6起点 132 次
等待管理扩展在共享内存中的空间分配。曾用名 AddinShmemInitLock 现存
AioUringCompletion档案 18
等待另一个进程通过 io_uring 完成 I/O。 现存
AioWorkerControl 19
等待更新 AIO 工作进程信息。 现存
AioWorkerSubmissionQueue档案 18
等待访问 AIO worker 提交队列。 现存
AutoFile档案 9.6起点 132 次
等待更新 postgresql.auto.conf 文件。曾用名 AutoFileLock 现存
Autovacuum档案 9.6起点 132 次
等待读取或更新 autovacuum worker 的当前状态。曾用名 AutovacuumLock 现存
AutovacuumSchedule档案 9.6起点 132 次
等待确认被选中进行 autovacuum 的表仍需要 vacuum。曾用名 AutovacuumScheduleLock 现存
BackendRandomLock 10
等待生成随机数。 于 12 移除
BackgroundWorker档案 9.6起点 132 次
等待读取或更新后台 worker 的状态。曾用名 BackgroundWorkerLock 现存
BtreeVacuum档案 9.6起点 132 次
等待读取或更新 B-tree 索引中与 vacuum 相关的信息。曾用名 BtreeVacuumLock 现存
BufferContent档案 9.6起点 132 次
等待访问内存中的数据页。曾用名 buffer_content 于 19 移除
BufferMapping档案 9.6起点 132 次
等待将数据块关联到 buffer pool 中的 buffer。曾用名 buffer_mapping 现存
Checkpoint档案 9.6起点 132 次
等待开始执行检查点。曾用名 CheckpointLock 于 14 移除
CheckpointerComm档案 9.6起点 132 次
等待管理 fsync 请求。曾用名 CheckpointerCommLock 现存
CommitTs档案 9.6起点 132 次
等待读取或更新事务提交时间戳的最近设定值。曾用名 CommitTsLock 现存
CommitTsBuffer档案 9.6起点 132 次
等待事务提交时间戳 SLRU buffer 上的 I/O。曾用名 commit_timestamp 现存
CommitTsSLRU档案 9.6起点 132 次
等待访问事务提交时间戳 SLRU 缓存。曾用名 CommitTsControlLock 现存
ControlFile档案 9.6起点 132 次
等待读取或更新 pg_control 文件,或创建新的 WAL 文件。曾用名 ControlFileLock 现存
DataChecksumsWorker 19
等待数据校验和工作进程。 现存
DSMRegistry档案 17
等待读取或更新动态共享内存注册表。 现存
DSMRegistryDSA档案 17
等待访问动态共享内存注册表的动态共享内存分配器。 现存
DSMRegistryHash档案 17
等待访问动态共享内存注册表的共享哈希表。 现存
DynamicSharedMemoryControl档案 9.6起点 132 次
等待读取或更新动态共享内存分配信息。曾用名 DynamicSharedMemoryControlLock 现存
InjectionPoint档案 17
等待读取或更新与注入点相关的信息。 现存
LockFastPath档案 9.6起点 132 次
等待读取或更新进程的快速路径锁信息。曾用名 proc 现存
LockManager档案 9.6起点 194 次
等待读取或更新“重量级”锁的信息。曾用名 lock_manager 现存
LogicalDecodingControl 19
等待读取或更新逻辑解码状态信息。 现存
LogicalRepLauncherDSA档案 16
等待访问逻辑复制 launcher 的动态共享内存分配器。 现存
LogicalRepLauncherHash档案 16
等待访问逻辑复制 launcher 的共享哈希表。 现存
LogicalRepWorker档案 10 131 次
等待读取或更新逻辑复制 worker 的状态。曾用名 LogicalRepWorkerLock 现存
MultiXactGen档案 9.6起点 132 次
等待读取或更新共享 multixact 状态。曾用名 MultiXactGenLock 现存
MultiXactMemberBuffer档案 9.6起点 132 次
等待 multixact member SLRU buffer 上的 I/O。曾用名 multixact_member 现存
MultiXactMemberSLRU档案 9.6起点 132 次
等待访问 multixact member SLRU 缓存。曾用名 MultiXactMemberControlLock 现存
MultiXactOffsetBuffer档案 9.6起点 132 次
等待 multixact offset SLRU buffer 上的 I/O。曾用名 multixact_offset 现存
MultiXactOffsetSLRU档案 9.6起点 132 次
等待访问 multixact offset SLRU 缓存。曾用名 MultiXactOffsetControlLock 现存
MultiXactTruncation档案 9.6起点 132 次
等待读取或截断 multixact 信息。曾用名 MultiXactTruncationLock 现存
NotifyBuffer档案 9.6起点 132 次
等待 NOTIFY 消息 SLRU buffer 上的 I/O。曾用名 async 现存
NotifyChannelHash 19
等待访问 NOTIFY 通道哈希表。 现存
NotifyQueue档案 9.6起点 132 次
等待读取或更新 NOTIFY 消息。曾用名 AsyncQueueLock 现存
NotifyQueueTail档案 9.6起点 132 次
等待更新 NOTIFY 消息的存储上限。曾用名 NotifyQueueTailLock 现存
NotifySLRU档案 9.6起点 132 次
等待访问 NOTIFY 消息 SLRU 缓存。曾用名 AsyncCtlLock 现存
OidGen档案 9.6起点 132 次
等待分配新的 OID。曾用名 OidGenLock 现存
OldSnapshotTimeMap档案 9.6起点 132 次
等待读取或更新旧快照控制信息。曾用名 OldSnapshotTimeMapLock 于 17 移除
ParallelAppend档案 11 131 次
执行 Parallel Append 计划期间,等待选择下一个子计划。曾用名 parallel_append 现存
ParallelBtreeScan档案 18
执行 Parallel B-tree Scan 计划期间,等待同步 worker。 现存
ParallelHashJoin档案 11 131 次
执行 Parallel Hash Join 计划期间,等待同步 worker。曾用名 parallel_hash_join 现存
ParallelQueryDSA档案 10 131 次
等待并行查询的动态共享内存分配。曾用名 parallel_query_dsa 现存
ParallelVacuumDSA档案 17
等待并行 vacuum 的动态共享内存分配。 现存
PerSessionDSA档案 13
等待并行查询的动态共享内存分配。 现存
PerSessionRecordType档案 13
等待访问并行查询的复合类型信息。 现存
PerSessionRecordTypmod档案 13
等待访问并行查询中用于标识匿名 record 类型的类型修饰符信息。 现存
PerXactPredicateList档案 12 131 次
并行查询期间,等待访问当前可串行化事务所持有的谓词锁列表。曾用名 serializable_xact 现存
PgStatsData档案 15
等待访问共享内存中的统计数据。 现存
PgStatsDSA档案 15
等待访问统计信息的动态共享内存分配器。 现存
PgStatsHash档案 15
等待访问统计信息的共享内存哈希表。 现存
PredicateLockManager档案 9.6起点 132 次
等待访问可串行化事务使用的谓词锁信息。曾用名 predicate_lock_manager 现存
ProcArray档案 9.6起点 132 次
等待访问共享的进程级数据结构(通常用于获取快照或报告会话的事务 ID)。曾用名 ProcArrayLock 现存
RelationMapping档案 9.6起点 132 次
等待读取或更新 pg_filenode.map 文件(用于跟踪某些系统目录的 filenode 分配)。曾用名 RelationMappingLock 现存
RelCacheInit档案 9.6起点 132 次
等待读取或更新 pg_internal.init relation cache 初始化文件。曾用名 RelCacheInitLock 现存
ReplicationOrigin档案 9.6起点 132 次
等待创建、删除或使用复制源。曾用名 ReplicationOriginLock 现存
ReplicationOriginState档案 9.6起点 132 次
等待读取或更新一个复制源的进度。曾用名 replication_origin 现存
ReplicationSlotAllocation档案 9.6起点 132 次
等待分配或释放复制槽。曾用名 ReplicationSlotAllocationLock 现存
ReplicationSlotControl档案 9.6起点 132 次
等待读取或更新复制槽状态。曾用名 ReplicationSlotControlLock 现存
ReplicationSlotIO档案 9.6起点 132 次
等待复制槽上的 I/O。曾用名 replication_slot_io 现存
SerialBuffer档案 9.6起点 133 次
等待可串行化事务冲突 SLRU buffer 上的 I/O。曾用名 oldserxid 现存
SerialControl档案 17
等待读取或更新共享的 pg_serial 状态。 现存
SerializableFinishedList档案 9.6起点 132 次
等待访问已结束的可串行化事务列表。曾用名 SerializableFinishedListLock 现存
SerializablePredicateList档案 9.6起点 132 次
等待访问可串行化事务所持有的谓词锁列表。曾用名 SerializablePredicateLockListLock 现存
SerializableXactHash档案 9.6起点 132 次
等待读取或更新可串行化事务的信息。曾用名 SerializableXactHashLock 现存
SerialSLRU档案 9.6起点 132 次
等待访问可串行化事务冲突 SLRU 缓存。曾用名 OldSerXidLock 现存
SharedTidBitmap档案 10 131 次
并行 bitmap index scan 期间,等待访问共享 TID bitmap。曾用名 tbm 现存
SharedTupleStore档案 13
并行查询期间,等待访问共享 tuple store。 现存
ShmemIndex档案 9.6起点 132 次
等待在共享内存中查找或分配空间。曾用名 ShmemIndexLock 现存
SInvalRead档案 9.6起点 132 次
等待从共享系统目录失效队列中取出消息。曾用名 SInvalReadLock 现存
SInvalWrite档案 9.6起点 132 次
等待向共享系统目录失效队列中添加消息。曾用名 SInvalWriteLock 现存
SubtransBuffer档案 9.6起点 132 次
等待子事务 SLRU buffer 上的 I/O。曾用名 subtrans 现存
SubtransSLRU档案 9.6起点 132 次
等待访问子事务 SLRU 缓存。曾用名 SubtransControlLock 现存
SyncRep档案 9.6起点 132 次
等待读取或更新同步复制状态信息。曾用名 SyncRepLock 现存
SyncScan档案 9.6起点 132 次
等待选择同步表扫描的起始位置。曾用名 SyncScanLock 现存
TablespaceCreate档案 9.6起点 132 次
等待创建或删除表空间。曾用名 TablespaceCreateLock 现存
TwoPhaseState档案 9.6起点 132 次
等待读取或更新预备事务的状态。曾用名 TwoPhaseStateLock 现存
WaitEventCustom档案 17
等待读取或更新自定义等待事件信息。 现存
WaitLSN 19
等待读取或更新共享的 LSN 等待状态。 现存
WALBufMapping档案 9.6起点 132 次
等待替换 WAL buffer 中的页面。曾用名 WALBufMappingLock 现存
WALInsert档案 9.6起点 132 次
等待将 WAL 数据插入内存 buffer。曾用名 wal_insert 现存
WALSummarizer档案 17
等待读取或更新 WAL 汇总状态。 现存
WALWrite档案 9.6起点 132 次
等待将 WAL buffer 写入磁盘。曾用名 WALWriteLock 现存
WrapLimitsVacuum档案 9.6起点 132 次
等待更新事务 ID 和 multixact 的消耗上限。曾用名 WrapLimitsVacuumLock 现存
XactBuffer档案 9.6起点 132 次
等待事务状态 SLRU buffer 上的 I/O。曾用名 clog 现存
XactSLRU档案 9.6起点 132 次
等待访问事务状态 SLRU 缓存。曾用名 CLogControlLock 现存
XactTruncation档案 10 131 次
等待执行 pg_xact_status,或更新当前进程可用的最旧事务 ID。曾用名 CLogTruncationLock 现存
XidGen档案 9.6起点 132 次
等待分配新的事务 ID。曾用名 XidGenLock 现存