Lorsque le nombre de connexions à une instance RDS for MySQL atteint son maximum, tous les clients — y compris Data Management (DMS) et les autres outils — reçoivent un refus d'accès accompagné du message d'erreur ERROR 1040 (HY000): Too many connections. Cette rubrique explique comment diagnostiquer la cause première du problème et le résoudre.
Diagnostiquer le problème
Exécutez les requêtes suivantes pour vérifier l'état actuel de vos connexions :
-- Check the configured maximum connections
SELECT @@max_connections;
-- Check the number of currently connected clients
SHOW STATUS WHERE `variable_name` = 'Threads_connected';
Si la valeur de Threads_connected est égale ou proche de celle de max_connections, le quota de connexions est épuisé.
Pour déterminer si le problème provient de connexions inactives ou actives, accédez à la page Monitoring and Alerts dans la console ApsaraDB RDS et consultez la métrique Session. Examinez la valeur mysql.active_session pour comparer le nombre de sessions actives à celui des sessions inactives.
Si la majorité des sessions sont inactives, consultez la section Résoudre les problèmes causés par un nombre excessif de connexions inactives.
Si la majorité des sessions sont actives, consultez la section Résoudre les problèmes causés par un nombre excessif de connexions actives.
Résoudre les problèmes causés par un nombre excessif de connexions inactives
MySQL utilise un thread par connexion. Même inactives, les connexions conservent un thread dédié au sein du processus MySQL, ce qui consomme de la mémoire et augmente la surcharge liée aux changements de contexte. Un grand nombre de connexions inactives peut saturer la limite de connexions sans qu'aucune charge de travail active ne soit présente.
Les causes fréquentes d'un nombre excessif de connexions inactives sont les suivantes :
Applications utilisant des connexions persistantes sans pool de connexions : par exemple, une application Java qui utilise des connexions persistantes mais n'est pas configurée avec un pool de connexions. Si un nombre initial élevé de connexions est spécifié au démarrage, l'application ouvre immédiatement de nombreuses connexions inactives vers l'instance RDS.
Applications utilisant des connexions éphémères qui ne ferment pas les connexions : par exemple, une application PHP qui utilise des connexions éphémères mais ne ferme pas explicitement les connexions après l'exécution des requêtes.
Étape 1 : Terminer immédiatement les sessions inactives
Terminez les sessions inactives en suivant l'une des méthodes ci-dessous :
Console ApsaraDB RDS : accédez à la page Session et utilisez la gestion des sessions pour tuer les sessions inactives.
DMS : utilisez la fonctionnalité de gestion des sessions dans DMS pour identifier et terminer les sessions inactives.
CLI MySQL : exécutez la commande
kill <session_id>pour terminer une session spécifique.
Étape 2 : Réduire le délai d'expiration des connexions inactives
L'instance RDS termine automatiquement les connexions inactives après une période de délai d'expiration configurée :
| Paramètre | Valeur par défaut | Description |
|---|---|---|
wait_timeout |
86 400 secondes (24 heures) | Délai d'expiration pour les connexions en mode non interactif |
interactive_timeout |
7 200 secondes (2 heures) | Délai d'expiration pour les connexions en mode interactif |
Les valeurs par défaut sont élevées. Les réduire permet à l'instance de récupérer plus rapidement les connexions inactives. Pour modifier ces paramètres, accédez à la page Parameters dans la console ApsaraDB RDS.
Les modifications apportées aux paramètreswait_timeoutetinteractive_timeouts'appliquent uniquement aux nouvelles connexions établies après la modification. Les connexions existantes conservent leurs valeurs de délai d'expiration d'origine.
Dans la plupart des cas, les applications se connectent aux instances RDS en mode non interactif. Si vous souhaitez déterminer le mode de connexion utilisé par votre application, vérifiez sa configuration de connexion. Pour les applications PHP, vous pouvez spécifier la constante MYSQL_CLIENT_INTERACTIVE dans la fonction mysql_connect() pour activer le mode interactif.
Étape 3 : Corriger les fuites de connexions dans votre application
Les connexions inactives s'accumulent souvent parce que l'application ne ferme pas explicitement les connexions après avoir exécuté les requêtes. Par exemple, les applications PHP qui utilisent des connexions éphémères omettent parfois l'étape de fermeture, laissant les connexions ouvertes jusqu'à leur expiration.
Vérifiez le code de votre application pour vous assurer que les connexions sont explicitement fermées après chaque requête ou opération.
Résoudre les problèmes causés par un nombre excessif de connexions actives
Un grand nombre de connexions actives indique généralement un goulot d'étranglement au niveau des performances, provoquant une mise en file d'attente des requêtes. Les causes fréquentes sont les suivantes :
Une utilisation élevée du CPU
Des requêtes lentes
Des attentes de verrous InnoDB ou de verrous de métadonnées
Une utilisation élevée des IOPS
Identifiez le goulot d'étranglement sous-jacent et traitez-le directement :
Si le problème est causé par des attentes de verrous InnoDB, consultez la rubrique Que faire si des attentes de verrou de ligne se produisent sur une instance ApsaraDB RDS for MySQL et que ces attentes expirent ?
Si le problème est causé par des attentes de verrous de métadonnées, consultez la rubrique Utiliser DMS pour libérer les verrous de métadonnées.
Si le problème est causé par une utilisation élevée du CPU, consultez la rubrique Que faire si l'utilisation du CPU d'une instance ApsaraDB RDS for MySQL ou d'une instance ApsaraDB RDS for MariaDB est élevée ?
Si le problème est causé par une utilisation élevée des IOPS, consultez la rubrique Que faire si l'utilisation des IOPS d'une instance ApsaraDB RDS for MySQL est élevée ?
Prévenir les problèmes de limite de connexions
Utiliser un pool de connexions (recommandé)
Un pool de connexions gère un ensemble fixe de connexions persistantes partagées par votre application, au lieu d'ouvrir une nouvelle connexion pour chaque requête. Il s'agit de la solution à long terme la plus efficace pour prévenir l'épuisement des connexions, particulièrement pour les applications qui ouvrent et ferment un grand nombre de connexions éphémères, telles que les fonctions serverless ou les applications PHP.
Lors de la configuration de la taille maximale du pool, définissez-la sur une valeur inférieure à la limite de connexions de l'instance. Réservez au moins 10 connexions pour DMS et les autres opérations de gestion.
Par exemple, si votre instance prend en charge 500 connexions, définissez le maximum du pool de connexions à 490.
Activer la détection et la réutilisation des connexions
Activez la détection des connexions dans votre pool de connexions pour supprimer automatiquement les connexions obsolètes. Activez la fonctionnalité de réutilisation afin que le pool réutilise les connexions existantes plutôt que d'en ouvrir inutilement de nouvelles.
Augmenter le type d'instance
Si la demande de connexions dépasse systématiquement la limite actuelle, migrez vers un type d'instance plus puissant qui prend en charge un plus grand nombre de connexions.