Wie bekomme ich NICHT so viele Apache CLOSE_WAIT-Verbindungen?

9

netstat zeigt an, dass 153 Verbindungen im Status CLOSE_WAIT sind. Die Verbindungen werden nie geschlossen. Überstunden Der Server ist also mit diesen Verbindungen gefüllt, die den RAM füllen, und jetzt werden die Websites nicht geladen.

netstat zeigt viele wie die folgenden:

tcp      160      0 my_server_name:http         my_server_name:51584        CLOSE_WAIT
tcp      160      0 my_server_name:http         my_server_name:51586        CLOSE_WAIT
tcp        0      0 my_server_name:http         my_server_name:50827        CLOSE_WAIT
tcp        0      0 my_server_name:http         my_server_name:50830        CLOSE_WAIT
tcp      312      0 my_server_ip.static.:http rate-limited-proxy-72:61249 CLOSE_WAIT
tcp      382      0 my_server_ip.static.:http b3090792.crawl.yahoo.:58663 CLOSE_WAIT
tcp      382      0 my_server_ip.static.:http b3090792.crawl.yahoo.:34655 CLOSE_WAIT
tcp      382      0 my_server_ip.static.:http b3090792.crawl.yahoo.:56681 CLOSE_WAIT
tcp      382      0 my_server_ip.static.:http b3090792.crawl.yahoo.:40829 CLOSE_WAIT
tcp      576      0 my_server_ip.static.:http b3090792.crawl.yahoo.:38278 CLOSE_WAIT
tcp       47      0 my_server_ip.static.:http 203.200.5.143.ill-bgl:49379 CLOSE_WAIT

Wenn ich mir das appache error_log ansehe, gibt es vor der CLOSE_WAIT-Situation Zeilen wie die folgenden

[warn] child process 15670 still did not exit, sending a SIGTERM
[error] child process 15670 still did not exit, sending a SIGKILL
[notice] child pid 3511 exit signal Segmentation fault (11)

Mein Setup Apache 2.2.3 RAM 1024 MB (Burst 2048 MB) CentOS Release 5.3 (Final) mit 2 WPMU 2.9.2-Installationen

SKCS Kamal
quelle
Was zeigt der Serverstatus? httpd.apache.org/docs/2.0/mod/mod_status.html
Joe H.
Aus irgendeinem Grund kann ich das nicht sehen [nachdem ich den Code in httpd.conf eingefügt habe]
SKCS Kamal
Siehe auch
OrangeDog

Antworten:

20

Hintergrund

Socket wechselt in den Status CLOSE_WAIT, wenn das Remote-Ende die Verbindung beendet und ein Paket mit gesetztem FIN-Flag sendet. In diesem Status wartet es dann auf die lokale Anwendung für close()den Socket, sendet dann seine eigene FIN an den Client und versetzt den Socket in den Status LAST_ACK. Siehe auch das TCP-Statusübergangsdiagramm und RFC 793 .

Beachten Sie auch, dass CLOSE_WAIT nichts mit dem berüchtigten TIME_WAIT zu tun hat, da ersteres im passiven Schließzweig auftritt (entferntes Ende wird zuerst geschlossen), während letzteres im aktiven Schließzweig (lokales Ende schließt zuerst).

Problembeschreibung

Normalerweise wechseln Verbindungen ziemlich schnell von CLOSE_WAIT zu LAST_ASK. Wenn sich die Remote-Adresse und der Port ständig ändern, kann eine angemessene Anzahl von Verbindungen im Status CLOSE_WAIT einfach die Folge einer sehr großen Anzahl von Verbindungen sein, die geöffnet, verwendet und geschlossen werden. Die Systemleistung sollte geprüft werden, dies ist jedoch an und für sich kein Problem.

Wenn sich die Remote-Adresse und der Port langsam ändern, bedeutet dies, dass die Anwendungsprozesse auf die CPU warten müssen. In diesem Fall bestätigen Durchschnittswerte mit hoher Last dies.

Wenn andererseits die Remoteadresse und der Port konstant bleiben und die Anzahl der Verbindungen im Status CLOSE_WAIT weiter zunimmt, weist dies höchstwahrscheinlich auf ein Problem mit der Anwendung hin. Dies ist ein Sonderfall des Ressourcenleckage-Fehlers: Die Anwendung leckt offene Sockets, anstatt sie rechtzeitig zu schließen. Dies verbraucht Kernelspeicher und führt schließlich zum Fehlschlagen der Anwendung, sobald die maximale Anzahl geöffneter Dateideskriptoren erreicht ist.

Beachten Sie jedoch, dass das Tempo der Leckage langsam sein kann. Es ist häufig der Fall, dass solche Fehler auf ein Versagen zurückzuführen sind, eine Ausnahme mitten in einer Anforderung zu behandeln, wodurch der Ausführungsfluss in einem Arbeitsthread unterbrochen wird, wodurch möglicherweise eine Bereinigung verhindert wird (einschließlich des Schließens des Sockets). Die störende Ausnahme kann selten auftreten.

Vorübergehende Lösung

Eine vorübergehende Lösung des Problems besteht darin, die Grenzwerte für offene Dateideskriptoren zu erhöhen und die Anwendung regelmäßig neu zu starten, wenn (vorzugsweise vorher) das Problem die Leistung beeinträchtigt. Beachten Sie, dass dies versehentlich Auswirkungen auf aktuell geöffnete Verbindungen haben kann. Das Vorhandensein redundanter Server und der Lastenausgleich können dazu beitragen, das Problem vor den Benutzern zu verbergen.

Permanente Lösung

Eine dauerhafte Lösung des Problems besteht darin, die Version der Anwendung ohne den Fehler bereitzustellen. Das Ausmaß, in dem die temporäre Lösung den Benutzern und dem Unternehmen schadet, die Bereitschaft der gepatchten Version und der Status der letzten Arbeitsversion helfen bei der Entscheidung, ob ein Rollback auf die letzte Arbeitsversion der Anwendung durchgeführt oder auf die Korrektur gewartet werden soll.

Adam Zalcman
quelle