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 的应用会话看起来毫不起眼。
等待获取 buffer 上的独占 pin。