跳转到主要内容

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

等待访问 NOTIFY 消息 SLRU 缓存。

等待分配新的 OID。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

等待将 WAL buffer 写入磁盘。

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

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

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

等待分配新的事务 ID。