Ubuntu Server 10.04.1 x86
Ich habe eine Maschine mit einem FCGI-HTTP-Dienst hinter nginx, der viele kleine HTTP-Anforderungen an viele verschiedene Clients bedient. (Ungefähr 230 Anfragen pro Sekunde in den Stoßzeiten, durchschnittliche Antwortgröße mit Headern beträgt 650 Bytes, mehrere Millionen verschiedener Clients pro Tag.)
Als Ergebnis habe ich viele Sockets, die in TIME_WAIT hängen (Grafik wird mit den folgenden TCP-Einstellungen erfasst):
Ich möchte die Anzahl der Steckdosen reduzieren.
Was kann ich sonst noch tun?
$ 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
Update: Einige Details zum tatsächlichen Service-Layout der Maschine:
Client ----- TCP-Socket -> Nginx (Load Balancer Reverse Proxy) ----- TCP-Socket -> Nginx (Arbeiter) --domain-socket -> fcgi-software --single-persistent-TCP-socket -> Redis --single-persistent-TCP-socket -> MySQL (andere Maschine)
Ich sollte wahrscheinlich Load-Balancer -> Worker-Verbindung auch auf Domain-Sockets umstellen, aber das Problem mit TIME_WAIT-Sockets würde bestehen bleiben. Ich plane, bald einen zweiten Worker auf einem separaten Computer hinzuzufügen. In diesem Fall können keine Domain-Sockets verwendet werden.
quelle
Antworten:
Eine Sache, die Sie tun sollten, um zu beginnen, ist, das Problem zu beheben
net.ipv4.tcp_fin_timeout=1
. Das ist viel zu niedrig, Sie sollten wahrscheinlich nicht viel niedriger als 30 nehmen.Da steht das hinter nginx. Bedeutet das, dass Nginx als Reverse Proxy fungiert? In diesem Fall bestehen zwei Verbindungen (eine zum Client und eine zu Ihren Webservern). Wissen Sie, zu welchem Ende diese Steckdosen gehören?
Update:
fin_timeout gibt an, wie lange sie in FIN-WAIT-2 bleiben (Ab
networking/ip-sysctl.txt
in der Kerneldokumentation ):Ich denke, Sie müssen Linux vielleicht nur die TIME_WAIT-Socket-Nummer mit einer Größe von 32 KB vergleichen lassen, und hier recycelt Linux sie. Auf diese 32k wird in diesem Link angespielt :
Dieser Link weist auch darauf hin, dass der TIME_WAIT-Status 60 Sekunden beträgt und nicht über proc eingestellt werden kann.
Zufällige lustige Tatsache:
Sie können die Timer auf dem timeWait mit netstat für jeden Sockel mit sehen
netstat -on | grep TIME_WAIT | less
Wiederverwenden Vs Recyceln:
Diese sind interessant, da sie die Wiederverwendung von time_Wait-Sockets ermöglichen, und recycle versetzt sie in den TURBO-Modus:
Ich würde die Verwendung von net.ipv4.tcp_tw_recycle nicht empfehlen, da dies Probleme mit NAT-Clients verursacht .
Vielleicht können Sie versuchen, nicht beide Geräte einzuschalten, um zu sehen, welche Auswirkungen dies hat. Ich würde
netstat -n | grep TIME_WAIT | wc -l
für eine schnellere Rückmeldung als Munin verwenden.quelle
net.ipv4.tcp_fin_timeout
würdest du empfehlen?30
oder vielleicht20
. Probieren Sie es aus und sehen Sie. Du hast eine Menge Last, also macht eine Menge TIME_WAIT Sinn.net.ipv4.tcp_fin_timeout
von1
zu wechsle20
?netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
. Also, @Alex, wenn Munin es nicht mag, probieren Sie einfach aus, wie er diese Statistiken überwacht. Vielleicht ist das einzige Problem, dass Munin Ihnen schlechte Daten gibt :-)tcp_tw_reuse ist relativ sicher, da TIME_WAIT-Verbindungen wiederverwendet werden können.
Sie können auch mehr Dienste ausführen, die auf verschiedenen Ports hinter Ihrem Load-Balancer empfangsbereit sind, wenn das Problem besteht, dass nicht genügend Ports zur Verfügung stehen.
quelle