max_connectionsで接続数の上限を確認する
PostgreSQLで同時接続数の上限を確認するには、max_connectionsパラメータをSHOWコマンドで確認する。
SHOW max_connections;
max_connections
------------------
100
(1 row)
pg_settingsシステムカタログを参照しても同様に確認できる。
SELECT name, setting, unit
FROM pg_settings
WHERE name IN ('max_connections', 'superuser_reserved_connections');
name | setting | unit
---------------------------------+---------+------
max_connections | 100 |
superuser_reserved_connections | 3 |
(2 rows)
superuser_reserved_connectionsは、スーパーユーザー専用に予約される接続数である。
一般ユーザーが接続できる上限は、実質的にmax_connectionsからsuperuser_reserved_connectionsを引いた値になる。
pg_stat_activityで現在の接続数を確認する
現在の接続数を確認するには、pg_stat_activityビューを使用する。
SELECT count(*) FROM pg_stat_activity;
count
-------
6
(1 row)
ただしpg_stat_activityには、checkpointerやautovacuum launcherなどPostgreSQL内部のバックグラウンドプロセスも含まれる。
これらのプロセスはmax_connectionsの上限にカウントされないため、クライアントからの接続数を正確に数える場合はbackend_type列でclient backendに絞り込む。
SELECT pid, datname, usename, backend_type, state
FROM pg_stat_activity
ORDER BY pid;
pid | datname | usename | backend_type | state
-----+----------+----------+--------------------------------+--------
60 | | | checkpointer |
61 | | | background writer |
63 | | | walwriter |
64 | | | autovacuum launcher |
65 | | postgres | logical replication launcher |
108 | postgres | postgres | client backend | active
(6 rows)
SELECT count(*)
FROM pg_stat_activity
WHERE backend_type = 'client backend';
count
-------
1
(1 row)
データベース・ユーザーごとの接続数の内訳を確認する
pg_stat_activityをdatnameやusenameでグルーピングすると、データベースやユーザーごとの接続数の内訳を確認できる。
SELECT datname, usename, state, count(*)
FROM pg_stat_activity
WHERE backend_type = 'client backend'
GROUP BY datname, usename, state
ORDER BY datname;
pg_stat_databaseビューのnumbackendsカラムを使うと、データベースごとの接続数をより簡潔に確認できる。
SELECT datname, numbackends
FROM pg_stat_database
WHERE datname IS NOT NULL;
datname | numbackends
-----------+-------------
postgres | 1
template1 | 0
template0 | 0
(3 rows)
残りの接続数を計算する
max_connectionsと現在の接続数を組み合わせると、残りの接続数を計算できる。
SELECT
(SELECT setting::int FROM pg_settings WHERE name = 'max_connections') AS max_connections,
(SELECT count(*) FROM pg_stat_activity WHERE backend_type = 'client backend') AS current_connections,
(SELECT setting::int FROM pg_settings WHERE name = 'max_connections')
- (SELECT count(*) FROM pg_stat_activity WHERE backend_type = 'client backend') AS remaining_connections;
max_connections | current_connections | remaining_connections
-----------------+----------------------+------------------------
100 | 1 | 99
(1 row)
接続数が上限に近づくと新規接続時にFATAL: sorry, too many clients alreadyエラーが発生するため、定期的に残りの接続数を確認し、アプリケーション側のコネクションプール設定やPgBouncerの導入を検討する。
\第一線のプログラマーの行動原理を学べる!/
