DBAtlas · Atlas d'exploitation des bases de données

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 clients

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

Ouvrir dans DBAtlas →