Frage Wie reduziert man die Anzahl der Sockets in TIME_WAIT?


Ubuntu Server 10.04.1x86

Ich habe einen Rechner mit einem FCGI-HTTP-Dienst hinter nginx, der viele kleine HTTP-Anfragen an viele verschiedene Clients liefert. (Ungefähr 230 Anfragen pro Sekunde in den Spitzenzeiten, durchschnittliche Antwortgröße mit Kopfzeilen ist 650 Bytes, mehrere Millionen verschiedener Clients pro Tag.)

Als Ergebnis habe ich viele Sockets, die in TIME_WAIT hängen (das Diagramm wird mit den folgenden TCP-Einstellungen erfasst):

TIME_WAIT

Ich möchte die Anzahl der Sockets reduzieren.

Was kann ich 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 auf der Maschine:

Client ----- TCP-Socket -> nginx (Load Balancer Reverse Proxy)
       ----- TCP-Socket -> nginx (Arbeiter)
       --domain-socket -> fcgi-software
                          --einzelständiger-TCP-Socket -> Redis
                          --einzelständiger-TCP-Socket -> MySQL (andere Maschine)

Ich sollte wahrscheinlich Load-Balancer -> Arbeiter-Verbindung auch zu Domain-Sockets wechseln, aber das Problem über TIME_WAIT Sockets würde bleiben - Ich plane, bald einen zweiten Arbeiter auf einem separaten Rechner hinzuzufügen. In diesem Fall können keine Domänensockets verwendet werden.


35
2017-12-13 17:15


Ursprung


Es scheint, dass Munin schamlos lügt. Siehe Kommentare zu der Antwort von Kyle. Schau dir das jetzt an. - Alexander Gladysh
Erstellt eine Frage zu Munin: serverfault.com/questions/212200/... - Alexander Gladysh
Jetzt sieht es so aus, als ob Munin nicht lügt, sondern ich schaue mir die falsche Handlung an ... - Alexander Gladysh


Antworten:


Eine Sache, die Sie tun sollten, um zu beginnen, ist, das zu beheben net.ipv4.tcp_fin_timeout=1. Das ist zu niedrig, Sie sollten wahrscheinlich nicht viel niedriger als 30 nehmen.

Da dies hinter Nginx ist. Bedeutet das, dass nginx als Reverse Proxy fungiert? Wenn dies der Fall ist, sind Ihre Verbindungen 2x (eins zum Client, eins zu Ihren Webservern). Weißt du, zu welchem ​​Ende diese Steckdosen gehören?

Aktualisieren:
fin_timeout ist, wie lange sie in FIN-WAIT-2 bleiben (Von networking/ip-sysctl.txt in der Kernel-Dokumentation):

tcp_fin_timeout - INTEGER
        Time to hold socket in state FIN-WAIT-2, if it was closed
        by our side. Peer can be broken and never close its side,
        or even died unexpectedly. Default value is 60sec.
        Usual value used in 2.2 was 180 seconds, you may restore
        it, but remember that if your machine is even underloaded WEB server,
        you risk to overflow memory with kilotons of dead sockets,
        FIN-WAIT-2 sockets are less dangerous than FIN-WAIT-1,
        because they eat maximum 1.5K of memory, but they tend
        to live longer. Cf. tcp_max_orphans.

Ich denke, Sie müssen vielleicht einfach Linux die TIME_WAIT-Socket-Nummer gegen etwas, das wie 32k-Cap aussieht, halten und das ist, wo Linux sie recycelt. Auf diese 32k wird hier angespielt Verknüpfung:

Außerdem finde ich das   / proc / sys / net / ipv4 / tcp_max_tw_buckets   verwirrend. Obwohl der Standardwert festgelegt ist   bei 180000 sehe ich eine TCP-Unterbrechung wenn   Ich habe 32K TIME_WAIT Sockets auf meinem   System, unabhängig von der max tw   Eimer.

Diese Verbindung 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 der Zeitüberwachung mit netstat für jeden Socket mit sehen netstat -on | grep TIME_WAIT | less

Wiederverwendung Vs Recycling:
Diese sind irgendwie interessant, es liest sich wie Wiederverwendung aktivieren Sie die Wiederverwendung von Time_Wait Sockets, und recyceln Sie es in TURBO-Modus:

tcp_tw_recycle - BOOLEAN
        Enable fast recycling TIME-WAIT sockets. Default value is 0.
        It should not be changed without advice/request of technical
        experts.

tcp_tw_reuse - BOOLEAN
        Allow to reuse TIME-WAIT sockets for new connections when it is
        safe from protocol viewpoint. Default value is 0.
        It should not be changed without advice/request of technical
        experts.

Ich würde net.ipv4.tcp_tw_recycle nicht empfehlen, da es Probleme mit NAT-Clients verursacht.

Vielleicht könntest du versuchen, nicht beide eingeschaltet zu haben und zu sehen, welchen Effekt es hat (Versuche eins nach dem anderen und schau, wie sie alleine funktionieren). ich würde ... benutzen netstat -n | grep TIME_WAIT | wc -l für schnelleres Feedback als Munin.


28
2017-12-13 18:31



@Kyle: welcher Wert für net.ipv4.tcp_fin_timeout würdest du empfehlen? - Alexander Gladysh
@Kyle: Client - TCP-Socket -> Nginx (Load Balancer Reverse Proxy) - TCP-Socket -> Nginx (Arbeiter) - Domain-Socket -> Fcgi-Software - Alexander Gladysh
ich würde sagen 30 oder vielleicht 20. Probieren Sie es aus und sehen Sie. Sie haben eine Menge Last, so dass eine Menge von TIME_WAIT sinnvoll ist. - Kyle Brandt♦
@Kyle: Entschuldigung für eine blöde Frage (ich bin hier leider bisher auf einer Fracht-Kult-Ebene), aber was genau sollte ich erwarten, wenn ich mich verändere net.ipv4.tcp_fin_timeout von 1 zu 20? - Alexander Gladysh
Oh, hier ist ein schöner Liner: netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c. Also @Alex, wenn Munin nicht mag, vielleicht bohren Sie nur, wie es diese Statistiken überwacht. Vielleicht ist das einzige Problem, dass Munin dir schlechte Daten gibt :-) - Kyle Brandt♦


tcp_tw_reuse ist relativ sicher, da TIME_WAIT-Verbindungen wiederverwendet werden können.

Außerdem können Sie mehr Dienste auf verschiedenen Ports hinter Ihrem Load-Balancer abhören, wenn der Mangel an Ports ein Problem darstellt.


1
2017-09-09 15:56