# IPC 等待

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

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

## 找到缺席的对端或阶段 {#how-to-read}

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

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

## 值得先认出的事件 {#top-events}

| 事件 | 对端或阶段 |
| --- | --- |
| [BufferIo](buffer-io/) | 正在为共享缓冲区执行 I/O 的另一个后端 |
| [ExecuteGather](execute-gather/) | 向 Gather 节点提供数据的子进程 |
| [ParallelFinish](parallel-finish/) | 并行 worker 到达计划完成点 |
| [CheckpointDone](checkpoint-done/) | checkpointer 完成请求的检查点 |
| [SyncRep](sync-rep/) | 远端同步备库确认 |
| [WalReceiverWaitStart](wal-receiver-wait-start/) | startup 进程等待流复制数据 |
| [MessageQueueReceive](message-queue-receive/) | 共享内存消息队列的生产者 |
| [RecoveryPause](recovery-pause/) | 恢复被运维策略有意暂停 |

## 常见误读 {#misreads}

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

---

本节页面：

- [IPC: AppendReady](/zh/ipc/append-ready/): 等待 Append 计划节点的子计划节点就绪。
- [IPC: ArchiveCleanupCommand](/zh/ipc/archive-cleanup-command/): 等待 archive_cleanup_command 完成。
- [IPC: ArchiveCommand](/zh/ipc/archive-command/): 等待 archive_command 完成。
- [IPC: BackendTermination](/zh/ipc/backend-termination/): 等待另一个后端终止。
- [IPC: BackupWaitWalArchive](/zh/ipc/backup-wait-wal-archive/): 等待备份所需的 WAL 文件成功归档。
- [IPC: BgworkerShutdown](/zh/ipc/bgworker-shutdown/): 等待后台工作进程关闭。
- [IPC: BgworkerStartup](/zh/ipc/bgworker-startup/): 等待后台工作进程启动。
- [IPC: BtreePage](/zh/ipc/btree-page/): 等待继续并行 B-tree 扫描所需的页号可用。
- [IPC: BufferIo](/zh/ipc/buffer-io/): 等待缓冲区 I/O 完成。
- [IPC: CheckpointDelayComplete](/zh/ipc/checkpoint-delay-complete/): 等待后端解除对检查点完成的阻塞。
- [IPC: CheckpointDelayStart](/zh/ipc/checkpoint-delay-start/): 等待后端解除对检查点启动的阻塞。
- [IPC: CheckpointDone](/zh/ipc/checkpoint-done/): 等待检查点完成。
- [IPC: CheckpointStart](/zh/ipc/checkpoint-start/): 等待检查点启动。
- [IPC: ExecuteGather](/zh/ipc/execute-gather/): 等待执行 Gather 计划节点时来自子进程的活动。
- [IPC: HashBatchAllocate](/zh/ipc/hash-batch-allocate/): 等待被选出的 Parallel Hash 参与者分配哈希表。
- [IPC: HashBatchElect](/zh/ipc/hash-batch-elect/): 等待选出一个负责分配哈希表的 Parallel Hash 参与者。
- [IPC: HashBatchLoad](/zh/ipc/hash-batch-load/): 等待其他 Parallel Hash 参与者完成哈希表加载。
- [IPC: HashBuildAllocate](/zh/ipc/hash-build-allocate/): 等待被选出的 Parallel Hash 参与者分配初始哈希表。
- [IPC: HashBuildElect](/zh/ipc/hash-build-elect/): 等待选出一个负责分配初始哈希表的 Parallel Hash 参与者。
- [IPC: HashBuildHashInner](/zh/ipc/hash-build-hash-inner/): 等待其他 Parallel Hash 参与者完成对 inner relation 的哈希处理。
- [IPC: HashBuildHashOuter](/zh/ipc/hash-build-hash-outer/): 等待其他 Parallel Hash 参与者完成对 outer relation 的分区。
- [IPC: HashGrowBatchesDecide](/zh/ipc/hash-grow-batches-decide/): 等待选出一个 Parallel Hash 参与者，以决定后续 batch 扩容。
- [IPC: HashGrowBatchesElect](/zh/ipc/hash-grow-batches-elect/): 等待选出一个负责分配更多 batch 的 Parallel Hash 参与者。
- [IPC: HashGrowBatchesFinish](/zh/ipc/hash-grow-batches-finish/): 等待被选出的 Parallel Hash 参与者决定后续 batch 扩容。
- [IPC: HashGrowBatchesReallocate](/zh/ipc/hash-grow-batches-reallocate/): 等待被选出的 Parallel Hash 参与者分配更多 batch。
- [IPC: HashGrowBatchesRepartition](/zh/ipc/hash-grow-batches-repartition/): 等待其他 Parallel Hash 参与者完成重新分区。
- [IPC: HashGrowBucketsElect](/zh/ipc/hash-grow-buckets-elect/): 等待选出一个负责分配更多 bucket 的 Parallel Hash 参与者。
- [IPC: HashGrowBucketsReallocate](/zh/ipc/hash-grow-buckets-reallocate/): 等待被选出的 Parallel Hash 参与者完成更多 bucket 的分配。
- [IPC: HashGrowBucketsReinsert](/zh/ipc/hash-grow-buckets-reinsert/): 等待其他 Parallel Hash 参与者完成将元组插入新 bucket。
- [IPC: LogicalApplySendData](/zh/ipc/logical-apply-send-data/): 等待逻辑复制 leader apply 进程向 parallel apply 进程发送数据。
- [IPC: LogicalParallelApplyStateChange](/zh/ipc/logical-parallel-apply-state-change/): 等待逻辑复制 parallel apply 进程改变状态。
- [IPC: LogicalSyncData](/zh/ipc/logical-sync-data/): 等待逻辑复制远端服务器发送用于初始表同步的数据。
- [IPC: LogicalSyncStateChange](/zh/ipc/logical-sync-state-change/): 等待逻辑复制远端服务器改变状态。
- [IPC: MessageQueueInternal](/zh/ipc/message-queue-internal/): 等待另一个进程附加到共享消息队列。
- [IPC: MessageQueuePutMessage](/zh/ipc/message-queue-put-message/): 等待向共享消息队列写入协议消息。
- [IPC: MessageQueueReceive](/zh/ipc/message-queue-receive/): 等待从共享消息队列接收字节。
- [IPC: MessageQueueSend](/zh/ipc/message-queue-send/): 等待向共享消息队列发送字节。
- [IPC: MultixactCreation](/zh/ipc/multixact-creation/): 等待 multixact 创建完成。
- [IPC: ParallelBitmapScan](/zh/ipc/parallel-bitmap-scan/): 等待并行位图扫描完成初始化。
- [IPC: ParallelCreateIndexScan](/zh/ipc/parallel-create-index-scan/): 等待并行 CREATE INDEX 工作进程完成 heap 扫描。
- [IPC: ParallelFinish](/zh/ipc/parallel-finish/): 等待并行工作进程完成计算。
- [IPC: ProcSignalBarrier](/zh/ipc/proc-signal-barrier/): 等待所有后端处理完 barrier 事件。
- [IPC: ProcarrayGroupUpdate](/zh/ipc/procarray-group-update/): 等待 group leader 在事务结束时清除事务 ID。
- [IPC: Promote](/zh/ipc/promote/): 等待备库提升。
- [IPC: RecoveryConflictSnapshot](/zh/ipc/recovery-conflict-snapshot/): 等待解决与 vacuum cleanup 有关的恢复冲突。
- [IPC: RecoveryConflictTablespace](/zh/ipc/recovery-conflict-tablespace/): 等待解决与删除表空间有关的恢复冲突。
- [IPC: RecoveryEndCommand](/zh/ipc/recovery-end-command/): 等待 recovery_end_command 完成。
- [IPC: RecoveryPause](/zh/ipc/recovery-pause/): 等待恢复操作继续执行。
- [IPC: ReplicationOriginDrop](/zh/ipc/replication-origin-drop/): 等待复制源变为非活动状态，以便将其删除。
- [IPC: ReplicationSlotDrop](/zh/ipc/replication-slot-drop/): 等待复制槽变为非活动状态，以便将其删除。
- [IPC: RestoreCommand](/zh/ipc/restore-command/): 等待 restore_command 完成。
- [IPC: SafeSnapshot](/zh/ipc/safe-snapshot/): 等待为 READ ONLY DEFERRABLE 事务获取有效 snapshot。
- [IPC: SyncRep](/zh/ipc/sync-rep/): 等待同步复制期间来自远端服务器的确认。
- [IPC: WalReceiverExit](/zh/ipc/wal-receiver-exit/): 等待 WAL receiver 退出。
- [IPC: WalReceiverUpstreamCatchup](/zh/ipc/wal-receiver-upstream-catchup/): 等待上游服务器的 WAL flush 位置追上请求的起始点。
- [IPC: WalReceiverWaitStart](/zh/ipc/wal-receiver-wait-start/): 等待 startup 进程发送流复制的初始数据。
- [IPC: WalSummaryReady](/zh/ipc/wal-summary-ready/): 等待生成新的 WAL summary。
- [IPC: XactGroupUpdate](/zh/ipc/xact-group-update/): 等待 group leader 在事务结束时更新事务状态。
