2010-05-24 8 views
3

J'utilise MySQL et PHP avec 2 serveurs d'applications et 1 serveur de base de données. Avec l'augmentation du nombre d'utilisateurs (environ 1000 maintenant), je reçois l'erreur suivante:Php obtenant trop de connexions erreur de MySQL

SQLSTATE[08004] [1040] Too many connections 

Le paramètre max_connections est réglé sur 1000 dans my.cnf et mysql.max_persistent est réglé sur -1 dans php.ini.

Il y a au plus 1500 processus Apache s'exécutant à la fois puisque le paramètre MaxClients apache est égal à 750 et nous avons 2 serveurs d'application.

  • dois-je augmenter le max_connections à 1500 comme indiqué here?
  • Ou devrais-je définir mysql.max_persistent à 750 (nous utilisons le PDO avec des connexions persistantes pour des raisons de performances puisque le serveur de base de données n'est pas le même que les serveurs d'applications)?
  • Ou devrais-je essayer autre chose?

Merci d'avance!

+0

Cela n'aide pas beaucoup, même si vous définissez une connexion maximale illimitée. Vérifiez d'où viennent vos pages lentes. Et optimisez ces pages lentes. – ajreal

Répondre

3

Je pense que vos connexions ne se ferment pas assez rapidement et s'empilent jusqu'à ce que l'heure par défaut soit atteinte. J'ai eu le même problème et avec wait_timeout j'ai résolu les problèmes.

Vous pouvez essayer d'installer dans my.cnf

set-variable = max_connections=1000 // max connection 
set-variable = max_user_connections=100 // max user connection per hour 
wait_timeout = 60 // wait timeout for connection in seconds 

comme mettra fin à toutes les connexions existantes au bout de 60 secondes se sont écoulées

+0

Merci pour la réactivité! Utilisez-vous des connexions persistantes? Dois-je définir wait_timeout même si j'utilise des connexions persistantes? – uzioriluzan

+0

non je n'utilise pas de connexion permanente car je ne veux pas recycler les connexions. vous devriez essayer d'ajuster votre MySQL si vous avez vraiment besoin d'utiliser des connexions persistantes Cela m'a aidé beaucoup dans beaucoup de situations: http://www.day32.com/MySQL/ –

1

Je pense que vous devriez vérifier le code PHP si vous pouvez vous débarrasser de les connexions persistantes. Le problème avec les connexions persistantes est que l'instance php les maintient ouvertes même après la fin du script jusqu'à ce que les données aient été envoyées au client et que l'instance php soit libérée pour le client suivant.

Un autre problème avec les connexions persistantes est que du code PHP peut laisser le socket avec des paramètres différents de ceux du démarrage, avec des locales différentes ou avec des tables temporaires.

Si vous pouvez réécrire le code que pour chaque connexion theres seulement un ou quelques mysql_connects et le handle de base de données est passé à différentes parties du code ou conservé dans GLOBAL l'impact sur les performances de perte de connexions persistantes est négligeable.

Et, bien sûr, il n'y a pas de mal à doubler les connexions max. Ce n'est pas très utile avec PHP car PHP/Apache sort assez souvent de toute façon et ferme les handles. Le max_connections est plus utile dans d'autres environnements.