max_connectionsに対する接続使用量を測定
PostgreSQLセッションコマンド
-- Capacity: used slots and slots left for regular users
SELECT max_conn,
reserved,
used,
max_conn - reserved - used AS free_for_normal_users,
round(100.0 * used / max_conn, 1) AS used_pct
FROM (SELECT current_setting('max_connections')::int AS max_conn,
current_setting('superuser_reserved_connections')::int
+ coalesce(current_setting('reserved_connections', true)::int, 0) AS reserved,
(SELECT count(*) FROM pg_stat_activity WHERE backend_type = 'client backend') AS used) x;
-- Breakdown by database, user, application and state
SELECT datname, usename, application_name, state,
count(*) AS sessions,
max(now() - state_change) AS longest_in_state
FROM pg_stat_activity
WHERE backend_type = 'client backend'
GROUP BY datname, usename, application_name, state
ORDER BY sessions DESC;
-- Role and database connection limits
SELECT rolname, rolconnlimit FROM pg_roles WHERE rolconnlimit <> -1;
SELECT datname, datconnlimit FROM pg_database WHERE datconnlimit <> -1;概要
max_connectionsに対して使用中の接続スロットと一般ユーザーに残っているスロット、データベース/ユーザー/アプリケーション/状態別の内訳、設定されたCONNECTION LIMITを表示する。
使用する場面
'too many clients already' / 'remaining connection slots are reserved'エラー時、キャパシティ計画時、プーラーの必要性の評価時に。
注意
max_connectionsはクライアントバックエンドのみを制限する。autovacuumワーカー、バックグラウンドワーカー、walsenderは別のスロットを使用する。最後のsuperuser_reserved_connectionsのスロット(PG16以降はreserved_connectionsも)は一般ユーザーには使用できない。max_connectionsを数百から数千に引き上げる代わりに、PgBouncerなどのプーラーを使用する: 各接続は個別のプロセスであり、メモリとスナップショットのコストは接続数とともに増加する。多数の'idle'セッションはアプリケーションプールが大きすぎることを示す。ALTER ROLE ... CONNECTION LIMITで暴走したアプリケーションがすべてのスロットを消費するのを防ぐ。max_connectionsの変更には再起動が必要。