DBAtlas · Atlas de operaciones de bases de datos

Connection storm (demasiadas conexiones)

Síntoma

'too many connections', 'ORA-00018', 'remaining connection slots reserved': se están rechazando conexiones nuevas.

1. Mida el estado actual

¿Cuántas conexiones hay, cuál es el límite y cuántas están activas frente a inactivas?

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. Identifique el origen: quién/desde dónde

¿Qué aplicación/host/usuario está abriendo las conexiones? Normalmente el pool de un servidor de aplicaciones se ha desbordado o hay una fuga de conexiones (un montón de sesiones 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. Gane margen de inmediato

Limpie las conexiones inactivas durante mucho tiempo/idle in transaction. Si es necesario, cierre en bloque las conexiones de la aplicación problemática. Use el slot reservado para el inicio de sesión de administración (PG superuser_reserved_connections).

4. La solución correcta: connection pooling

Aumentar max_connections sin límite consume memoria y solo pospone el problema. La solución correcta es un pool de conexiones en el lado de la aplicación (HikariCP, PgBouncer, ProxySQL) con un tamaño de pool razonable. El tamaño del pool suele rondar (núcleos*2 + número de discos); consulte la calculadora Herramientas > Connection Pool.

5. Evite fugas y recurrencias

Asegúrese de que la aplicación cierre las conexiones (finally/using). Configure idle_in_transaction_session_timeout y wait_timeout. Configure una alerta sobre el número de conexiones.

Abrir en DBAtlas →