

# Amazon DevOps Guru のプロアクティブインサイトによる Aurora PostgreSQL のチューニング
<a name="PostgreSQL.Tuning_proactive_insights"></a>

DevOps Guru のプロアクティブインサイトは、問題の原因となる可能性がある Aurora PostgreSQL DB クラスターの条件を検出して、問題が発生する前に通知します。プロアクティブインサイトは、トランザクション接続で長時間アイドル状態になっている場合にアラートを送信できます。トランザクション接続で長時間アイドル状態になっている場合のトラブルシューティングの詳細については、「[データベースがトランザクション接続で長時間アイドル状態になっている](#proactive-insights.idle-txn)」を参照してください。

DevOps Guru では、次のことができます。
+ データベース構成を一般的な推奨設定と照合することで、データベースに関する多くの一般的な問題を防ぎます。
+ 未チェックのままにしておくと、後で大きな問題につながる可能性があるフリート内の重大な問題について警告します。
+ 新しく発見された問題について警告します。

すべてのプロアクティブインサイトには、問題の原因の分析と是正措置の推奨事項が含まれています。

Amazon DevOps Guru for Amazon RDS の詳細については、「[Amazon DevOps Guru for Amazon RDS で Aurora のパフォーマンスの異常を分析する](devops-guru-for-rds.md)」を参照してください。

## データベースがトランザクション接続で長時間アイドル状態になっている
<a name="proactive-insights.idle-txn"></a>

データベースへの接続が 1800 秒以上 `idle in transaction` 状態です。

**Topics**
+ [

### サポート対象エンジンバージョン
](#proactive-insights.idle-txn.context.supported)
+ [

### Context
](#proactive-insights.idle-txn.context)
+ [

### この問題の考えられる原因
](#proactive-insights.idle-txn.causes)
+ [

### アクション
](#proactive-insights.idle-txn.actions)
+ [

### 関連するメトリクス
](#proactive-insights.idle-txn.metrics)

### サポート対象エンジンバージョン
<a name="proactive-insights.idle-txn.context.supported"></a>

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

### Context
<a name="proactive-insights.idle-txn.context"></a>

`idle in transaction` 状態のトランザクションがロックを保持していて、他のクエリをブロックしている可能性があります。また、`VACUUM` (自動バキュームを含む) がデッド行をクリーンアップするのを妨げて、インデックスやテーブルが肥大化したり、トランザクション ID がラップアラウンドしたりします。

### この問題の考えられる原因
<a name="proactive-insights.idle-txn.causes"></a>

インタラクティブセッションで BEGIN または START TRANSACTION を使用して開始されたトランザクションが、COMMIT、ROLLBACK、または END コマンドを使用しても終了していません。これにより、トランザクションは `idle in transaction` 状態に移行します。

### アクション
<a name="proactive-insights.idle-txn.actions"></a>

`pg_stat_activity` クエリを実行すると、アイドル状態のトランザクションを見つけることができます。

SQL クライアントで、次のクエリを実行して、`idle in transaction` 状態にあるすべての接続を一覧表示し、継続時間順に並べ替えます。

```
SELECT now() - state_change as idle_in_transaction_duration, now() - xact_start as xact_duration,* 
FROM  pg_stat_activity 
WHERE state  = 'idle in transaction'
AND   xact_start is not null
ORDER BY 1 DESC;
```

インサイトの原因に応じて、異なるアクションをお勧めします。

**Topics**
+ [

#### 接続を終了する
](#proactive-insights.idle-txn.actions.end-txn)
+ [

#### 接続を作成する
](#proactive-insights.idle-txn.actions.end-connection)
+ [

#### idle\$1in\$1session\$1timeout パラメータを設定する
](#proactive-insights.idle-txn.actions.parameter)
+ [

#### AUTOCOMMIT のステータスを確認する
](#proactive-insights.idle-txn.actions.autocommit)
+ [

#### アプリケーションコード内のトランザクションロジックを確認する
](#proactive-insights.idle-txn.actions.app-logic)

#### 接続を終了する
<a name="proactive-insights.idle-txn.actions.end-txn"></a>

インタラクティブセッションで BEGIN または START TRANSACTION を使用してトランザクションを開始すると、トランザクションは `idle in transaction` 状態に移行します。COMMIT、ROLLBACK、END コマンドを実行してトランザクションを終了するか、接続を完全に切断してトランザクションをロールバックするまで、この状態のままになります。

#### 接続を作成する
<a name="proactive-insights.idle-txn.actions.end-connection"></a>

次のクエリを使用して、アイドル状態のトランザクションがある接続を終了します。

```
SELECT pg_terminate_backend(pid);
```

pid は接続のプロセス ID です。

#### idle\$1in\$1session\$1timeout パラメータを設定する
<a name="proactive-insights.idle-txn.actions.parameter"></a>

パラメータグループの `idle_in_transaction_session_timeout` パラメータを設定します。このパラメータを設定する利点は、手動操作を行わなくても、長時間アイドル状態になっているトランザクションを終了できることです。このパラメータの詳細については、「[PostgreSQL documentation](https://www.postgresql.org/docs/current/runtime-config-client.html)」(PostgreSQL ドキュメント) を参照してください。

接続が終了し、指定した時間を超えてトランザクションが idle\$1in\$1transaction 状態にあると、PostgreSQL ログファイルに次のメッセージが報告されます。

```
FATAL: terminating connection due to idle in transaction timeout
```

#### AUTOCOMMIT のステータスを確認する
<a name="proactive-insights.idle-txn.actions.autocommit"></a>

AUTOCOMMIT は、デフォルトで有効になっています。ただし、クライアントで誤ってオフにした場合は、必ずオンに戻してください。
+ psql クライアントで次のコマンドを実行します。

  ```
  postgres=> \set AUTOCOMMIT on
  ```
+ pgadmin で、下矢印から AUTOCOMMIT オプションを選択してオンにします。  
![\[pgadmin で、AUTOCOMMIT を選択して、オンにします。\]](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/images/apg-insight-pgadmin-autocommit.png)

#### アプリケーションコード内のトランザクションロジックを確認する
<a name="proactive-insights.idle-txn.actions.app-logic"></a>

アプリケーションロジックを調べ手、問題がない確認します。以下のアクションの場合を検討します。
+ アプリケーションで JDBC auto commit が true に設定されているかどうかを確認します。また、コード内で明示的な `COMMIT` コマンドを使用することも検討してください。
+ エラー処理ロジックをチェックして、エラー後にトランザクションがクローズされるかどうかを確認します。
+ トランザクションが開いているときに、アプリケーションがクエリによって返された行の処理に時間がかかるかどうかを確認します。その場合は、行を処理する前にトランザクションを閉じるようにアプリケーションをコーディングすることを検討してください。
+ トランザクションに長時間実行される操作が多数含まれていないか確認します。その場合は、1 つのトランザクションを複数のトランザクションに分割します。

### 関連するメトリクス
<a name="proactive-insights.idle-txn.metrics"></a>

以下の PI メトリクスがこのインサイトに関連しています。
+ idle\$1in\$1transaction\$1count - `idle in transaction` 状態にあるセッション数。
+ idle\$1in\$1transaction\$1max\$1time - `idle in transaction` 状態で最も長く実行されているトランザクションの継続時間。