

# IPC:ProcArrayGroupUpdate
<a name="apg-rpg-ipcprocarraygroup"></a>

当会话正等待组领导在操作结束时更新事务状态时，会发生 `IPC:ProcArrayGroupUpdate` 事件。虽然 PostgreSQL 通常将 IPC 类型的等待事件与并行查询操作相关联，但这个特定等待事件并非并行查询所特有。

**Topics**
+ [

## 支持的引擎版本
](#apg-rpg-ipcprocarraygroup.supported)
+ [

## 上下文
](#apg-rpg-ipcprocarraygroup.context)
+ [

## 等待次数增加的可能原因
](#apg-rpg-ipcprocarraygroup.causes)
+ [

## 操作
](#apg-rpg-ipcprocarraygroup.actions)

## 支持的引擎版本
<a name="apg-rpg-ipcprocarraygroup.supported"></a>

RDS for PostgreSQL 的所有版本均支持此等待事件信息。

## 上下文
<a name="apg-rpg-ipcprocarraygroup.context"></a>

**了解进程数组** – 进程（proc）数组是 PostgreSQL 中的共享内存结构。它包含有关所有正在运行的进程的信息，包括事务详细信息。在事务完成（`COMMIT` 或 `ROLLBACK`）期间，需要更新 ProcArray 以反映更改并从数组中清除 transactionID。尝试完成事务的会话必须在 ProcArray 上获得独占锁。这可以防止其他进程获得其共享或独占锁。

**组更新机制** – 在执行 COMMIT 或 ROLLBACK 时，如果后端进程无法在独占模式下获取 ProcArrayLock，它会更新一个名为 ProcArrayGroupMember 的特殊字段。这会将事务添加到打算结束的会话列表中。然后，此后端进程进入休眠状态，其休眠时间被记录为 ProcArrayGroupUpdate 等待事件。ProcArray 中具有 procArrayGroupMember 的第一个进程，称为领导进程，以独占模式获取 ProcArrayLock。然后，它会清除等待群组 transactionID 清除的进程列表。完成后，领导进程会释放 ProcArrayLock，然后唤醒此列表中的所有进程，通知它们其事务已完成。

## 等待次数增加的可能原因
<a name="apg-rpg-ipcprocarraygroup.causes"></a>

正在运行的进程越多，领导进程在独占模式下保持 procArrayLock 的时间就越长。因此，更多的写入事务会进入组更新场景，导致可能出现大量进程在 `ProcArrayGroupUpdate` 等待事件上排队等待。在数据库洞察的 Top SQL 视图中，您会看到 COMMIT 是该等待事件占比最多的语句。这是预期行为，但需要对正在运行的特定写入 SQL 进行更深入的调查，以确定要采取的适当措施。

## 操作
<a name="apg-rpg-ipcprocarraygroup.actions"></a>

根据等待事件的原因，我们建议采取不同的操作。可以通过使用 Amazon RDS 性能详情或查询 PostgreSQL 系统视图 `pg_stat_activity` 来识别 `IPC:ProcArrayGroupUpdate` 事件。

**Topics**
+ [

### 监控事务提交和回滚操作
](#apg-rpg-ipcprocarraygroup.actions.monitor)
+ [

### 减少并发性
](#apg-rpg-ipcprocarraygroup.actions.concurrency)
+ [

### 实施连接池
](#apg-rpg-ipcprocarraygroup.actions.pooling)
+ [

### 使用速度更快的存储
](#apg-rpg-ipcprocarraygroup.actions.storage)

### 监控事务提交和回滚操作
<a name="apg-rpg-ipcprocarraygroup.actions.monitor"></a>

**监控提交和回滚** – 提交和回滚数量的增加可能会导致 ProcArray 承受的压力增加。例如，如果 SQL 语句由于重复键冲突增多而开始失败，您可能会看到回滚次数增加，这可能会增加 ProcArray 争用和表膨胀。

Amazon RDS 数据库洞察提供 PostgreSQL 指标 `xact_commit` 和 `xact_rollback` 以报告每秒的提交和回滚次数。

### 减少并发性
<a name="apg-rpg-ipcprocarraygroup.actions.concurrency"></a>

**批处理事务** – 尽可能在单个事务中进行批量操作，以减少提交/回滚操作。

**限制并发性** - 减少并发活跃事务的数量，以缓解 ProcArray 上的锁争用。虽然需要进行一些测试，但减少并发连接总数可以减少争用并维持吞吐量。

### 实施连接池
<a name="apg-rpg-ipcprocarraygroup.actions.pooling"></a>

**连接池解决方案** - 使用连接池来有效地管理数据库连接，从而减少后端的总数，进而减少 ProcArray 上的工作负载。虽然需要进行一些测试，但减少并发连接总数可以减少争用并维持吞吐量。

**减少连接风暴** – 同样，频繁创建和终止连接的模式会给 ProcArray 带来额外的压力。通过减少这种模式，可以减少总体争用。

### 使用速度更快的存储
<a name="apg-rpg-ipcprocarraygroup.actions.storage"></a>

**专用日志卷** – 如果 `IPC:ProcArrayGroupUpdate` 等待事件伴随着很多 `IO:WALWrite` 等待事件，则设置专用日志卷可以减少写入 WAL 的瓶颈。反过来，这会提高提交的性能。

有关更多信息，请参阅[专用日志卷](https://docs.amazonaws.cn/AmazonRDS/latest/UserGuide/USER_PIOPS.dlv.html)。