커넥션 폭주 (too many connections)
'too many connections', 'remaining connection slots reserved' 또는 ORA-00018이 발생해 새 연결이 거부되고 있다. 원인을 찾고, 지금 압박을 완화하고, 근본적으로 해결한다.
상황 측정: 연결이 몇 개이고 그중 활성은 몇 개인가?
먼저 전체 연결 수, 한도, 활성/유휴 비율을 본다.
SELECT status, COUNT(*) FROM v$session WHERE type='USER' GROUP BY status;
SELECT name, value FROM v$parameter WHERE name IN ('processes','sessions');- 대부분의 연결이 idle / idle in transaction이다
- 대부분 활성이다. 원인을 찾아야 한다
누가/어디서? 연결을 출처별로 그룹화한다
보통 단일 애플리케이션 서버의 풀이 폭증했거나 연결 누수가 있다. 호스트/사용자/애플리케이션별 분포를 본다.
SELECT client_addr, usename, application_name, count(*) FROM pg_stat_activity GROUP BY 1,2,3 ORDER BY 4 DESC;- 단일 애플리케이션/호스트가 연결을 폭증시켰다(풀)
- 부하가 실제로 증가했다. 모두 정상적이고 활성이다
근본 원인: 유휴 연결 누적 / 누수
연결이 열리고 닫히지 않거나 'idle in transaction'으로 남아 slot을 헛되이 점유한다.
근본 원인: 애플리케이션 풀 폭증
애플리케이션 서버의 connection pool이 무제한/너무 크거나 누수가 있다. 그것이 연결을 만들어 내고 있다.
근본 원인: 실제 부하 증가
연결은 정상적이고 활성이다. 용량이 실제로 부족하다.