Ubuntu Server 10.04.1 x86
J'ai une machine avec un service HTTP FCGI derrière nginx, qui sert beaucoup de petites requêtes HTTP à beaucoup de clients différents. (Environ 230 demandes par seconde aux heures de pointe, la taille moyenne des réponses avec les en-têtes est de 650 octets, plusieurs millions de clients différents par jour.)
En conséquence, j'ai beaucoup de sockets, suspendus dans TIME_WAIT (le graphique est capturé avec les paramètres TCP ci-dessous):
J'aimerais réduire le nombre de prises.
Que puis-je faire à part ça?
$ cat / proc / sys / net / ipv4 / tcp_fin_timeout 1 $ cat / proc / sys / net / ipv4 / tcp_tw_recycle 1 $ cat / proc / sys / net / ipv4 / tcp_tw_reuse 1
Mise à jour: quelques détails sur la disposition de service réelle sur la machine:
client ----- TCP-socket -> nginx (proxy inverse de l'équilibreur de charge) ----- TCP-socket -> nginx (travailleur) --domain-socket -> logiciel fcgi --single-persistent-persistent-TCP-socket -> Redis --single-persistent-persistent-TCP-socket -> MySQL (autre ordinateur)
Je devrais probablement basculer l'équilibreur de charge -> la connexion de l'ouvrier vers les sockets du domaine également, mais le problème des sockets TIME_WAIT resterait - je prévois d'ajouter bientôt un second ouvrier sur une machine séparée. Ne sera pas en mesure d'utiliser les sockets de domaine dans ce cas.
la source
Réponses:
Une chose à faire est de régler le problème
net.ipv4.tcp_fin_timeout=1
. C’est trop faible, vous ne devriez probablement pas prendre autant que 30.Depuis c'est derrière nginx. Cela signifie-t-il que nginx agit en tant que proxy inverse? Si tel est le cas, vos connexions sont 2x (une vers client, une vers vos serveurs Web). Savez-vous à quelle extrémité appartiennent ces prises?
Mise à jour:
fin_timeout indique combien de temps ils restent dans FIN-WAIT-2 (à partir
networking/ip-sysctl.txt
de la documentation du noyau):Je pense que vous devez peut-être simplement laisser Linux garder le numéro de socket TIME_WAIT contre ce qui ressemble peut-être à une limite de 32k et c'est ici que Linux les recycle. Ce 32k est mentionné dans ce lien :
Ce lien suggère également que l'état TIME_WAIT est de 60 secondes et ne peut pas être réglé via proc.
Fait amusant:
vous pouvez voir les minuteries sur le temps d'attente avec netstat pour chaque socket avec
netstat -on | grep TIME_WAIT | less
Reuse Vs Recycle:
Celles-ci sont plutôt intéressantes, car elles se lisent comme si la réutilisation permettait la réutilisation des sockets time_Wait, et le recyclage le met en mode TURBO:
Je ne recommanderais pas d'utiliser net.ipv4.tcp_tw_recycle car cela pose des problèmes avec les clients NAT .
Peut-être pourriez-vous essayer de ne pas avoir les deux activés et voir quel effet cela a (Essayez-les un par un et voyez comment ils fonctionnent tout seuls)? Je voudrais utiliser
netstat -n | grep TIME_WAIT | wc -l
pour des commentaires plus rapides que Munin.la source
net.ipv4.tcp_fin_timeout
recommanderiez-vous?30
ou peut-être20
. Essayez et voyez. Vous avez beaucoup de charge, donc beaucoup de TIME_WAIT ont du sens.net.ipv4.tcp_fin_timeout
de1
la20
?netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
. Alors, @Alex, si Munin n’apprécie pas, peut-être expliquer en détail comment il surveille ces statistiques. Le seul problème est peut-être que Munin vous donne de mauvaises données :-)tcp_tw_reuse est relativement sûr car il permet de réutiliser les connexions TIME_WAIT.
De plus, vous pouvez exécuter davantage de services d'écoute sur différents ports derrière votre équilibreur de charge si le nombre de ports disponibles est problématique.
la source