Chaque connexion coûte de la mémoire, qu'elle travaille ou qu'elle attende. Relever la limite sur un serveur déjà au plafond de sa mémoire transforme une erreur de base en une machine qui swappe, ce qui est pire.
Regardez ce qui est connecté
SHOW PROCESSLIST;
SHOW STATUS LIKE 'Threads_connected';
SHOW VARIABLES LIKE 'max_connections';
- Beaucoup de lignes en Sleep - des connexions ouvertes et jamais fermées. Un problème d'application, pas de base de données.
- Beaucoup de lignes exécutant la MÊME requête - une requête lente, qui arrive plus vite qu'elle ne se termine. Corrigez la requête.
- Des lignes Locked qui durent - une transaction qui tient un verrou pendant que tout le reste fait la queue derrière.
Des connexions jamais fermées
Un script qui ouvre une connexion à chaque tour de boucle, ou un pool de connexions persistantes plus grand que ce que le serveur autorise, épuisera la limite quelle qu'elle soit.
SHOW VARIABLES LIKE 'wait_timeout';
-- default is often 28800: eight hours of holding a sleeping connection
Abaisser wait_timeout à quelques minutes récupère les connexions abandonnées. C'est un filet sous une fuite, pas un remède.
Quand l'augmenter est bel et bien juste
Si toutes les connexions font un vrai travail et que le serveur a de la mémoire à revendre, la limite est vraiment trop basse.
SET GLOBAL max_connections = 300;
-- and in my.cnf so it survives a restart
Calculez d'abord la mémoire par connexion. 300 connexions à 12 Mo chacune, cela fait 3,6 Go avant que la base ait mis une seule ligne en cache.
Un bond soudain des connexions à heure fixe est une tâche cron, pas du trafic. La liste des processus pendant le pic la nomme en une ligne.
