IPC:ProcArrayGroupUpdate
当会话正等待组领导在操作结束时更新事务状态时,会发生 IPC:ProcArrayGroupUpdate 事件。虽然 PostgreSQL 通常将 IPC 类型的等待事件与并行查询操作相关联,但这个特定等待事件并非并行查询所特有。
支持的引擎版本
Aurora PostgreSQL 的所有版本均支持此等待事件信息。
上下文
了解进程数组 – 进程(proc)数组是 PostgreSQL 中的共享内存结构。它包含有关所有正在运行的进程的信息,包括事务详细信息。在事务完成(COMMIT 或 ROLLBACK)期间,需要更新 ProcArray 以反映更改并从数组中清除 transactionID。尝试完成事务的会话必须在 ProcArray 上获得独占锁。这可以防止其他进程获得其共享或独占锁。
组更新机制 – 在执行 COMMIT 或 ROLLBACK 时,如果后端进程无法在独占模式下获取 ProcArrayLock,它会更新一个名为 ProcArrayGroupMember 的特殊字段。这会将事务添加到打算结束的会话列表中。然后,此后端进程进入休眠状态,其休眠时间被记录为 ProcArrayGroupUpdate 等待事件。ProcArray 中具有 procArrayGroupMember 的第一个进程,称为领导进程,以独占模式获取 ProcArrayLock。然后,它会清除等待群组 transactionID 清除的进程列表。完成后,领导进程会释放 ProcArrayLock,然后唤醒此列表中的所有进程,通知它们其事务已完成。
等待次数增加的可能原因
正在运行的进程越多,领导进程在独占模式下保持 procArrayLock 的时间就越长。因此,更多的写入事务会进入组更新场景,导致可能出现大量进程在 ProcArrayGroupUpdate 等待事件上排队等待。在数据库洞察的 Top SQL 视图中,您会看到 COMMIT 是该等待事件占比最多的语句。这是预期行为,但需要对正在运行的特定写入 SQL 进行更深入的调查,以确定要采取的适当措施。
操作
根据等待事件的原因,我们建议采取不同的操作。可以通过使用 Amazon RDS 性能详情或查询 PostgreSQL 系统视图 pg_stat_activity 来识别 IPC:ProcArrayGroupUpdate 事件。
监控事务提交和回滚操作
监控提交和回滚 – 提交和回滚数量的增加可能会导致 ProcArray 承受的压力增加。例如,如果 SQL 语句由于重复键冲突增多而开始失败,您可能会看到回滚次数增加,这可能会增加 ProcArray 争用和表膨胀。
Amazon RDS 数据库洞察提供 PostgreSQL 指标 xact_commit 和 xact_rollback 以报告每秒的提交和回滚次数。
减少并发性
批处理事务 – 尽可能在单个事务中进行批量操作,以减少提交/回滚操作。
限制并发性 - 减少并发活跃事务的数量,以缓解 ProcArray 上的锁争用。虽然需要进行一些测试,但减少并发连接总数可以减少争用并维持吞吐量。
实施连接池
连接池解决方案 - 使用连接池来有效地管理数据库连接,从而减少后端的总数,进而减少 ProcArray 上的工作负载。虽然需要进行一些测试,但减少并发连接总数可以减少争用并维持吞吐量。
有关更多信息,请参阅适用于 Aurora PostgreSQL 的连接池。
减少连接风暴 – 同样,频繁创建和终止连接的模式会给 ProcArray 带来额外的压力。通过减少这种模式,可以减少总体争用。