web-dev-qa-db-fra.com

Est-il dangereux de changer la valeur de / proc / sys / net / ipv4 / tcp_tw_reuse?

Nous avons quelques systèmes de production récemment convertis en machines virtuelles. Il existe une application de la nôtre qui accède fréquemment à une base de données MySQL, et pour chaque requête qu'elle crée une connexion, des requêtes et déconnecte cette connexion.

Ce n'est pas le moyen approprié d'interroger (je sais), mais nous avons des contraintes que nous ne pouvons pas sembler se déplacer. Quoi qu'il en soit, la question est la suivante: tandis que la machine était un hôte physique, le programme a couru bien. Une fois converti sur une machine virtuelle, nous avons remarqué des problèmes de connexion intermittents à la base de données. Il y avait, à un moment donné, des connexions de socket de 24 000 et plus de 24 000+ dans Time_Wait (sur l'hôte physique, le plus que j'ai vu était de 17 000 - pas bon, mais ne pas causer de problèmes).

Je voudrais que ces connexions soient réutilisées, de sorte que nous ne voyons pas ce problème de connexion, et donc:

Des questions:

Est-il correct de définir la valeur de tcp_tw_ruse sur 1? Quels sont les dangers évidents? Y a-t-il une raison pour laquelle je devrais jamais le faire?

En outre, y a-t-il un autre moyen d'obtenir le système (RHEL/CENTOS) pour empêcher tant de connexions d'entrer dans le temps_wait ou de les faire réutiliser?

Enfin, qu'est-ce qui changerait TCP_TW_Recycle, et cela m'aiderait-il?

À l'avance, merci!

10
Sagar

Vous pouvez réduire en toute sécurité le temps, mais vous pouvez rencontrer des problèmes avec des connexions intégrées sur les réseaux avec une perte de paquets ou une gigue. Je ne commencerais pas à régler à 1 seconde, commencez à 15-30 et travaillez votre chemin.

En outre, vous devez vraiment corriger votre application.

RFC 1185 a une bonne explication à la section 3.2:

Lorsque A TCP Connection est fermé, un délai de 2 * MSL dans l'état d'attente time passe de la paire de socket pendant 4 minutes (voir la section 3.5 de [postel81]. Applications construites sur TCP= CLOSE UNE CONNECTION ET OUVRIR UN NOUVEAU ONE (par exemple, une connexion de transfert de données FTP à l'aide du mode flux) doit choisir une nouvelle paire de socket à chaque fois. Ce délai sert deux objectifs différents:

 (a)  Implement the full-duplex reliable close handshake of TCP. 

      The proper time to delay the final close step is not really 
      related to the MSL; it depends instead upon the RTO for the 
      FIN segments and therefore upon the RTT of the path.* 
      Although there is no formal upper-bound on RTT, common 
      network engineering practice makes an RTT greater than 1 
      minute very unlikely.  Thus, the 4 minute delay in TIME-WAIT 
      state works satisfactorily to provide a reliable full-duplex 
      TCP close.  Note again that this is independent of MSL 
      enforcement and network speed. 

      The TIME-WAIT state could cause an indirect performance 
      problem if an application needed to repeatedly close one 
      connection and open another at a very high frequency, since 
      the number of available TCP ports on a Host is less than 
      2**16.  However, high network speeds are not the major 
      contributor to this problem; the RTT is the limiting factor 
      in how quickly connections can be opened and closed. 
      Therefore, this problem will no worse at high transfer 
      speeds. 

 (b)  Allow old duplicate segements to expire. 

      Suppose that a Host keeps a cache of the last timestamp 
      received from each remote Host.  This can be used to reject 
      old duplicate segments from earlier incarnations of the 

* Remarque: on pourrait soutenir que le côté qui envoie une nageoire sait quel degré de fiabilité il a besoin, et il devrait donc pouvoir déterminer la longueur du délai d'attente temporelle pour le destinataire de la nageoire. Cela pourrait être accompli avec une option appropriée =TCP en segments de fin.

      connection, if the timestamp clock can be guaranteed to have 
      ticked at least once since the old conennection was open. 
      This requires that the TIME-WAIT delay plus the RTT together 
      must be at least one tick of the sender's timestamp clock. 

      Note that this is a variant on the mechanism proposed by 
      Garlick, Rom, and Postel (see the appendix), which required 
      each Host to maintain connection records containing the 
      highest sequence numbers on every connection.  Using 
      timestamps instead, it is only necessary to keep one quantity 
      per remote Host, regardless of the number of simultaneous 
      connections to that Host.
8
duffbeer703

Je pense que cela va bien de changer cette valeur à 1. Un moyen plus approprié pourrait être d'utiliser la commande:

[root@server]# sysctl -w net.ipv4.tcp_tw_reuse=1

Je ne connais aucun danger évident, mais une recherche rapide de Google produit cela link qui affirme que tcp_tw_reuse est la meilleure alternative que tcp_tw_recycle, mais devrait être utilisé avec prudence, peu importe.

6
atx

Cela ne répond pas à votre question (et il est de 18 mois de retard), mais suggère une autre façon de faire de vos ports de réutilisation de l'application Legacy:

Une alternative utile à la mise en tcp_tw_reuse (ou tcp_tw_recycle) sur le système est d'insérer une bibliothèque partagée (à l'aide de LD_PRELOAD) dans votre application; Cette bibliothèque peut alors permettre la réutilisation du port. Ceci fait que votre application Legacy autorise la réutilisation du port sans le forcer sur toutes les applications de votre système (aucune modification de votre application n'est requise), limitant ainsi l'impact de votre modification. Par exemple,

    LD_PRELOAD=/opt/local/lib/libreuse.so ./legacy_app

Cette bibliothèque partagée doit intercepter l'appel socket() Call, appelez la prise réelle () et définissez SO_REUSeADDRDRDR et/ou SO_REUSEPORTE sur la prise renvoyée. Regardez - http://libekeepalive.sourceforge.net Pour un exemple de comment faire cela (cela allume des conserves, mais allumant SO_REUSEPORT est très similaire). Si votre application héritage mal comportés utilise IPv6, pensez à changer la ligne 55 de libkeepalive.c de

    if((domain == PF_INET) && (type == SOCK_STREAM)) {

à

    if(((domain == PF_INET) || (domain == PF_INET6)) && (type == SOCK_STREAM)) {

Si vous êtes coincé, envoyez-moi un email et je vais écrire le code et vous l'envoyer.

6
Mark Wittenberg

La connexion ne peut pas être réutilisée s'ils attendent le temps. Si vous n'avez pas de perte de paquets sur le réseau entre 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 connexion.

0
Mircea Vutcovici