Le WordPress d'aujourd'hui, décodé pour les développeurs

Outils & workflow

« Too many connections » sur une base MySQL partagée par un parc d’agence

Diagnostiquer un pool de connexions mal dimensionné sur une infrastructure mutualisée à forte densité de sites WordPress, du symptôme à la prévention.

Par WordPress Développement • 24 février 2022 • 4 min de lecture • Aucun commentaire
« Too many connections » sur une base MySQL partagée par un parc d'agence

Error establishing a database connection côté visiteur, et dans les journaux du serveur MySQL, une ligne bien plus explicite : Too many connections. Ce message est apparu simultanément sur quatre sites différents hébergés sur le même serveur mutualisé, un mardi en milieu de journée, sans qu’aucun déploiement récent n’ait eu lieu sur l’un d’entre eux.

Symptôme

Plusieurs sites du même serveur deviennent indisponibles en même temps, tous affichant une erreur de connexion à la base de données, alors que le serveur lui-même répond normalement aux autres requêtes (fichiers statiques, pages en cache). Le journal MySQL confirme :

2022-02-24 13:12:48 47 [Warning] Aborted connection 47 to db: 'unconnected' user: 'unauthenticated'
ERROR 1040 (HY000): Too many connections

Diagnostic : identifier qui consomme les connexions

La valeur par défaut de max_connections sur une installation MySQL standard est de 151. Sur un serveur mutualisé hébergeant plusieurs dizaines de sites WordPress, ce plafond peut être atteint rapidement si un ou plusieurs sites laissent des connexions ouvertes plus longtemps que nécessaire. La première étape consiste à identifier la source de la consommation :

SHOW PROCESSLIST;

Cette commande affiche l’ensemble des connexions actives, avec la base de données concernée, l’utilisateur et l’état de chaque connexion (Sleep, Query, Locked). Sur l’incident en question, un site particulier apparaissait avec plus de quatre-vingts connexions à l’état Sleep, largement au-dessus du nombre de visiteurs simultanés réels sur ce site.

L'essentiel à retenir : Distinguer connexions ouvertes et connexions réellement utiles ; Ajuster max_connections en connaissance de cause ; Fermer proprement les connexions persistantes oubliées

Trouver la cause précise

L’investigation a révélé une extension tierce récemment installée sur ce site, qui ouvrait une connexion persistante à la base de données pour chaque appel à une tâche planifiée WordPress (wp-cron), sans jamais la refermer explicitement. Sur un site à fort trafic, avec des tâches planifiées déclenchées fréquemment, ces connexions abandonnées s’accumulaient jusqu’à saturer le pool partagé par l’ensemble du serveur.

Correctif immédiat

  1. Identifier et désactiver temporairement l’extension responsable pour libérer immédiatement les connexions bloquées : wp plugin deactivate extension-suspecte.
  2. Redémarrer le service MySQL si les connexions abandonnées ne se libèrent pas d’elles-mêmes après la désactivation, en dernier recours seulement, car cela coupe toutes les connexions en cours sur le serveur entier.
  3. Vérifier que wp_cron ne s’exécute pas en boucle rapprochée sur ce site à cause d’un réglage de fréquence trop agressif introduit par la même extension.

Correctif structurel

Une fois l’incident résorbé, deux ajustements ont été mis en place pour prévenir sa récurrence :

  • Une augmentation raisonnée de max_connections, après avoir vérifié que la mémoire disponible du serveur pouvait absorber ce plafond plus élevé sans provoquer d’autres problèmes.
  • Un délai d’inactivité plus court pour les connexions en veille, via wait_timeout, afin que MySQL libère automatiquement les connexions abandonnées après un délai raisonnable plutôt que de les conserver ouvertes indéfiniment.
[mysqld]
max_connections = 300
wait_timeout = 120

Prévention à l’échelle du parc

Sur un serveur mutualisé hébergeant de nombreux sites, un tableau de bord de suivi du nombre de connexions par base de données, mis à jour toutes les minutes, permet de repérer une dérive avant qu’elle n’atteigne le seuil critique, plutôt que de découvrir l’incident au moment où plusieurs sites tombent simultanément.

Une extension qui « fonctionne » en apparence peut consommer des ressources invisibles jusqu’à ce que le plafond soit atteint d’un coup.

En résumé

« Too many connections » sur une base mutualisée pointe presque toujours vers une source de consommation anormale plutôt que vers un plafond simplement trop bas. Augmenter max_connections sans identifier la cause réelle ne fait que repousser l’incident suivant, potentiellement plus difficile à diagnostiquer une fois plusieurs sites concernés simultanément.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi