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には、checkpointerautovacuum 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_activitydatnameusenameでグルーピングすると、データベースやユーザーごとの接続数の内訳を確認できる。

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の導入を検討する。