ほとんどのUNIXプラットフォームでは、PostgreSQLは、個々のサーバプロセスが容易に識別できるように、ps
によって報告されるコマンドタイトル部分を変更します。
以下に表示例を示します。
$ ps auxww | grep ^postgres postgres 15551 0.0 0.1 57536 7132 pts/0 S 18:02 0:00 postgres -i postgres 15554 0.0 0.0 57536 1184 ? Ss 18:02 0:00 postgres: writer process postgres 15555 0.0 0.0 57536 916 ? Ss 18:02 0:00 postgres: checkpointer process postgres 15556 0.0 0.0 57536 916 ? Ss 18:02 0:00 postgres: wal writer process postgres 15557 0.0 0.0 58504 2244 ? Ss 18:02 0:00 postgres: autovacuum launcher process postgres 15558 0.0 0.0 17512 1068 ? Ss 18:02 0:00 postgres: stats collector process postgres 15582 0.0 0.0 58772 3080 ? Ss 18:04 0:00 postgres: joe runbug 127.0.0.1 idle postgres 15606 0.0 0.0 58772 3052 ? Ss 18:07 0:00 postgres: tgl regression [local] SELECT waiting postgres 15610 0.0 0.0 58772 3056 ? Ss 18:07 0:00 postgres: tgl regression [local] idle in transaction
(ps
の適切な呼び出し方はプラットフォームによって異なります。
同様に、何が詳細に表示されるのかも異なります。
この例は最近のLinuxシステムのものです。)
この一覧の最初のプロセスはマスタサーバプロセスです。
表示されているコマンド引数は、起動時に使用されたものと同じものです。
次の5つのプロセスは、マスタプロセスから自動的に起動されるバックグラウンドワーカープロセスです。
(システムを統計情報コレクタが起動しないように設定していた場合は「統計情報コレクタ」はありません。同様に「自動バキュームランチャ」を無効にできます。)
残るプロセスはそれぞれ、1つのクライアント接続を取り扱うサーバプロセスです。
それぞれのプロセスは、次の形式のコマンドライン表示を設定します。
postgres:user
database
host
activity
ユーザ、データベース、(クライアント)ホストという項目はクライアントの存続期間中変更されることはありませんが、活動状況を示す部分は変わります。
活動状況は、idle
(つまり、クライアントからのコマンド待ち状態)、idle in transaction
(BEGIN
ブロックの内側でのクライアントの待ち状態)、またはSELECT
のようなコマンド種類名のいずれかとなります。
また、そのサーバプロセスが他のセッションによって保持されたロックを待っている状態の場合は、waiting
が追加されます。
上の例では、プロセス15606はプロセス15610におけるトランザクションの完了とそれに伴うロックの解放を待っていると推測することができます。
(他に実行中のセッションがありませんので、プロセス15610がブロックしている側であるはずです。
もっと複雑な場合ではpg_locks
システムビューを検索し、どのプロセスがどのプロセスをブロックしているか決定しなければなりません。)
cluster_nameが設定されていれば、ps
の出力でクラスタ名も表示されます。
$ psql -c 'SHOW cluster_name' cluster_name -------------- server1 (1 row) $ ps aux|grep server1 postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: server1: writer process ...
update_process_titleを無効にした場合、活動情報を示す部分は更新されません。 新しいプロセスが起動した時に一度、プロセスの表題は設定されます。 プラットフォームの中には、これによりコマンドごとのオーバヘッドをかなり抑えられるものもありますし、まったく意味がないものもあります。
Solarisでは特別な取り扱いが必要です。
/bin/ps
ではなく、/usr/ucb/ps
を使用しなければなりません。
また、w
フラグを1つではなく2つ使用しなければなりません。
さらに、元のpostgres
の呼び出しに関するps
のステータス表示は、各サーバプロセスに関するステータス表示よりも短くなければなりません。
この3条件を全て満たさないと、各サーバプロセスのps
の出力は、元のpostgresのコマンドラインのものになってしまいます。