跳转到主要内容

BufferPin 等待

后端需要独占缓冲区 pin,但另一个后端仍持有 pin。

BufferPin 类只有一个核心事件,也叫 BufferPin。它表示 PostgreSQL 需要独占访问某个共享缓冲区,但另一个后端仍钉住该页,使其不能被移除或进行结构修改。

持续出现就值得怀疑

执行器检查页面时,pin 很正常而且生命周期很短。持续的独占 pin 等待并不常见,可能来自另一个会话保持游标打开、执行器停在某页,或并发索引工作需要删除/回收该页。

  • 正常: 扫描或索引维护期间孤立的亚秒级样本。
  • 关注: 同一前台会话在 BufferPin 上停留超过一秒。
  • 紧急: 大量会话排队、索引清理/DDL 无法推进,或持有游标的会话空闲却仍握着 pin。

应该检查什么

  1. 确认等待查询及其关系锁。
  2. 查找长游标、idle in transaction,以及访问同一关系的执行器会话。
  3. 把事件开始时间与 VACUUM、索引删除/回收、DDL 或长扫描关联。
  4. 取消任何会话前,先保全持有者的查询与事务上下文。

常见误读

  • Buffer pin 不是重量级锁,在 pg_locks 中没有直接的持有者行。
  • 调大 shared_buffers 不能让已持有的 pin 消失。
  • 等待者可能是 vacuum/索引维护,而持有 pin 的应用会话看起来毫不起眼。

等待获取 buffer 上的独占 pin。