

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

`IPC:ProcArrayGroupUpdate` イベントは、セッションが、グループリーダーによるオペレーション終了時のトランザクションステータスの更新を待機しているときに発生します。PostgreSQL は通常、IPC タイプの待機イベントを並列クエリオペレーションに関連付けますが、この特定の待機イベントは並列クエリに固有ではありません。

**Topics**
+ [サポート対象エンジンバージョン](#apg-rpg-ipcprocarraygroup.supported)
+ [Context](#apg-rpg-ipcprocarraygroup.context)
+ [待機時間が増加する原因の可能性](#apg-rpg-ipcprocarraygroup.causes)
+ [アクション](#apg-rpg-ipcprocarraygroup.actions)

## サポート対象エンジンバージョン
<a name="apg-rpg-ipcprocarraygroup.supported"></a>

この待機イベント情報は、Aurora PostgreSQL のすべてのバージョンでサポートされています。

## Context
<a name="apg-rpg-ipcprocarraygroup.context"></a>

**プロセス配列の理解** – プロセス (proc) 配列は PostgreSQL の共有メモリ構造です。トランザクションの詳細など、実行中のすべてのプロセスに関する情報を保持します。トランザクションの完了時 (`COMMIT` または `ROLLBACK`) に、ProcArray を更新して変更を反映し、配列から transactionID をクリアする必要があります。トランザクションを完了しようとするセッションは、ProcArray で排他的ロックを取得する必要があります。これにより、他のプロセスが共有ロックまたは排他的ロックを取得できなくなります。

**グループ更新メカニズム** – COMMIT または ROLLBACK の実行中に、バックエンドプロセスが排他的モードで ProcArrayLock を取得できない場合、ProcArrayGroupMember という特別なフィールドを更新します。これにより、終了する予定のセッションのリストにトランザクションが追加されます。このバックエンドプロセスはスリープし、スリープ時間は ProcArrayGroupUpdate 待機イベントとして計測されます。procArrayGroupMember を使用した ProcArray の最初のプロセスはリーダープロセスと呼ばれ、ProcArrayLock を排他的モードで取得します。次に、グループ transactionID のクリアを待機しているプロセスのリストをクリアします。これが完了すると、リーダーは ProcArrayLock をリリースし、このリストのすべてのプロセスを起動して、トランザクションが完了したことを通知します。

## 待機時間が増加する原因の可能性
<a name="apg-rpg-ipcprocarraygroup.causes"></a>

実行中のプロセスが多いほど、リーダーが排他的モードで procArrayLock を保持する時間が長くなります。したがって、グループ更新シナリオでより多くの書き込みトランザクションが発生すると、`ProcArrayGroupUpdate` 待機イベントを待っているプロセスが蓄積される可能性があります。Database Insights のトップ SQL ビューでは、COMMIT がこの待機イベントの大部分を持つステートメントであることがわかります。これは予想される動作ですが、実行する特定の書き込み SQL をより詳細に調査して、実行する適切なアクションを決定する必要があります。

## アクション
<a name="apg-rpg-ipcprocarraygroup.actions"></a>

待機イベントの原因に応じたさまざまなアクションをお勧めします。Amazon RDS Performance Insights を使用するか、PostgreSQL システムビュー `pg_stat_activity` をクエリして、`IPC:ProcArrayGroupUpdate` イベントを特定します。

**Topics**
+ [トランザクションコミットおよびロールバックオペレーションのモニタリング](#apg-rpg-ipcprocarraygroup.actions.monitor)
+ [同時実行数の削減](#apg-rpg-ipcprocarraygroup.actions.concurrency)
+ [接続プーリングを実装する](#apg-rpg-ipcprocarraygroup.actions.pooling)

### トランザクションコミットおよびロールバックオペレーションのモニタリング
<a name="apg-rpg-ipcprocarraygroup.actions.monitor"></a>

**コミットとロールバックのモニタリング** – コミットとロールバックの数が増えると、ProcArray への負荷が増大する可能性があります。例えば、重複するキー違反の増加が原因で SQL ステートメントが失敗し始めた場合、ロールバックが増加し、ProcArray の競合とテーブルの肥大化が増加する可能性があります。

Amazon RDS Database Insights は PostgreSQL メトリクス `xact_commit` と `xact_rollback` を提供し、1 秒あたりのコミット数とロールバック数を報告します。

### 同時実行数の削減
<a name="apg-rpg-ipcprocarraygroup.actions.concurrency"></a>

**トランザクションのバッチ処理** – 可能であれば、コミット/ロールバック操作を減らすために、単一のトランザクションでバッチ操作を行います。

**同時実行数の制限** – ProcArray でのロック競合を軽減するために、同時にアクティブなトランザクションの数を減らします。ある程度のテストが必要になりますが、同時接続の合計数を減らすと、競合を減らし、スループットを維持できます。

### 接続プーリングを実装する
<a name="apg-rpg-ipcprocarraygroup.actions.pooling"></a>

**接続プーリングソリューション** – 接続プーリングを使用してデータベース接続を効率的に管理し、バックエンドの合計数を減らし、ProcArray のワークロードを削減します。ある程度のテストが必要になりますが、同時接続の合計数を減らすと、競合を減らし、スループットを維持できます。

詳細については、「[Aurora PostgreSQL の接続プーリング](https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/AuroraPostgreSQL.BestPractices.connection_pooling.html)」を参照してください。

**接続ストームの軽減** – 同様に、頻繁に接続を作成および終了するパターンにより、ProcArray にさらなる負荷がかかります。このパターンを減らすことで、全体的な競合が軽減されます。