J'exécute un site plutôt occupé et pendant les heures de pointe, je vois plus de 10 000 connexions ouvertes sur mon serveur de base de données sur mon serveur Web lors de l'exécution d'une commande netstat. 99% des connexions sont dans l' TIME_WAIT
état.
J'ai entendu parler de cette variable mysql: wait_timeout
http://dev.mysql.com/doc/refman/5.1/en/server-system-variables.html#sysvar_wait_timeout aujourd'hui. Le mien est toujours réglé à la valeur par défaut de 28,800 secondes.
L'abaissement de cette valeur est-il sécurisé?
Aucune de mes requêtes prend généralement plus d'une seconde. Il semble donc idiot de garder une connexion ouverte pendant 480 minutes.
J'ai également entendu parler de l'utilisation mysql_pconnect
au lieu de mysql_connect
, mais je n'ai lu que des histoires d'horreur à ce sujet, alors je pense que je vais rester à l'écart de cela.
wait_timeout
une connexion plus courte provoque la fermeture d'une connexion alors que le logiciel s'attend à ce qu'elle reste ouverte.Réponses:
Réduire la valeur est assez trivial sans un redémarrage de mysql
Disons que vous voulez réduire les délais d'attente à 30 secondes
Tout d'abord, ajoutez ceci à my.cnf
Ensuite, vous pouvez faire quelque chose comme ça
Toutes les connexions à la base de données après ce délai expireront dans 30 secondes
ATTENTION
Assurez-vous d'utiliser explicitement mysql_close. Je ne fais pas confiance à Apache comme le font la plupart des développeurs. Sinon, il existe parfois une situation de concurrence critique dans laquelle Apache ferme une connexion à une base de données mais n'informe pas mysqld et ce dernier maintient cette connexion ouverte jusqu'à l'expiration du délai imparti. Pire encore, il est possible que vous voyiez plus souvent TIME_WAIT. Choisissez judicieusement vos valeurs de délai d'attente.
MISE À JOUR 2012-11-12 10:10 EDT
CAVEAT
Après avoir appliqué mes suggestions postées, créez un script appelé
/root/show_mysql_netstat.sh
avec les lignes suivantes:Lorsque vous exécutez ceci, vous devriez voir quelque chose comme ça:
Si vous voyez toujours beaucoup de mysql
TIME_WAITs
pour un serveur Web donné, voici deux étapes à suivre:ESCALATION # 1
Connectez-vous au serveur Web incriminé et redémarrez apache comme suit:
Si nécessaire, faites-le sur tous les serveurs Web.
ESCALATION # 2
Vous pouvez forcer le système d'exploitation à tuer TIME_WAIT pour mysql ou toute autre application avec les éléments suivants:
Cela fera que TIME_WAIT expire en 1 seconde.
Donner un crédit lorsqu'un crédit est dû ...
TIME_WAIT
est créé.la source
Si vous obtenez beaucoup de connexions TIME_WAIT sur le serveur MySQL, cela signifie que le serveur MySQL ferme la connexion. Le cas le plus probable dans ce cas serait qu'un ou plusieurs hôtes se soient retrouvés dans une liste de blocage. Vous pouvez effacer ceci en exécutant:
Pour obtenir une liste du nombre de connexions que vous avez par IP, procédez comme suit:
Vous pouvez également confirmer que cela se produit en vous adressant à l'un de vos clients qui rencontre des difficultés pour se connecter et telnet au port 3306. Il affichera un message contenant quelque chose comme:
la source
Si vous avez beaucoup de connexions TIME_WAIT sur votre serveur MySQL, cela signifie que votre code exécute de nombreuses requêtes sur votre base de données et ouvre / ferme une connexion pour chaque requête.
Dans ce cas, vous devez utiliser une connectivité permanente sur votre serveur de base de données, à l'aide de l'extension MySQLi.
http://php.net/manual/en/mysqli.persistconns.php
Si vous ne pouvez pas utiliser MySQLi, vous devriez plutôt utiliser le paramètre thread_cache_size dans votre configuration MySQL.
la source