LWLock: BufferMapping
等待将数据块关联到 buffer pool 中的 buffer。
PostgreSQL 等待事件档案
类别LWLock
事件
BufferMapping
版本PG 13-18
证据3 个源码位置
官方描述译文
等待将数据块关联到 buffer pool 中的 buffer。
| PG 13 | PG 14 | PG 15 | PG 16 | PG 17 | PG 18 |
|---|---|---|---|---|---|
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
触发机制
缓冲区管理器把 relation/fork/block 标签哈希到由 BufferMappingLock 保护的分区。查找、插入、淘汰和重新分配标签都会短暂取得该分区锁;大规模并发未命中或缓冲区抖动会增加碰撞。
正常还是麻烦?
- 正常: 页面进入或离开共享缓冲区时,短暂等待属于正常现象。
- 需要调查: 持续出现通常意味着工作集反复冲刷 shared buffers、大量并行扫描,或访问集中映射到少数分区。
诊断 SQL
正在等待 LWLock/BufferMapping 的会话
当前 LWLock 等待分布
这些会话的锁与关系上下文
处置建议
- 按数据库与语句关联缓冲命中率和读取量。
- 检查是否出现新扫描、缓存过小或并发突增。
- 先降低并发扫描扇出或修正访问路径,再决定是否扩大 shared_buffers。
源码证据
- PostgreSQL 18.6 · src/backend/storage/lmgr/lwlock.c:152 —
BufferMapping - PostgreSQL 18.6 · src/backend/storage/lmgr/lwlock.c:739 —
pgstat_report_wait_start - PostgreSQL 18.6 · src/backend/utils/activity/wait_event_names.txt:377 —
BufferMapping
关联控制项与信号
- GUC: [guc:shared_buffers] · [guc:max_parallel_workers_per_gather]
- 指标: [metric:waiting_sessions] · [metric:wait_event_share] · [metric:buffer_hit_ratio] · [metric:blocks_read]
典型事故模式
执行计划退化引发大量并发大扫描,缓冲映射分区变热,同时有用页面被挤出缓存。