Tempête de connexions (trop de connexions)
Symptôme
'too many connections', 'ORA-00018', 'remaining connection slots reserved' : les nouvelles connexions sont rejetées.
1. Mesurez l'état actuel
Combien de connexions y a-t-il, quelle est la limite, et combien sont actives ou inactives ?
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. Identifiez la source : qui/d'où
Quelle application/quel hôte/quel utilisateur ouvre les connexions ? Généralement, le pool d'un serveur d'application a explosé ou il y a une fuite de connexions (une pile de sessions 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. Donnez-vous immédiatement de la marge
Nettoyez les connexions inactives de longue date/idle in transaction. Si nécessaire, coupez en masse les connexions de l'application fautive. Utilisez le slot réservé à la connexion d'administration (PG superuser_reserved_connections).
4. La bonne solution : le connection pooling
Augmenter max_connections sans limite consomme de la mémoire et ne fait que repousser le problème. La bonne solution est un pool de connexions côté application (HikariCP, PgBouncer, ProxySQL) avec une taille de pool raisonnable. La taille du pool est typiquement d'environ (cores*2 + nombre de disques) ; voir le calculateur Outils > Connection Pool.
5. Évitez les fuites et la récidive
Assurez-vous que l'application ferme les connexions (finally/using). Définissez idle_in_transaction_session_timeout et wait_timeout. Mettez en place une alerte sur le nombre de connexions.