監視スクリプトの場合、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接続を使用せずにこれを行う別の方法はありますか?
安全で信頼できる方法は、netstatを使用することです。
netstat --numeric-ports | grep 5432
これにより、アクティブな接続が表示されます。もちろん問題は、いくつかの誤検知がある可能性があることです。ただし、ほとんどの場合は次のように機能します。
netstat --numeric-ports | awk '/(localhost:5432|PGSQL.5432)/ {print $0}' | wc -l
(ps
を使用して)プロセステーブルを検査しても、開いている接続の数が必ずしも得られるとは限りません。起動時に必要な数より多くのワーカープロセスを開始しない理由はありません。
あなたのカウントを出しているものを見てください。 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
は、あなたが求めている正確な数字を教えてくれているようです。
質問を締めくくるために、次のコマンドの出力を使用しました。これを正確にどうするかはわかりませんでしたが、これにより十分に近い数値が得られます。
ps -ef | grep 'postgres' | grep 'root' | grep -v 'grep' | grep -cv 'su - postgres'