web-dev-qa-db-fra.com

Pourquoi diminuer le paramètre de configuration wait_timeout dans MySQL?

Question

Je travaille sur une application qui utilise un pool de connexion à Apache Tomcat pour communiquer avec MySQL. Je me demandais pourquoi voudriez-vous utiliser un plus petit wait_timeout que la valeur par défaut de 28 800 secondes? Je vois beaucoup de malsides pour réduire le délai d'attente, mais quels sont les majuscules?

arrière-plan

Le paramètre wait_timeout est défini comme

Le nombre de secondes que le serveur attend l'activité sur une connexion non interactive avant de la clôturer.

problème

Si je fais la serviette trop petite, MySQL tue les connexions toujours valides dans le pool de connexion, mon application Web utilise. Dans ma situation, je suis la seule personne en utilisant actuellement la demande à tout moment, donc naturellement, la connexion de base de données ne va pas au ralenti lorsque je ne le teste pas. Je pourrais résoudre ce problème en étendant simplement le wait_timeout sur MySQL à quelque chose de très grand afin que même si je suis loin de mon bureau pendant 2 semaines, la piscine ne retourne jamais une connexion morte.

DES QUESTIONS

  • Pourquoi quelqu'un voudrait-il jamais avoir un attente plus court?
  • La surcharge de stockage de connexions est-elle mauvaise?
  • Bien que je comprenne les pools de connexion atténuez les frais généraux de la création de connexions, est-ce un tel problème de conserver des connexions inactives en mémoire?
3
Usman Mutawakil

Vous devriez être juste bien étendue wait_timeout

Notez la valeur maximale pour wait_timeout pour mysql 5.0 , ==, 5.1 , 5.5 , 5.6 Englisons

  • Linux: 31536000 secondes (365 jours, un an)
  • Windows: 2147483 secondes (2 ^ 31 millisecondes, 24 jours 20 heures 31 min 23 secondes)

Ces maximums n'existeraient pas de MySQLD ne pouvaient pas les gérer.

La mise en commun de la connexion ne fait que gagner sur la tête en termes d'alternative: Détruire et réaffecter la mémoire pour les nouvelles connexions de DB. Cela pourrait causer que le système d'exploitation sur le serveur DB s'engage dans beaucoup plus d'échange pour jongler à la mémoire.

J'ai écrit à ce sujet il y a plus d'un an: À quel point l'ouverture et la fermeture d'une connexion DB sont coûteuses ?

L'abaissement du wait_timeout pourrait définitivement jeter Apache dans la confusion car il y a des objets PHP et apache pour les connexions de DB toujours instanciées, tandis que la connexion DB décide de se terminer tôt et sans avertissement. Dans cet événement, vous devrez peut-être scanner votre netstat pour tout TIME_WAIT Sur les connexions via le port 3306 ou tout autre port MySQL utilise.

Si tel existe et empêche Apache d'ouvrir une nouvelle connexion, vous devrez tuer le temps_waits vous-même. Voir mon Feb 01, 2012 Serverfault Post MySQL Abaissement de la valeur Wait_Timeout pour réduire le nombre de connexions ouvertes sur la façon de le faire.

3
RolandoMySQLDBA

Supposons que vous ayez une application Web sans mise en commun de la connexion.

Supposons maintenant que votre application Web fuit des connexions (ne les ferme pas correctement - par exemple: en n'utilisant pas enfin les blocs en Java). Les connexions qui fuient sont beaucoup plus problématiques avec une longue attente d'attente (la valeur par défaut est 8 heures). L'application s'exécutera rapidement de connexions (erreur "Trop de connexions" de MySQL).

Dans une application Web typique, une connexion est ouverte et fermée toutes dans le cadre d'une seule demande HTTP. Donc, aucune connexion ne doit être nécessaire pour plus de quelques secondes. En réduisant le délai d'attente, vous devriez être capable d'éliminer un problème de "trop de connexions" sans avoir à corriger le code.

Avec cela, la solution correcte doit toujours passer à travers un correction du code pour éliminer les connexions qui fuient.

1
Dave Ford

ne pas tester du tout est l'approche la plus rapide, pas nécessairement le plus évolutif et presque jamais le meilleur. Notez que les documents que vous consultez recommandés pour des tests occasionnels de connexions inactives, même pour les applications qui donnent la priorité à la rapidité sur la fiabilité de la connexion: "Réglage d'une assez longue idleConnectionTestPeriod et de ne pas tester à la caisse et l'enregistrement du tout est un excellente approche hautement performante. "

assez longtemps pourrait être aussi peu que 300 secondes, à moins que votre piscine soit très grande. (Un test de connexion prend sur l'ordre d'un milliseconde, de sorte que les frais généraux de Say 50 toutes les 5 minutes sont très faibles, en particulier si vous définissez une efficacité preferredTestQuery, que vous devriez (essayer SELECT 1 sur mysql.)

c3P0 vous donne beaucoup d'outils pour traiter des délais de connexion - tout schéma de test de connexion purgera des connexions chronométrées ou vous pouvez simplement utiliser les paramètres de configuration maxIdleTime ou maxConnectionAge si vous préférez ne pas tester.

0
Steve Waldman