WAIT EVENT · LWLOCK轻量级锁
LWLockLockManager
等待读取或更新有关“重量级”锁的信息。
Waiting to read or update information about "heavyweight" locks
轻量级锁 引入 9.6(机制起点) 现存至 20 devel 4 次变动 动态触发图谱档案
版本轨迹
相对 PostgreSQL 17 无变化。
各版本描述
相邻版本里类型、名称与英文描述都相同的合并成一段,旧的在前。中文取自图谱或本站手册译文,没有译文的只给英文原文。
-
9.6
LWLockTranchelock_manager曾用名等待添加或检查后端的锁,或者等待加入或退出锁组(用于并行查询)。
Waiting to add or examine locks for backends, or waiting to join or exit a locking group (used by parallel query).
-
1012
LWLocklock_manager曾用名等待添加或检查后端的锁,或者等待加入或退出锁组(用于并行查询)。
Waiting to add or examine locks for backends, or waiting to join or exit a locking group (used by parallel query).
-
1316
LWLockLockManager等待读取或更新有关“重量级”锁的信息。
Waiting to read or update information about “heavyweight” locks.
-
1718
LWLockLockManager等待读取或更新有关“重量级”锁的信息。
Waiting to read or update information about "heavyweight" locks
-
1920
LWLockLockManager等待读取或更新有关“重量级”锁的信息。
Waiting to read or update information about “heavyweight” locks.
触发机制
重量级锁的账本存放在由 LockHashPartitionLock 分区保护的共享哈希表中。获取、授予、释放或检查大量重量级锁时,即使不存在 SQL 层锁冲突,也可能在分区锁上竞争。
Heavyweight lock bookkeeping is stored in shared hash tables partitioned by LockHashPartitionLock. Acquiring, granting, releasing, or inspecting many heavyweight locks can contend on the partition even when no SQL-level lock conflict exists.
通常正常
普通关系锁与事务锁流量会带来小规模突发。
Small bursts accompany ordinary relation and transaction lock traffic.
值得警惕
持续占比通常来自锁扇出:超大事务、大量分区、频繁 DDL,或成千上万的排队锁请求。
A sustained share often follows lock fan-out: very large transactions, many partitions, DDL churn, or thousands of waiting lock requests.
典型事故模式
发布过程对数千分区执行 DDL,同时业务会话获取关系锁;在明显阻塞者出现前,内部锁表已经发生竞争。
A deployment runs DDL across thousands of partitions while application sessions acquire relation locks, creating internal lock-table contention before a clear blocker is visible.
诊断 SQL
直接在 psql 里跑;标注的是语句里用到的视图与列所要求的最低版本。
正在等待 LWLock/LockManager 的会话Sessions waiting on LWLock/LockManager
PG ≥ 13SELECT pid, backend_type, usename, datname, application_name,
state, now() - query_start AS query_age,
now() - xact_start AS xact_age,
wait_event_type, wait_event,
pg_blocking_pids(pid) AS blocking_pids,
left(query, 160) AS query
FROM pg_stat_activity
WHERE wait_event_type = 'LWLock'
AND wait_event = 'LockManager'
ORDER BY query_age DESC NULLS LAST;
当前 LWLock 等待分布Current LWLock cohort
PG ≥ 13SELECT wait_event, count(*) AS waiting_sessions,
count(*) FILTER (WHERE state = 'active') AS active_waiters,
max(now() - query_start) AS oldest_query
FROM pg_stat_activity
WHERE wait_event_type = 'LWLock'
GROUP BY wait_event
ORDER BY waiting_sessions DESC, wait_event;
这些会话的锁与关系上下文Lock and relation context for these sessions
PG ≥ 13SELECT a.pid, l.locktype, l.mode, l.granted, l.fastpath,
d.datname, n.nspname, c.relname,
l.page, l.tuple, l.virtualxid, l.transactionid,
l.classid, l.objid, l.objsubid
FROM pg_stat_activity AS a
LEFT JOIN pg_locks AS l ON l.pid = a.pid
LEFT JOIN pg_database AS d ON d.oid = l.database
LEFT JOIN pg_class AS c
ON c.oid = l.relation
AND l.database = (
SELECT oid FROM pg_database WHERE datname = current_database()
)
LEFT JOIN pg_namespace AS n ON n.oid = c.relnamespace
WHERE a.wait_event_type = 'LWLock'
AND a.wait_event = 'LockManager'
ORDER BY a.pid, l.granted, l.locktype, l.mode;
处置步骤
- 按 PID 统计 pg_locks 行数并检查阻塞树。
- 定位一次触碰大量关系或分区的语句。
- 缩短事务并降低锁扇出;只有真实容量报错时才提高 max_locks_per_transaction。
英文原文
- Count pg_locks rows per PID and inspect the blocking tree.
- Identify statements touching many relations or partitions.
- Shorten transactions and reduce lock fan-out; raise max_locks_per_transaction only for genuine capacity errors.
相关参数与指标
max_locks_per_transactionmax_connections
waiting_sessionswait_event_sharelocks_per_backendblocked_sessions
源码证据
图谱在各版本源码树里核对到的位置,新的在前。「触发点」是真正上报等待事件的调用处,「目录定义」只说明这个名字在枚举里存在。
PostgreSQL 18REL_18_6
-
src/backend/storage/ipc/ipci.c:117LockManager资源定义动态触发size = add_size(size, LockManagerShmemSize()); -
src/backend/storage/lmgr/lwlock.c:739pgstat_report_wait_start通用上报动态触发pgstat_report_wait_start(PG_WAIT_LWLOCK | lock->tranche); -
src/backend/utils/activity/wait_event_names.txt:378LockManager目录定义动态触发LockManager "Waiting to read or update information about <quote>heavyweight</quote> locks."
演化历史
相邻两个大版本之间的差异,新的在前。版本号链到该版的变动清单。
-
PostgreSQL 19 ← 18 描述更新
描述措辞更新
等待读取或更新有关“重量级”锁的信息。
描述前后对照
Waiting to read or update information about "heavyweight" locks Waiting to read or update information about “heavyweight” locks. -
PostgreSQL 17 ← 16 描述更新
描述措辞更新
等待读取或更新有关“重量级”锁的信息。
描述前后对照
Waiting to read or update information about “heavyweight” locks. Waiting to read or update information about "heavyweight" locks -
PostgreSQL 13 ← 12 更名
更名
lock_managerLockManager描述措辞更新等待读取或更新有关“重量级”锁的信息。
描述前后对照
Waiting to add or examine locks for backends, or waiting to join or exit a locking group (used by parallel query). Waiting to read or update information about “heavyweight” locks. -
PostgreSQL 10 ← 9.6 类型变动
类型
LWLockTrancheLWLock等待添加或检查后端的锁,或者等待加入或退出锁组(用于并行查询)。
-
PostgreSQL 9.6 新增此事件
9.6 引入等待事件机制,此为本事件的首个版本
等待添加或检查后端的锁,或者等待加入或退出锁组(用于并行查询)。
同类事件
| 事件 | 引入 | 版本变动 | 最近变动 |
|---|---|---|---|
AddinShmemInit档案
|
9.6起点 | 132 次 | |
等待管理扩展在共享内存中的空间分配。曾用名 AddinShmemInitLock |
现存 | ||
AioUringCompletion档案
|
18 | — | |
| 等待另一个进程通过 io_uring 完成 I/O。 | 现存 | ||
AioWorkerControl
|
19 | — | |
| 等待更新 AIO 工作进程信息。 | 现存 | ||
AioWorkerSubmissionQueue档案
|
18 | — | |
| 等待访问 AIO 工作进程的提交队列。 | 现存 | ||
AutoFile档案
|
9.6起点 | 132 次 | |
等待更新postgresql.auto.conf文件。曾用名 AutoFileLock |
现存 | ||
Autovacuum档案
|
9.6起点 | 132 次 | |
等待读取或更新自动清理工作进程的当前状态。曾用名 AutovacuumLock |
现存 | ||
AutovacuumSchedule档案
|
9.6起点 | 132 次 | |
等待确认选中进行自动清理的表是否仍需清理。曾用名 AutovacuumScheduleLock |
现存 | ||
BackendRandomLock
|
10 | — | |
| 等待生成随机数。 | 于 12 移除 | ||
BackgroundWorker档案
|
9.6起点 | 132 次 | |
等待读取或更新后台工作进程状态。曾用名 BackgroundWorkerLock |
现存 | ||
BtreeVacuum档案
|
9.6起点 | 132 次 | |
等待读取或更新B-树索引的清理相关信息。曾用名 BtreeVacuumLock |
现存 | ||
BufferContent档案
|
9.6起点 | 132 次 | |
等待访问内存中的数据页。曾用名 buffer_content |
于 19 移除 | ||
BufferMapping档案
|
9.6起点 | 132 次 | |
等待将数据块与缓冲池中的缓冲区关联。曾用名 buffer_mapping |
现存 | ||
Checkpoint档案
|
9.6起点 | 132 次 | |
等待开始检查点。曾用名 CheckpointLock |
于 14 移除 | ||
CheckpointerComm档案
|
9.6起点 | 132 次 | |
等待管理fsync请求。曾用名 CheckpointerCommLock |
现存 | ||
CommitTs档案
|
9.6起点 | 132 次 | |
等待读取或更新最近设置的事务提交时间戳值。曾用名 CommitTsLock |
现存 | ||
CommitTsBuffer档案
|
9.6起点 | 132 次 | |
在提交时间戳SLRU缓冲区上等待I/O。曾用名 commit_timestamp |
现存 | ||
CommitTsSLRU档案
|
9.6起点 | 132 次 | |
等待访问提交时间戳SLRU缓存。曾用名 CommitTsControlLock |
现存 | ||
ControlFile档案
|
9.6起点 | 132 次 | |
等待读取或更新pg_control文件或创建一个新的WAL文件。曾用名 ControlFileLock |
现存 | ||
DataChecksumsWorker
|
20 | — | |
| 等待数据校验和工作进程。 | 现存 | ||
DataChecksumTransition
|
20 | — | |
| 等待数据校验和状态转换被写入 WAL。 | 现存 | ||
DSMRegistry档案
|
17 | — | |
| 等待读取或更新动态共享内存注册表。 | 现存 | ||
DSMRegistryDSA档案
|
17 | — | |
| 等待访问动态共享内存注册表的动态共享内存分配器。 | 现存 | ||
DSMRegistryHash档案
|
17 | — | |
| 等待访问动态共享内存注册表的共享hash表。 | 现存 | ||
DynamicSharedMemoryControl档案
|
9.6起点 | 132 次 | |
等待读取或更新动态共享内存分配信息。曾用名 DynamicSharedMemoryControlLock |
现存 | ||
InjectionPoint档案
|
17 | — | |
| 等待读取或更新注入点相关信息。 | 现存 | ||
LockFastPath档案
|
9.6起点 | 132 次 | |
等待读取或更新进程的快速路径锁信息。曾用名 proc |
现存 | ||
LockManager档案
|
9.6起点 | 194 次 | |
等待读取或更新有关“重量级”锁的信息。曾用名 lock_manager |
现存 | ||
LogicalDecodingControl
|
19 | — | |
| 等待读取或更新逻辑解码状态信息。 | 现存 | ||
LogicalRepLauncherDSA档案
|
16 | — | |
| 等待访问逻辑复制启动进程的动态共享内存分配器。 | 现存 | ||
LogicalRepLauncherHash档案
|
16 | — | |
| 等待访问逻辑复制启动进程的共享hash表。 | 现存 | ||
LogicalRepWorker档案
|
10 | 131 次 | |
等待读取或更新逻辑复制工作进程的状态。曾用名 LogicalRepWorkerLock |
现存 | ||
MultiXactGen档案
|
9.6起点 | 132 次 | |
等待读取或更新共享的多事务状态。曾用名 MultiXactGenLock |
现存 | ||
MultiXactMemberBuffer档案
|
9.6起点 | 132 次 | |
等待多事务成员 SLRU 缓冲区上的 I/O。曾用名 multixact_member |
现存 | ||
MultiXactMemberSLRU档案
|
9.6起点 | 132 次 | |
等待访问多事务成员 SLRU 缓存。曾用名 MultiXactMemberControlLock |
现存 | ||
MultiXactOffsetBuffer档案
|
9.6起点 | 132 次 | |
等待多事务偏移量 SLRU 缓冲区上的 I/O。曾用名 multixact_offset |
现存 | ||
MultiXactOffsetSLRU档案
|
9.6起点 | 132 次 | |
等待访问多事务偏移量 SLRU 缓存。曾用名 MultiXactOffsetControlLock |
现存 | ||
MultiXactTruncation档案
|
9.6起点 | 132 次 | |
等待读取或截断多事务信息。曾用名 MultiXactTruncationLock |
现存 | ||
NotifyBuffer档案
|
9.6起点 | 132 次 | |
在NOTIFY 消息 SLRU缓冲区上等待I/O。曾用名 async |
现存 | ||
NotifyChannelHash
|
19 | — | |
| 等待访问 NOTIFY 通道hash表。 | 现存 | ||
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 | — | |
| 在并行 B-树扫描计划执行期间等待同步工作进程。 | 现存 | ||
ParallelHashJoin档案
|
11 | 131 次 | |
在 Parallel Hash Join 计划执行期间等待同步工作进程。曾用名 parallel_hash_join |
现存 | ||
ParallelQueryDSA档案
|
10 | 131 次 | |
等待并行查询动态共享内存分配。曾用名 parallel_query_dsa |
现存 | ||
ParallelVacuumDSA档案
|
17 | — | |
| 等待为并行清理分配动态共享内存。 | 现存 | ||
PerSessionDSA档案
|
13 | — | |
| 等待并行查询动态共享内存分配。 | 现存 | ||
PerSessionRecordType档案
|
13 | — | |
| 等待访问并行查询中有关复合类型的信息。 | 现存 | ||
PerSessionRecordTypmod档案
|
13 | — | |
| 等待访问并行查询中用于标识匿名记录类型的类型修饰符信息。 | 现存 | ||
PerXactPredicateList档案
|
12 | 131 次 | |
在并行查询期间等待访问当前可串行化事务持有的谓词锁列表。曾用名 serializable_xact |
现存 | ||
PgStatsData档案
|
15 | — | |
| 等待访问共享内存中的统计数据。 | 现存 | ||
PgStatsDSA档案
|
15 | — | |
| 等待访问统计信息的动态共享内存分配器。 | 现存 | ||
PgStatsHash档案
|
15 | — | |
| 等待访问统计信息的共享内存hash表。 | 现存 | ||
PredicateLockManager档案
|
9.6起点 | 132 次 | |
等待访问可串行化事务使用的谓词锁信息。曾用名 predicate_lock_manager |
现存 | ||
ProcArray档案
|
9.6起点 | 132 次 | |
等待访问各进程的共享数据结构(通常是为了获取快照或报告会话的事务 ID)。曾用名 ProcArrayLock |
现存 | ||
RelationMapping档案
|
9.6起点 | 132 次 | |
等待读取或更新pg_filenode.map文件(用于跟踪某些系统目录的文件节点分配)。曾用名 RelationMappingLock |
现存 | ||
RelCacheInit档案
|
9.6起点 | 132 次 | |
等待读取或更新pg_internal.init关系缓存初始化文件。曾用名 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缓冲区上等待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 次 | |
在并行位图索引扫描期间等待访问共享的TID位图。曾用名 tbm |
现存 | ||
SharedTupleStore档案
|
13 | — | |
| 在并行查询期间等待访问共享元组存储。 | 现存 | ||
ShmemIndex档案
|
9.6起点 | 132 次 | |
等待在共享内存中找到或分配空间。曾用名 ShmemIndexLock |
现存 | ||
SInvalRead档案
|
9.6起点 | 132 次 | |
等待从共享系统目录失效队列中取出消息。曾用名 SInvalReadLock |
现存 | ||
SInvalWrite档案
|
9.6起点 | 132 次 | |
等待向共享系统目录失效队列添加消息。曾用名 SInvalWriteLock |
现存 | ||
SubtransBuffer档案
|
9.6起点 | 132 次 | |
在子事务SLRU缓冲区上等待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缓冲区中替换一个页面。曾用名 WALBufMappingLock |
现存 | ||
WALInsert档案
|
9.6起点 | 132 次 | |
等待将WAL数据插入内存缓冲区。曾用名 wal_insert |
现存 | ||
WALSummarizer档案
|
17 | — | |
| 等待读取或更新 WAL 汇总状态。 | 现存 | ||
WALWrite档案
|
9.6起点 | 132 次 | |
等待WAL缓冲区写入磁盘。曾用名 WALWriteLock |
现存 | ||
WrapLimitsVacuum档案
|
9.6起点 | 132 次 | |
等待更新事务 ID 和多事务消耗量的限制。曾用名 WrapLimitsVacuumLock |
现存 | ||
XactBuffer档案
|
9.6起点 | 132 次 | |
在事务状态的SLRU缓冲区上等待I/O。曾用名 clog |
现存 | ||
XactSLRU档案
|
9.6起点 | 132 次 | |
等待访问事务状态的SLRU缓存。曾用名 CLogControlLock |
现存 | ||
XactTruncation档案
|
10 | 131 次 | |
等待执行pg_xact_status或更新它可用的最早的事务ID。曾用名 CLogTruncationLock |
现存 | ||
XidGen档案
|
9.6起点 | 132 次 | |
等待分配新的事务ID。曾用名 XidGenLock |
现存 | ||