LWLock 等待
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 状态发生竞争 |
常见误读
- “LWLock 说明锁泄漏了。” 不是。它是短暂的内部临界区;持续、重复出现才是信号。
- “页面显示的查询就是持有者。”
pg_stat_activity.query属于等待者;持有者可能是走另一条源码路径的后端。 - “多加 CPU 就能解决。” 更多并发反而可能加剧共享内存热点。先确认受保护资源与负载形状。
- “
pg_locks能找出阻塞者。” 它覆盖重量级锁与谓词锁,不覆盖一般 LWLock 所有权。
页面级热点先看 BufferContent,写入密集集群先看 WALInsert。
等待管理扩展在共享内存中的空间分配。
等待另一个进程通过 io_uring 完成 I/O。
等待访问 AIO worker 提交队列。
等待更新 postgresql.auto.conf 文件。
等待读取或更新 autovacuum worker 的当前状态。
等待确认被选中进行 autovacuum 的表仍需要 vacuum。
等待读取或更新后台 worker 的状态。
等待读取或更新 B-tree 索引中与 vacuum 相关的信息。
等待访问内存中的数据页。
等待将数据块关联到 buffer pool 中的 buffer。
等待开始执行检查点。
等待管理 fsync 请求。
等待读取或更新事务提交时间戳的最近设定值。
等待事务提交时间戳 SLRU buffer 上的 I/O。
等待访问事务提交时间戳 SLRU 缓存。
等待读取或更新 pg_control 文件,或创建新的 WAL 文件。
等待读取或更新动态共享内存注册表。
等待访问动态共享内存注册表的动态共享内存分配器。
等待访问动态共享内存注册表的共享哈希表。
等待读取或更新动态共享内存分配信息。
等待读取或更新与注入点相关的信息。
等待读取或更新进程的快速路径锁信息。
等待读取或更新“重量级”锁的信息。
等待访问逻辑复制 launcher 的动态共享内存分配器。
等待访问逻辑复制 launcher 的共享哈希表。
等待读取或更新逻辑复制 worker 的状态。
等待读取或更新共享 multixact 状态。
等待 multixact member SLRU buffer 上的 I/O。
等待访问 multixact member SLRU 缓存。
等待 multixact offset SLRU buffer 上的 I/O。
等待访问 multixact offset SLRU 缓存。
等待读取或截断 multixact 信息。
等待 NOTIFY 消息 SLRU buffer 上的 I/O。
等待读取或更新 NOTIFY 消息。
等待更新 NOTIFY 消息的存储上限。
等待访问 NOTIFY 消息 SLRU 缓存。
等待分配新的 OID。
等待读取或更新旧快照控制信息。
执行 Parallel Append 计划期间,等待选择下一个子计划。
执行 Parallel B-tree Scan 计划期间,等待同步 worker。
执行 Parallel Hash Join 计划期间,等待同步 worker。
等待并行查询的动态共享内存分配。
等待并行 vacuum 的动态共享内存分配。
等待并行查询的动态共享内存分配。
等待访问并行查询的复合类型信息。
等待访问并行查询中用于标识匿名 record 类型的类型修饰符信息。
并行查询期间,等待访问当前可串行化事务所持有的谓词锁列表。
等待访问统计信息的动态共享内存分配器。
等待访问共享内存中的统计数据。
等待访问统计信息的共享内存哈希表。
等待访问可串行化事务使用的谓词锁信息。
等待访问共享的进程级数据结构(通常用于获取快照或报告会话的事务 ID)。
等待读取或更新 pg_internal.init relation cache 初始化文件。
等待读取或更新 pg_filenode.map 文件(用于跟踪某些系统目录的 filenode 分配)。
等待创建、删除或使用复制源。
等待读取或更新一个复制源的进度。
等待分配或释放复制槽。
等待读取或更新复制槽状态。
等待复制槽上的 I/O。
等待从共享系统目录失效队列中取出消息。
等待向共享系统目录失效队列中添加消息。
等待可串行化事务冲突 SLRU buffer 上的 I/O。
等待读取或更新共享的 pg_serial 状态。
等待访问可串行化事务冲突 SLRU 缓存。
等待访问已结束的可串行化事务列表。
等待访问可串行化事务所持有的谓词锁列表。
等待读取或更新可串行化事务的信息。
并行 bitmap index scan 期间,等待访问共享 TID bitmap。
并行查询期间,等待访问共享 tuple store。
等待在共享内存中查找或分配空间。
等待子事务 SLRU buffer 上的 I/O。
等待访问子事务 SLRU 缓存。
等待读取或更新同步复制状态信息。
等待选择同步表扫描的起始位置。
等待创建或删除表空间。
等待读取或更新预备事务的状态。
等待替换 WAL buffer 中的页面。
等待将 WAL 数据插入内存 buffer。
等待读取或更新 WAL 汇总状态。
等待将 WAL buffer 写入磁盘。
等待读取或更新自定义等待事件信息。
等待更新事务 ID 和 multixact 的消耗上限。
等待事务状态 SLRU buffer 上的 I/O。
等待访问事务状态 SLRU 缓存。
等待执行 pg_xact_status,或更新当前进程可用的最旧事务 ID。
等待分配新的事务 ID。