web-dev-qa-db-ja.com

SQLクエリなし、またはpostgres自体に接続せずにpostgresオープン接続をカウント

監視スクリプトの場合、postgresデータベースへの開いている接続の数を数える必要があります。これは、クライアント接続を開き、pg_stat_activityテーブルでカウントを実行することで簡単に実行できます。

ただし、接続の最大数に既に達している場合、接続とチェックスクリプトは、接続を待機してハングします。これはチェックスクリプトが複雑になり、不確定な時間ハングする可能性があるため、これは使用しない方がよいでしょう。また、接続は1つだけですが、クライアント接続を開くと、接続プールが増えるため、理想的ではありません。

Pg_stat_activityテーブルを見ると、接続のプロセスIDをリストする列があります。これにより、Linuxコマンドのpsを使用して現在実行中のプロセスを一覧表示し、protgresに関連するプロセスをgrepするというアイデアが得られました。具体的には、私が使用しているコマンドは次のとおりです。

ps -ef | grep 'postgres' | grep 'root' | grep -v 'grep' | grep -v 'su-postgres' | wc -l

これはpg_stat_activityのエントリ数と一致しているように見えますが、常にではないが1だけずれている場合があります(上下でもかまいません)。

プロセスリストに含まれている可能性があるものを含めたり、grepしたりする必要があるものはありますか?または、db接続を使用せずにこれを行う別の方法はありますか?

2
scottod

安全で信頼できる方法は、netstatを使用することです。

netstat --numeric-ports | grep 5432これにより、アクティブな接続が表示されます。もちろん問題は、いくつかの誤検知がある可能性があることです。ただし、ほとんどの場合は次のように機能します。

netstat --numeric-ports | awk '/(localhost:5432|PGSQL.5432)/ {print $0}' | wc -l

psを使用して)プロセステーブルを検査しても、開いている接続の数が必ずしも得られるとは限りません。起動時に必要な数より多くのワーカープロセスを開始しない理由はありません。

3
Chris Travers

あなたのカウントを出しているものを見てください。 ps aux | grep postgres | grep -v grepを使用すると、7つのサーバープロセスに加えて、開いているクライアント接続ごとに1つ表示されます。

USER         PID  %CPU %MEM     VSZ    RSS TT  STAT STARTED         TIME COMMAND
pgsql      11755   0.0  0.1   73420  11568 ??  Is    8:16pm      0:00.00 postgres: logger process    (postgres)
pgsql      11759   0.0  0.2  111404  15808 ??  Is    8:16pm      0:00.03 postgres: checkpointer process    (postgres)
pgsql      11760   0.0  0.4  111404  35888 ??  Ss    8:16pm      0:00.31 postgres: writer process    (postgres)
pgsql      11761   0.0  0.1  111404  11964 ??  Ss    8:16pm      0:00.24 postgres: wal writer process    (postgres)
pgsql      11762   0.0  0.2  115500  14612 ??  Ss    8:16pm      1:36.72 postgres: autovacuum launcher process    (postgres)
pgsql      11763   0.0  0.2   77516  13300 ??  Ss    8:16pm      3:44.84 postgres: stats collector process    (postgres)
pgsql      30021   0.0  0.2  115500  14244 ??  Is    3:50pm      0:00.00 postgres: shane postgres ::1(11365)  (postgres)
pgsql      30455   0.0  0.2  115500  14236 ??  Is    3:56pm      0:00.00 postgres: shane postgres ::1(60588)  (postgres)
pgsql      30884   0.0  0.3  115500  22640 ??  Is    4:04pm      0:00.07 postgres: tinder tinderbox ::1(23149)  (postgres)
pgsql      11754   0.0  0.2  111404  15356 37- S     8:16pm      0:24.92 /usr/local/bin/postgres -D /usr/local/pgsql/data

私はFreeBSDを使用しており、最初のサーバーコマンドの後のプロセスはすべてpostgres:で始まり、(postgres)で終わります。サーバーヘルパーのコマンドにはすべてprocessが含まれています。

したがって、ps aux | grep postgres: | grep -v grep | grep -v process | wc -lは、あなたが求めている正確な数字を教えてくれているようです。

1
sambler

質問を締めくくるために、次のコマンドの出力を使用しました。これを正確にどうするかはわかりませんでしたが、これにより十分に近い数値が得られます。

ps -ef | grep 'postgres' | grep 'root' | grep -v 'grep' | grep -cv 'su - postgres'
0
scottod