idle_in_transaction_session_timeout の閾値を設定するための調査方法について教えてください
質問
RDS for PostgreSQL を運用しています。アプリケーションの不具合などで idle in transaction の状態が長く続き、テーブルロックが保持されてしまう事象を防ぐため、パラメータグループで idle_in_transaction_session_timeout を設定したいと考えています。
しかし、このタイムアウト値をいくつに設定すれば良いのか、適切な閾値の判断に困っています。
log_statement などを有効にしてログを調査してみましたが、セッション全体の時間は追えても、「トランザクション内で何もしていないアイドル時間」だけを正確に切り出すことはできませんでした。
正常なバッチ処理などを誤って切断しない、安全かつ効果的なタイムアウト値を設定するために、どのようにしてアイドル時間を調査したら良いのか教えてください。
回答
Performance Insights のカウンターメトリクス idle_in_transaction_max_time をご利用ください。
Performance Insights カウンターメトリクス - Amazon Relational Database Service
Counter | タイプ | 単位 | メトリクス | 説明 |
---|---|---|---|---|
idle_in_transaction_max_time | State | [秒] | db.state.idle_in_transaction_max_time | idle in transaction 状態で実行されている最も長いトランザクションの時間を秒単位で表します。 |
このメトリクスは、「idle in transaction 状態にあるトランザクションの最大継続時間」を秒単位で直接示してくれるため、データベースで発生している実際の最大アイドル時間を把握できます。
本メトリクスを一定期間(一週間など、通常の業務サイクルが含まれる期間)監視し、最大値を確認します。これが、通常の運用で発生しうる最大のアイドル時間の実測値となります。
実測値に安全マージンを加えた値を、パラメータグループ idle_in_transaction_session_timeout へ設定してください。
まとめ
idle_in_transaction_session_timeout の設定に悩んだら、Performance Insights の idle_in_transaction_max_time メトリクスを確認しましょう。
この記事がどなたかのお役に立てば幸いです。