Was könnte dazu führen, dass so viele TIME_WAIT-verbindungen zu öffnen?
So, ich habe Eine Anwendung auf einem server, der sendet 710 HTTP-POST-Nachrichten pro Sekunde zu Anwendung B auf einem anderen server lauscht auf einem port. Die verbindungen sind nicht keep-alive, Sie sind geschlossen.
Nach ein paar Minuten, Eine Anwendung berichten, die Sie nicht öffnen können, neue verbindungen zur Anwendung B.
Ich bin mit netstat kontinuierlich auf beiden Maschinen, und sehen, dass eine große Anzahl von TIME_WAIT-verbindungen offen sind, auf jeden. Nahezu alle verbindungen zeigen, sind in TIME_WAIT. Aus der Lektüre online, es scheint, dass dies der Zustand ist, der es in 30 Sekunden (auf unseren Maschinen 30 Sekunden laut /proc/sys/net/ipv4/tcp_fin_timeout Wert) nach jeder Seite schließt die Verbindung.
Ich habe ein Skript läuft auf jeder Maschine, auf der das kontinuierlich tut:
netstat -na | grep 5774 | wc -l
und:
netstat -na | grep 5774 | grep "TIME_WAIT" | wc -l
Den Wert der einzelnen, auf jedem Rechner, scheint man rund 28.000 vor der Anwendung die Berichte, die Sie nicht öffnen können, neue verbindungen zur Anwendung B.
Habe ich gelesen, dass diese Datei: /proc/sys/net/ipv4/ip_local_port_range enthält die Gesamtanzahl der verbindungen, die gleichzeitig geöffnet sein:
$ cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
61000 - 32768 = 28232, was Recht ist im Einklang mit den rund 28.000 TIME_WAITs ich sehe.
Meine Frage ist, wie ist es möglich, so viele verbindungen im TIME_WAIT.
Scheint es, dass bei 710 verbindungen pro Sekunde geschlossen wird, sollte ich etwa 710 * 30 Sekunden = 21300 gewachsen, der diese in einer bestimmten Zeit. Ich nehme an, dass, nur weil es 710 geöffnet wird pro Sekunde bedeutet nicht, dass es 710 geschlossen pro Sekunde...
Die einzige andere Sache, die ich denken kann, ist ein langsames OS bekommen um zu schließen Sie die Anschlüsse.
Du musst angemeldet sein, um einen Kommentar abzugeben.
TCP's TIME_WAIT-zeigt an, dass lokale Endpunkt (dieser Seite) hat die Verbindung geschlossen. Die Verbindung wird gehalten um, so dass eine verspätete Pakete können angepasst werden, um die Verbindung und entsprechend behandelt. Die verbindungen entfernt werden, wenn Sie innerhalb von vier Minuten.
Unter der Annahme, dass alle diese verbindungen waren gültig, dann ist alles korrekt funktioniert. Sie können die Beseitigung der TIME_WAIT-Zustand befindet, indem die Gegenstelle die Verbindung zu schließen, oder Sie können ändern der system-Parameter zu erhöhen recycling (obwohl es kann gefährlich sein, dies zu tun).
Vincent Bernat hat eine exzellente Artikel auf TIME_WAIT und wie Sie damit umgehen:
Den Linux-kernel-Dokumentation ist nicht sehr hilfreich, über das, was
net.ipv4.tcp_tw_recycle
hat:Ihre Schwester
net.ipv4.tcp_tw_reuse
ist ein wenig mehr dokumentiert, aber die Sprache ist etwa die gleiche:Die bloße Ergebnis dieser Mangel an Dokumentation ist, dass wir zahlreiche tuning-guides beraten, um sowohl diese Einstellungen auf 1 zu reduzieren, die Anzahl der Einträge in der TIME-WAIT-Zustand. Jedoch, wie bereits von tcp(7) Handbuch Seite, die
net.ipv4.tcp_tw_recycle
option ist ziemlich problematisch für öffentlich zugängliche Server, wie es nicht verarbeiten verbindungen von zwei unterschiedlichen Computern hinter dem gleichen NAT-Gerät, ein problem, das schwer zu erkennen und darauf wartet, Biss Sie: