DBAtlas · 데이터베이스 운영 아틀라스

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' 오류 시, 용량 계획 시, pooler 필요성을 평가할 때.

주의

max_connections는 클라이언트 backend만 제한한다. autovacuum worker, background worker, walsender는 별도 슬롯을 사용한다. 마지막 superuser_reserved_connections 슬롯(PG16+에서는 reserved_connections 추가)은 일반 사용자에게 닫혀 있다. max_connections를 수백, 수천으로 올리는 대신 PgBouncer 같은 pooler를 사용한다. 모든 연결은 별도 프로세스이며 메모리와 스냅샷 비용이 연결 수에 따라 증가한다. 'idle' 세션이 많으면 애플리케이션 pool이 과도하게 큰 것이다. 폭주하는 애플리케이션이 모든 슬롯을 소비하지 않도록 ALTER ROLE ... CONNECTION LIMIT으로 막는다. max_connections 변경에는 재시작이 필요하다.

DBAtlas에서 열기 →

관련 항목