跳转到主要内容

IPC 等待

PostgreSQL 进程等待对端、worker、屏障、队列或阶段变化。

IPC 表示协调:当前进程已经走到一个依赖另一个 PostgreSQL 进程或执行参与者的位置。对端可能是并行 worker、WAL receiver、checkpointer、archiver、复制进程,或共享内存协议里的另一个后端。

找到缺席的对端或阶段

等待者本身往往是健康的。先问谁应该向它发信号,再检查该参与者的状态。并行查询事件按阶段图阅读;复制事件按 sender/receiver 流水线阅读;检查点事件按全局屏障阅读。

  • 正常: 并行计划汇合、检查点开始/完成、worker 启动或同步复制中的短暂等待。
  • 关注: 前台等待者连续三次采样都停在同一阶段,而对端没有可见进展。
  • 紧急: 对端已退出或被阻塞、队列无法排空、复制/故障切换停滞,或大量会话依赖同一个卡住的协调者。

值得先认出的事件

事件 对端或阶段
BufferIo 正在为共享缓冲区执行 I/O 的另一个后端
ExecuteGather 向 Gather 节点提供数据的子进程
ParallelFinish 并行 worker 到达计划完成点
CheckpointDone checkpointer 完成请求的检查点
SyncRep 远端同步备库确认
WalReceiverWaitStart startup 进程等待流复制数据
MessageQueueReceive 共享内存消息队列的生产者
RecoveryPause 恢复被运维策略有意暂停

常见误读

  • 杀掉等待者无法修复已死亡或被阻塞的对端。
  • IPC/SyncRep 是确认延迟;LWLock/SyncRep 是共享队列/状态元数据上的竞争。
  • 许多并行等待名称本来就是屏障。真正的问题是所有参与者是否最终推进。
  • RecoveryPause 可能完全是有意行为;先检查 pg_is_wal_replay_paused()

等待 Append 计划节点的子计划节点就绪。

等待继续并行 B-tree 扫描所需的页号可用。

等待缓冲区 I/O 完成。

等待执行 Gather 计划节点时来自子进程的活动。

等待选出一个负责分配哈希表的 Parallel Hash 参与者。

等待其他 Parallel Hash 参与者完成哈希表加载。

等待被选出的 Parallel Hash 参与者分配初始哈希表。

等待选出一个负责分配初始哈希表的 Parallel Hash 参与者。

等待其他 Parallel Hash 参与者完成对 inner relation 的哈希处理。

等待其他 Parallel Hash 参与者完成对 outer relation 的分区。

等待逻辑复制 leader apply 进程向 parallel apply 进程发送数据。

等待逻辑复制远端服务器发送用于初始表同步的数据。

等待为 READ ONLY DEFERRABLE 事务获取有效 snapshot。

等待同步复制期间来自远端服务器的确认。

等待 group leader 在事务结束时更新事务状态。