[アップデート]CloudWatch Database Insightsのロック分析機能がRDS for PostgreSQLにも対応しました
初めに
先週のアップデートですがCloudWatch Database InsightsがRDS for PostgreSQL上で実行されるクエリに対してロック分析(可視化)機能を提供するようになりました。
Aurora PostgreSQL側では2025/02頃に対応していた機能ですが、ついにRDS for PostgreSQL側でも利用できるようになった形となります。
これまでもロック解除待ちとなっているクエリはLock:xxxxというイベント(xxxxはロックの種別による)でDatabase Insights上で検出することができたのですが、ロック起因になっているトランザクションやそのクエリを確認することはできなかったため独自で分析が必要となっておりました。
PostgreSQLの場合リアルタイムであればpg_locksビューを確認する、もしくはlog_lock_waits等のロック関連のログパラメーターを事前に設定してログ分析する必要があったのですが、今回のアップデートでDatabase Insights上から簡単に依存を追跡できるようになりました。
なお本機能は現時点ではDatabase Insights Advanced の有効化が必要になりますのでご注意ください。
実際に確認してみる
本機能を利用するにあたりDatabase Insights Advancedが有効となっていれば特に追加の設定は必要ありません。
シンプルにトランザクション内で同一の行に対するUPDATEをかけて行レベルの排他ロックで競合させて確認してみます。
従来は「DBの負荷分析」タブでロックが起きている場合は以下の画像のようにグラフでもロックがかかっていることまでは確認できました。
今回追加されたのは「ロック分析」のタブでこちらを確認することで該当クエリのロックの原因を確認が可能となります。

また15分以上継続するロックが確認された場合は「ハイロックが検出されました」の表示が出るようです。
https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/Database-Insights-Lock-Analysis.html
CloudWatch がハイロックを検出すると、CloudWatch は [ロック分析] タブの [ハイロック検出] バナーを表示します。CloudWatch は、15 秒ごとにロックのスナップショットを 15 分間連続して取得すると、高ロック状態と判断します。
ロック分析の画面では以下のようになっておりツリーの元(赤枠)でロックの原因となっているクエリ、その枝葉(青枠)でそれが原因で止まっているクエリを確認することができます。
Blocking timeのカラムでロック元のクエリがどの程度の時間をかけて実行されているかも確認できますので、実行頻度等と合わせて対応の優先度の分析も可能です。

また時間を指定してその瞬間のロック状態を確認できますが(緑枠)、スナップショットは15秒ごとに取られています。
15秒未満の短いロック待ちでスナップショットの合間を縫っているようなケースでは表示されないケースはあると思いますので注意しましょう。

なおデフォルトでは上記画像の項目のみが表示されますが、歯車部分よりその他表示可能な項目が多数存在します。
詳しくは以下ドキュメントをご参照ください。

終わりに
RDS for PostgreSQLにも対応したロック分析機能を試してみました。
この辺りをPostgreSQL上で自力で頑張ろうとするとそれなりに頑張らないといけないのでパッと可視化できるのは非常にありがたい機能です。
Database Insights Advanced限定の機能なためStandardと違い無料では利用できないサービスとなっております。
(現時点で東京リージョンでは vCPUあたり$0.0125/h)
そのため環境によってはコストの関係で永続的に有効化は難しいかと思いますが、StandardとAdvanced自体は後からでも切り替えられる項目なのでデータベースのパフォーマンスに悩みがある場合は一時的に調査のために有効化し不要になれば無効化するような形も検討してみましょう。







