# LWLock 等待

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

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

<div class="signal-strip"><span class="signal-dot"></span><strong>值班规则</strong><code>重复采样 → 锁定一个热点 tranche → 与负载关联</code></div>

## 怎样阅读这一类 {#how-to-read}

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

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

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

## 值得先认出的十个事件 {#top-events}

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

## 常见误读 {#misreads}

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

页面级热点先看 [BufferContent](buffer-content/)，写入密集集群先看 [WALInsert](wal-insert/)。

---

本节页面：

- [LWLock: AddinShmemInit](/zh/lwlock/addin-shmem-init/): 等待管理扩展在共享内存中的空间分配。
- [LWLock: AioUringCompletion](/zh/lwlock/aio-uring-completion/): 等待另一个进程通过 io_uring 完成 I/O。
- [LWLock: AioWorkerSubmissionQueue](/zh/lwlock/aio-worker-submission-queue/): 等待访问 AIO worker 提交队列。
- [LWLock: AutoFile](/zh/lwlock/auto-file/): 等待更新 postgresql.auto.conf 文件。
- [LWLock: Autovacuum](/zh/lwlock/autovacuum/): 等待读取或更新 autovacuum worker 的当前状态。
- [LWLock: AutovacuumSchedule](/zh/lwlock/autovacuum-schedule/): 等待确认被选中进行 autovacuum 的表仍需要 vacuum。
- [LWLock: BackgroundWorker](/zh/lwlock/background-worker/): 等待读取或更新后台 worker 的状态。
- [LWLock: BtreeVacuum](/zh/lwlock/btree-vacuum/): 等待读取或更新 B-tree 索引中与 vacuum 相关的信息。
- [LWLock: BufferContent](/zh/lwlock/buffer-content/): 等待访问内存中的数据页。
- [LWLock: BufferMapping](/zh/lwlock/buffer-mapping/): 等待将数据块关联到 buffer pool 中的 buffer。
- [LWLock: Checkpoint](/zh/lwlock/checkpoint/): 等待开始执行检查点。
- [LWLock: CheckpointerComm](/zh/lwlock/checkpointer-comm/): 等待管理 fsync 请求。
- [LWLock: CommitTs](/zh/lwlock/commit-ts/): 等待读取或更新事务提交时间戳的最近设定值。
- [LWLock: CommitTsBuffer](/zh/lwlock/commit-ts-buffer/): 等待事务提交时间戳 SLRU buffer 上的 I/O。
- [LWLock: CommitTsSLRU](/zh/lwlock/commit-ts-slru/): 等待访问事务提交时间戳 SLRU 缓存。
- [LWLock: ControlFile](/zh/lwlock/control-file/): 等待读取或更新 pg_control 文件，或创建新的 WAL 文件。
- [LWLock: DSMRegistry](/zh/lwlock/dsm-registry/): 等待读取或更新动态共享内存注册表。
- [LWLock: DSMRegistryDSA](/zh/lwlock/dsm-registry-dsa/): 等待访问动态共享内存注册表的动态共享内存分配器。
- [LWLock: DSMRegistryHash](/zh/lwlock/dsm-registry-hash/): 等待访问动态共享内存注册表的共享哈希表。
- [LWLock: DynamicSharedMemoryControl](/zh/lwlock/dynamic-shared-memory-control/): 等待读取或更新动态共享内存分配信息。
- [LWLock: InjectionPoint](/zh/lwlock/injection-point/): 等待读取或更新与注入点相关的信息。
- [LWLock: LockFastPath](/zh/lwlock/lock-fast-path/): 等待读取或更新进程的快速路径锁信息。
- [LWLock: LockManager](/zh/lwlock/lock-manager/): 等待读取或更新“重量级”锁的信息。
- [LWLock: LogicalRepLauncherDSA](/zh/lwlock/logical-rep-launcher-dsa/): 等待访问逻辑复制 launcher 的动态共享内存分配器。
- [LWLock: LogicalRepLauncherHash](/zh/lwlock/logical-rep-launcher-hash/): 等待访问逻辑复制 launcher 的共享哈希表。
- [LWLock: LogicalRepWorker](/zh/lwlock/logical-rep-worker/): 等待读取或更新逻辑复制 worker 的状态。
- [LWLock: MultiXactGen](/zh/lwlock/multi-xact-gen/): 等待读取或更新共享 multixact 状态。
- [LWLock: MultiXactMemberBuffer](/zh/lwlock/multi-xact-member-buffer/): 等待 multixact member SLRU buffer 上的 I/O。
- [LWLock: MultiXactMemberSLRU](/zh/lwlock/multi-xact-member-slru/): 等待访问 multixact member SLRU 缓存。
- [LWLock: MultiXactOffsetBuffer](/zh/lwlock/multi-xact-offset-buffer/): 等待 multixact offset SLRU buffer 上的 I/O。
- [LWLock: MultiXactOffsetSLRU](/zh/lwlock/multi-xact-offset-slru/): 等待访问 multixact offset SLRU 缓存。
- [LWLock: MultiXactTruncation](/zh/lwlock/multi-xact-truncation/): 等待读取或截断 multixact 信息。
- [LWLock: NotifyBuffer](/zh/lwlock/notify-buffer/): 等待 NOTIFY 消息 SLRU buffer 上的 I/O。
- [LWLock: NotifyQueue](/zh/lwlock/notify-queue/): 等待读取或更新 NOTIFY 消息。
- [LWLock: NotifyQueueTail](/zh/lwlock/notify-queue-tail/): 等待更新 NOTIFY 消息的存储上限。
- [LWLock: NotifySLRU](/zh/lwlock/notify-slru/): 等待访问 NOTIFY 消息 SLRU 缓存。
- [LWLock: OidGen](/zh/lwlock/oid-gen/): 等待分配新的 OID。
- [LWLock: OldSnapshotTimeMap](/zh/lwlock/old-snapshot-time-map/): 等待读取或更新旧快照控制信息。
- [LWLock: ParallelAppend](/zh/lwlock/parallel-append/): 执行 Parallel Append 计划期间，等待选择下一个子计划。
- [LWLock: ParallelBtreeScan](/zh/lwlock/parallel-btree-scan/): 执行 Parallel B-tree Scan 计划期间，等待同步 worker。
- [LWLock: ParallelHashJoin](/zh/lwlock/parallel-hash-join/): 执行 Parallel Hash Join 计划期间，等待同步 worker。
- [LWLock: ParallelQueryDSA](/zh/lwlock/parallel-query-dsa/): 等待并行查询的动态共享内存分配。
- [LWLock: ParallelVacuumDSA](/zh/lwlock/parallel-vacuum-dsa/): 等待并行 vacuum 的动态共享内存分配。
- [LWLock: PerSessionDSA](/zh/lwlock/per-session-dsa/): 等待并行查询的动态共享内存分配。
- [LWLock: PerSessionRecordType](/zh/lwlock/per-session-record-type/): 等待访问并行查询的复合类型信息。
- [LWLock: PerSessionRecordTypmod](/zh/lwlock/per-session-record-typmod/): 等待访问并行查询中用于标识匿名 record 类型的类型修饰符信息。
- [LWLock: PerXactPredicateList](/zh/lwlock/per-xact-predicate-list/): 并行查询期间，等待访问当前可串行化事务所持有的谓词锁列表。
- [LWLock: PgStatsDSA](/zh/lwlock/pg-stats-dsa/): 等待访问统计信息的动态共享内存分配器。
- [LWLock: PgStatsData](/zh/lwlock/pg-stats-data/): 等待访问共享内存中的统计数据。
- [LWLock: PgStatsHash](/zh/lwlock/pg-stats-hash/): 等待访问统计信息的共享内存哈希表。
- [LWLock: PredicateLockManager](/zh/lwlock/predicate-lock-manager/): 等待访问可串行化事务使用的谓词锁信息。
- [LWLock: ProcArray](/zh/lwlock/proc-array/): 等待访问共享的进程级数据结构（通常用于获取快照或报告会话的事务 ID）。
- [LWLock: RelCacheInit](/zh/lwlock/rel-cache-init/): 等待读取或更新 pg_internal.init relation cache 初始化文件。
- [LWLock: RelationMapping](/zh/lwlock/relation-mapping/): 等待读取或更新 pg_filenode.map 文件（用于跟踪某些系统目录的 filenode 分配）。
- [LWLock: ReplicationOrigin](/zh/lwlock/replication-origin/): 等待创建、删除或使用复制源。
- [LWLock: ReplicationOriginState](/zh/lwlock/replication-origin-state/): 等待读取或更新一个复制源的进度。
- [LWLock: ReplicationSlotAllocation](/zh/lwlock/replication-slot-allocation/): 等待分配或释放复制槽。
- [LWLock: ReplicationSlotControl](/zh/lwlock/replication-slot-control/): 等待读取或更新复制槽状态。
- [LWLock: ReplicationSlotIO](/zh/lwlock/replication-slot-io/): 等待复制槽上的 I/O。
- [LWLock: SInvalRead](/zh/lwlock/s-inval-read/): 等待从共享系统目录失效队列中取出消息。
- [LWLock: SInvalWrite](/zh/lwlock/s-inval-write/): 等待向共享系统目录失效队列中添加消息。
- [LWLock: SerialBuffer](/zh/lwlock/serial-buffer/): 等待可串行化事务冲突 SLRU buffer 上的 I/O。
- [LWLock: SerialControl](/zh/lwlock/serial-control/): 等待读取或更新共享的 pg_serial 状态。
- [LWLock: SerialSLRU](/zh/lwlock/serial-slru/): 等待访问可串行化事务冲突 SLRU 缓存。
- [LWLock: SerializableFinishedList](/zh/lwlock/serializable-finished-list/): 等待访问已结束的可串行化事务列表。
- [LWLock: SerializablePredicateList](/zh/lwlock/serializable-predicate-list/): 等待访问可串行化事务所持有的谓词锁列表。
- [LWLock: SerializableXactHash](/zh/lwlock/serializable-xact-hash/): 等待读取或更新可串行化事务的信息。
- [LWLock: SharedTidBitmap](/zh/lwlock/shared-tid-bitmap/): 并行 bitmap index scan 期间，等待访问共享 TID bitmap。
- [LWLock: SharedTupleStore](/zh/lwlock/shared-tuple-store/): 并行查询期间，等待访问共享 tuple store。
- [LWLock: ShmemIndex](/zh/lwlock/shmem-index/): 等待在共享内存中查找或分配空间。
- [LWLock: SubtransBuffer](/zh/lwlock/subtrans-buffer/): 等待子事务 SLRU buffer 上的 I/O。
- [LWLock: SubtransSLRU](/zh/lwlock/subtrans-slru/): 等待访问子事务 SLRU 缓存。
- [LWLock: SyncRep](/zh/lwlock/sync-rep/): 等待读取或更新同步复制状态信息。
- [LWLock: SyncScan](/zh/lwlock/sync-scan/): 等待选择同步表扫描的起始位置。
- [LWLock: TablespaceCreate](/zh/lwlock/tablespace-create/): 等待创建或删除表空间。
- [LWLock: TwoPhaseState](/zh/lwlock/two-phase-state/): 等待读取或更新预备事务的状态。
- [LWLock: WALBufMapping](/zh/lwlock/wal-buf-mapping/): 等待替换 WAL buffer 中的页面。
- [LWLock: WALInsert](/zh/lwlock/wal-insert/): 等待将 WAL 数据插入内存 buffer。
- [LWLock: WALSummarizer](/zh/lwlock/wal-summarizer/): 等待读取或更新 WAL 汇总状态。
- [LWLock: WALWrite](/zh/lwlock/wal-write/): 等待将 WAL buffer 写入磁盘。
- [LWLock: WaitEventCustom](/zh/lwlock/wait-event-custom/): 等待读取或更新自定义等待事件信息。
- [LWLock: WrapLimitsVacuum](/zh/lwlock/wrap-limits-vacuum/): 等待更新事务 ID 和 multixact 的消耗上限。
- [LWLock: XactBuffer](/zh/lwlock/xact-buffer/): 等待事务状态 SLRU buffer 上的 I/O。
- [LWLock: XactSLRU](/zh/lwlock/xact-slru/): 等待访问事务状态 SLRU 缓存。
- [LWLock: XactTruncation](/zh/lwlock/xact-truncation/): 等待执行 pg_xact_status，或更新当前进程可用的最旧事务 ID。
- [LWLock: XidGen](/zh/lwlock/xid-gen/): 等待分配新的事务 ID。
