这是本节的多页打印视图。 .
BufferPin 等待
后端需要独占缓冲区 pin,但另一个后端仍持有 pin。
BufferPin 类只有一个核心事件,也叫 BufferPin。它表示 PostgreSQL 需要独占访问某个共享缓冲区,但另一个后端仍钉住该页,使其不能被移除或进行结构修改。
持续出现就值得怀疑
执行器检查页面时,pin 很正常而且生命周期很短。持续的独占 pin 等待并不常见,可能来自另一个会话保持游标打开、执行器停在某页,或并发索引工作需要删除/回收该页。
- 正常: 扫描或索引维护期间孤立的亚秒级样本。
- 关注: 同一前台会话在 BufferPin 上停留超过一秒。
- 紧急: 大量会话排队、索引清理/DDL 无法推进,或持有游标的会话空闲却仍握着 pin。
应该检查什么
- 确认等待查询及其关系锁。
- 查找长游标、
idle in transaction,以及访问同一关系的执行器会话。 - 把事件开始时间与
VACUUM、索引删除/回收、DDL 或长扫描关联。 - 取消任何会话前,先保全持有者的查询与事务上下文。
常见误读
- Buffer pin 不是重量级锁,在
pg_locks中没有直接的持有者行。 - 调大
shared_buffers不能让已持有的 pin 消失。 - 等待者可能是 vacuum/索引维护,而持有 pin 的应用会话看起来毫不起眼。
1 - BufferPin: BufferPin
等待获取 buffer 上的独占 pin。
PostgreSQL 等待事件档案
类别BufferPin
事件
BufferPin
版本PG 13-18
证据2 个源码位置
官方描述译文
等待获取 buffer 上的独占 pin。
| PG 13 | PG 14 | PG 15 | PG 16 | PG 17 | PG 18 |
|---|---|---|---|---|---|
| ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
触发机制
WAIT_EVENT_BUFFER_PIN 位于 src/backend/storage/buffer/bufmgr.c:5819,是经 grep 核验的报告路径。公共身份/资源映射位于 src/backend/utils/activity/wait_event_names.txt:286。探针覆盖的操作是:等待获取 buffer 上的独占 pin。缓冲区管理器需要独占 pin,但另一个后端仍在同一共享缓冲区上持有 pin;当前后端会休眠到最后一个冲突 pin 被释放。
正常还是麻烦?
- 正常: 扫描或索引维护期间,孤立的亚秒级样本可能正常。
- 需要调查: 等待超过一秒就值得怀疑,尤其要检查游标或空闲事务是否持续钉住页面。
诊断 SQL
正在等待 BufferPin/BufferPin 的会话
当前 BufferPin 等待分布
这些会话的锁与关系上下文
处置建议
- 保全等待查询与关系上下文。
- 查找访问同一关系的长游标与 idle in transaction 会话。
- 确认最安全的持有者或维护受害者后再取消。
源码证据
- PostgreSQL 18.6 · src/backend/storage/buffer/bufmgr.c:5819 —
WAIT_EVENT_BUFFER_PIN - PostgreSQL 18.6 · src/backend/utils/activity/wait_event_names.txt:286 —
BUFFER_PIN
关联控制项与信号
- GUC: 无直接关联项。
- 指标: [metric:waiting_sessions] · [metric:wait_event_share]