Nous avons quelques systèmes de production qui ont été récemment convertis en machines virtuelles. Il existe une de nos applications qui accède fréquemment à une base de données MySQL, et pour chaque requête, elle crée une connexion, interroge et déconnecte cette connexion.
Ce n'est pas la façon appropriée d'interroger (je sais), mais nous avons des contraintes que nous ne pouvons pas sembler contourner. Quoi qu'il en soit, le problème est le suivant: alors que la machine était un hôte physique, le programme s'est bien déroulé. Une fois converti en machine virtuelle, nous avons remarqué des problèmes de connexion intermittents à la base de données. Il y avait, à un moment donné, plus de 24 000 connexions de socket dans TIME_WAIT (sur l'hôte physique, le maximum que j'ai vu était 17 000 - pas bon, mais sans causer de problèmes).
Je voudrais que ces connexions soient réutilisées, afin que nous ne voyions pas ce problème de connexion, et donc:
Des questions:
Est-il correct de définir la valeur de tcp_tw_reuse à 1? Quels sont les dangers évidents? Y a-t-il une raison pour laquelle je ne devrais jamais le faire?
De plus, existe-t-il un autre moyen d'obtenir le système (RHEL / CentOS) pour empêcher autant de connexions d'entrer dans TIME_WAIT ou de les faire réutiliser?
Enfin, que changerait tcp_tw_recycle et cela m'aiderait-il?
D'avance, merci!
Réponses:
Vous pouvez réduire le temps d'arrêt en toute sécurité, mais vous pouvez rencontrer des problèmes avec des connexions incorrectement fermées sur des réseaux avec perte ou gigue de paquets. Je ne commencerais pas à régler à 1 seconde, à 15-30 et à descendre.
De plus, vous devez vraiment corriger votre application.
RFC 1185 a une bonne explication dans la section 3.2:
la source
Cela ne répond pas à votre question (et c'est 18 mois de retard), mais suggère une autre façon de faire réutiliser les ports de votre application héritée:
Une alternative utile à la configuration
tcp_tw_reuse
(outcp_tw_recycle
) sur le système consiste à insérer une bibliothèque partagée (à l'aideLD_PRELOAD
) dans votre application; cette bibliothèque peut alors permettre la réutilisation du port. Cela rend votre application héritée autorise la réutilisation des ports sans forcer cela sur toutes les applications de votre système (aucune modification de votre application n'est requise), limitant ainsi l'impact de votre ajustement. Par exemple,Cette bibliothèque partagée doit intercepter l'
socket()
appel, appeler la vraie socket () et définir SO_REUSEADDR et / ou SO_REUSEPORT sur la socket retournée. Regardez http://libkeepalive.sourceforge.net pour un exemple de la façon de procéder (cela active les keepalives, mais l'activation de SO_REUSEPORT est très similaire). Si votre application héritage mal comportés utilise IPv6, pensez à changer la ligne 55 delibkeepalive.c
deà
Si vous êtes coincé, envoyez-moi un e-mail et j'écrirai le code et vous le ferai parvenir.
la source
Je pense qu'il est correct de changer cette valeur à 1. Une manière plus appropriée pourrait être d'utiliser la commande:
Il n'y a aucun danger évident que je sache, mais une recherche rapide sur Google produit ce lien qui affirme que
tcp_tw_reuse
c'est la meilleure alternative quetcp_tw_recycle
, mais doit être utilisé avec prudence malgré tout.la source
La connexion ne peut pas être réutilisée si elle est en TIME WAIT. Si vous n'avez pas de perte de paquets sur le réseau entre l'application et MySQL, vous pouvez réduire le délai d'attente.
Cependant, la meilleure solution consiste à utiliser des connexions persistantes vers la base de données et un pool de connexions.
la source