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 clients2. 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.