DBAtlas · Atlas für Datenbankbetrieb

Verbindungsnutzung im Verhältnis zu max_connections messen

PostgreSQLSessions

Befehl

-- 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;

Was es tut

Zeigt belegte Verbindungsslots und die für normale Benutzer verbleibenden im Verhältnis zu max_connections, die Aufschlüsselung nach Datenbank/Benutzer/Anwendung/Zustand sowie konfigurierte CONNECTION LIMITs.

Wann einsetzen

Bei den Fehlern 'too many clients already' / 'remaining connection slots are reserved', bei der Kapazitätsplanung oder bei der Bewertung, ob ein Pooler nötig ist.

Vorsicht

max_connections begrenzt nur Client-Backends; Autovacuum-Worker, Background Worker und walsender nutzen eigene Slots. Die letzten superuser_reserved_connections-Slots (plus reserved_connections ab PG16) sind für normale Benutzer gesperrt. Statt max_connections auf Hunderte oder Tausende anzuheben, nutze einen Pooler wie PgBouncer: Jede Verbindung ist ein eigener Prozess, und Speicher- und Snapshot-Kosten wachsen mit der Verbindungszahl. Viele 'idle'-Sessions deuten auf einen überdimensionierten Anwendungs-Pool hin. Verhindere mit ALTER ROLE ... CONNECTION LIMIT, dass eine außer Kontrolle geratene Anwendung alle Slots belegt; eine Änderung von max_connections erfordert einen Neustart.

In DBAtlas öffnen →

Verwandte Einträge