« PostgreSQLでDBサイズを調べる(再) | トップページ | アプリケーションのインストールができない場合 »

2014.06.18

PostgreSQLでロック競合の"深さ"を可視化する

Let's Postgresを読んでいる中で、「これ標準で提供してくれないかなあ」と思ってるのがこのpg_lock_chainビューである。
これは再帰SQLの解説をするところで例示されている。

ref)[再帰SQL]

下ごしらえがいくつか必要となるのだが、これ便利。
私が以前に作成したpg_locksとpg_stat_activityの連結では直前のロック獲得とそのSQLがわかるだけだが、このpg_lock_chainではロックを連鎖して表現してくれるので、個々のプロセスの依存関係が一表で見ることができ、問題調査に非常に役に立つ。

=# SELECT chain, level, locktag, pid, mode, granted
     FROM pg_lock_chain
    ORDER BY chain, level;

 chain | level |        locktag        | pid  |     mode      | granted
-------+-------+-----------------------+------+---------------+---------
     1 |     1 | transactionid 9930    | 3976 | ShareLock     | f
     1 |     2 | transactionid 9930    | 3912 | ExclusiveLock | t
     2 |     1 | tuple 21509 22126 0 1 | 1992 | ExclusiveLock | f
     2 |     2 | tuple 21509 22126 0 1 | 3976 | ExclusiveLock | t
     2 |     3 | transactionid 9930    | 3976 | ShareLock     | f
     2 |     4 | transactionid 9930    | 3912 | ExclusiveLock | t
(6 rows)

上記は実装後の利用例である。(元記事より引用!)
pid 3912がchain 1,2双方の連鎖の終端に含まれていて、このプロセスが元凶であることが、大変わかりやすい。
元記事本文にもあったが、pg_stat_activityと組み合わせれば(元々私がやっていたように)元凶のプロセスが発行しているSQLも調査できるので、対策を立てやすくなるだろう。

私の担当プロジェクトには、こっそりこの定義を埋め込んでおいたので問題ないのだが、標準のシステム管理用ビューとして含まれていたらきっと便利だよねー

|

« PostgreSQLでDBサイズを調べる(再) | トップページ | アプリケーションのインストールができない場合 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2022/59835352

この記事へのトラックバック一覧です: PostgreSQLでロック競合の"深さ"を可視化する:

« PostgreSQLでDBサイズを調べる(再) | トップページ | アプリケーションのインストールができない場合 »