DBAtlas · Atlas für Datenbankbetrieb

Connection Storm (zu viele Verbindungen)

Symptom

'too many connections', 'ORA-00018', 'remaining connection slots reserved' – neue Verbindungen werden abgewiesen.

1. Aktuellen Zustand messen

Wie viele Verbindungen gibt es, wo liegt das Limit, und wie viele sind aktiv bzw. idle?

Oracle

SELECT COUNT(*) total, SUM(CASE WHEN status='ACTIVE' THEN 1 ELSE 0 END) active FROM v$session WHERE type='USER';

PostgreSQL

SELECT count(*), state FROM pg_stat_activity WHERE backend_type = 'client backend' GROUP BY state;

MySQL

SHOW STATUS LIKE 'Threads_connected'; SHOW VARIABLES LIKE 'max_connections';

SQL Server

SELECT COUNT(*), status FROM sys.dm_exec_sessions WHERE is_user_process=1 GROUP BY status;

Redis

INFO clients

2. Quelle ermitteln: wer/von wo

Welche Anwendung, welcher Host bzw. Benutzer öffnet die Verbindungen? Meist ist der Pool eines einzelnen Anwendungsservers explodiert oder es gibt ein Connection Leak (viele Sessions im Zustand idle in transaction).

PostgreSQL

SELECT client_addr, usename, state, count(*) FROM pg_stat_activity WHERE backend_type = 'client backend' GROUP BY 1,2,3 ORDER BY 4 DESC;

MySQL

SELECT host, user, count(*) FROM information_schema.processlist GROUP BY host, user ORDER BY 3 DESC;

SQL Server

SELECT host_name, program_name, login_name, COUNT(*) FROM sys.dm_exec_sessions WHERE is_user_process=1 GROUP BY host_name, program_name, login_name ORDER BY 4 DESC;

3. Sofort Luft verschaffen

Räume lange inaktive bzw. idle-in-transaction-Verbindungen auf. Trenne bei Bedarf die Verbindungen der verursachenden Anwendung gesammelt. Nutze den für den Admin-Login reservierten Slot (PG superuser_reserved_connections).

4. Die richtige Lösung: Connection Pooling

max_connections unbegrenzt zu erhöhen verbraucht Speicher und verschiebt das Problem nur. Die richtige Lösung ist ein Connection Pool auf Anwendungsseite (HikariCP, PgBouncer, ProxySQL) mit einer sinnvollen Pool-Größe. Die Pool-Größe liegt typischerweise bei etwa (cores*2 + Anzahl der Platten) – siehe den Rechner unter Tools > Connection Pool.

5. Leaks und Wiederholung verhindern

Stelle sicher, dass die Anwendung Verbindungen schließt (finally/using). Setze idle_in_transaction_session_timeout und wait_timeout. Richte einen Alarm für die Verbindungsanzahl ein.

In DBAtlas öffnen →