it-swarm.com.de

Wie kann ich verhindern, dass Unmengen von Apache-Prozessen beim Starten von Apache und beim Beenden meines Computers entstehen?

Ich habe eine stark frequentierte Anwendung auf einem Debian-Rechner und Apache hat angefangen, sich seltsam zu verhalten.

Jedes Mal, wenn ich Apache starte, werden Unmengen von Apache-Prozessen erzeugt, die App wird überhaupt nicht geladen, und der gesamte Computer friert sehr schnell ein und muss zum Neustart neu gestartet werden.

Folgendes bekomme ich direkt nach dem Start von Apache:

 nach oben - 20:14:44 nach oben 1:16, 2 Benutzer, Durchschnittslast: 0,48, 0,10, 0,03 
 Aufgaben: 330 insgesamt, 5 laufen, 325 schlafen, 0 gestoppt, 0 Zombies 
 CPU (s): 12,0% us, 21,4% sy, 0,0% ni, 65,7% id, 0,2% wa, 0,1% hi, 0,7% si, 0,0% st 
 Mem: 8179920k gesamt, 404984k verwendet, 7774936k frei, 60716k Puffer 
 Swap: 2097136k gesamt, 0k verwendet, 2097136k frei, 43424k zwischengespeichert 
 
 
 10251 www-data 15 0 467m 8100 4016 S 6 0.1 0: 00.04 Apache2 
 10262 www-Daten 15 0 467m 8092 4012 S 6 0.1 0: 00.05 Apache2 
 10360 www-Daten 15 0 468m 8296 4016 S 6 0.1 0: 00.05 Apache2 
 10428 www-Daten 15 0 468 m 8272 3992 S 6 0,1 0: 00,05 Apache2 
 10241 www-Daten 15 0 467 m 8256 4012 S 4 0,1 0: 00,03 Apache2 
 10259 www-Daten 15 0 467m 8092 4012 S 4 0.1 0: 00.04 Apache2 
 10274 www-data 15 0 467m 8056 4012 S 4 0.1 0: 00.03 Apache2 
 10291 w ww-daten 15 0 468m 8292 4012 S 4 0.1 0: 00.03 Apache2 
 10293 www-daten 15 0 468m 8292 4012 S 4 0.1 0: 00.03 Apache2 
 10308 www-daten 15 0 468m 8296 4016 S 4 0.1 0: 00.02 Apache2 
 10317 www-Daten 15 0 468m 8292 4012 S 4 0.1 0: 00.02 Apache2 
 10320 www-Daten 15 0 468m 8292 4012 S 4 0.1 0: 00.04 Apache2 
 10325 www-data 15 0 468m 8292 4012 S 4 0.1 0: 00.04 Apache2 

Und so weiter ... mit mehr Apache2-Prozessen.

Weniger als eine Minute später können Sie unten sehen, dass die Last von 0,48 auf 2,17 gestiegen ist. Wenn ich Apache an dieser Stelle nicht stoppe, steigt die Last über ein paar Minuten oder weniger weiter an, bis die Maschine abstirbt.

 nach oben - 20:15:34 nach oben 1:17, 2 Benutzer, Lastdurchschnitt: 2,17, 0,62, 0,21 
 Aufgaben: 1850 insgesamt, 5 laufen, 1845 schlafen, 0 gestoppt, 0 Zombie 
 CPU (s): 0,3% us, 2,1% sy, 0,0% ni, 96,4% id, 0,0% wa, 0,1% hi, 1,0% si, 0,0% st 
 Mem: 8179920k gesamt, 1938524k verwendet, 6241396k frei, 60860k Puffer 
 Swap: 2097136k gesamt, 0k verwendet, 2097136k frei, 44196k zwischengespeichert 

Wir haben eine Firewall, in der wir die Adressen auflisten, von denen wir wissen, dass sie auf unsere Website gelangen dürfen.

Anregungen zu möglichen Problemen sind sehr willkommen.

Vielen Dank!

55
Adam Gries

Sie haben wahrscheinlich den Fehler gemacht, Apache so zu konfigurieren, dass es weitaus mehr als den gesamten RAM verwendet. Dies ist ein leichter Fehler.

Ich gehe davon aus, dass Sie einen Prefork Apache und einen In-Process-Anwendungsserver (wie PHP oder mod_Perl)) verwenden. In diesem Modell werden Sie maximal (MaxClients * max Speicherauslastung Ihrer Anwendung pro Prozess) Speicherauslastung Wenn Sie nicht annähernd so viel Speicher haben, ist es Zeit, den einen, den anderen oder beide zu verringern.

Im Allgemeinen bedeutet dies, dass Sie MaxClients so weit reduzieren, dass Ihr Server über genügend RAM verfügt, um damit fertig zu werden.

Die Standardwerte, die normalerweise für MaxClients verwendet werden (150 ist typisch), eignen sich nicht für die Ausführung eines prozessbegleitenden Anwendungsservers auf einem bescheidenen Computer, wenn Sie das Prefork-Modell verwenden (die meisten Anwendungsserver unterstützen die Verwendung entweder nicht oder raten davon ab von Gewindemodellen).

Wenn Sie jedoch die Anzahl der MaxClients verringern, ist die Anwendung möglicherweise nicht mehr verfügbar, insbesondere wenn Keepalives aktiviert sind und das Keepalive-Timeout zu lang ist. Prozesse, die nur eine Verbindung am Leben erhalten (Status K im Serverstatus), verbrauchen immer noch viel RAM. Dies kann ein Problem sein. Versuchen Sie, das Keepalive-Timeout zu minimieren oder deaktivieren Sie es vollständig.

Sie müssen den Serverstatus im Auge behalten (wie von mod_status bereitgestellt).

Natürlich sollten Sie KEINE dieser Änderungen vornehmen, wenn Sie die Konsequenzen verstehen. Überlegen Sie zweimal, ändern Sie die Konfiguration einmal. Wenn Sie die Möglichkeit haben, die Änderungen mit simulierter Last auf einer ähnlichen Nichtproduktionsmaschine zu testen, tun Sie dies.

42
MarkR

benutze ps -aux | grep Apache, um die Anzahl der Prozesse zu ermitteln, auf denen Apache ausgeführt wird. Achten Sie auf die Spalte "RSS", die eine Schätzung des von den einzelnen Prozessen verwendeten Speichers enthält. Alternativ können Sie "top" verwenden, wobei Sie + f verschieben und dann die Spalte% MEM auswählen, um die Prozesse nach Speichernutzung zu sortieren.

Die Anzahl der Prozesse wird durch die Anweisung "MaxClients" in Ihrer Apache.conf-Datei festgelegt. Der Weg zu dieser Abbildung ist wie folgt: diese Seite ;

  1. SSH in Ihren Server als root.
  2. Laufen Sie oben.
  3. Drücken Sie Umschalt + m.
  4. Beachten Sie den höchsten von httpd verwendeten RES-Speicher.
  5. Drücken Sie Q, um oben zu beenden.
  6. Execute: service httpd stop (In debian Sudo service Apache2 stop)
  7. Führen Sie nach dem Stoppen von httpd Folgendes aus: free -m
  8. Notieren Sie sich den unter "used" aufgeführten Speicher.
  9. Finden Sie den garantierten Speicher für Ihren VPS-Plan. Der Support kann Ihnen mitteilen, wie viel Sie garantiert haben, wenn Sie es nicht finden können.
  10. Subtrahieren Sie den verwendeten Speicher von dem Speicher, für den Ihr Plan GARANTIERT ist. Dies gibt Ihnen Ihre Basis FREE MEMORY POOL.
  11. Multiplizieren Sie den Wert Ihres KOSTENLOSEN SPEICHERPOOLS mit 0,8, um Ihren durchschnittlichen VERFÜGBAREN Apache-POOL zu ermitteln (dies ermöglicht Ihnen eine Speicherreserve von 20% für Burst-Perioden).
  12. Teilen Sie Ihren AVAILABLE Apache POOL durch den höchsten von httpd verwendeten RES-Speicher. Dadurch erhalten Sie den MaxClients-Wert, der für Ihr System festgelegt werden sollte. (Runden Sie es auf die nächste Ganzzahl, die kleiner als dieser Wert ist, wenn es eine Bruchkomponente enthält.)

Der richtige Wert für "MaxClients" stellt die richtige Speicherzuordnung für Ihren Apache-Server sicher. So habe ich es gelöst.

In Debian befindet sich die Apache-Konfigurationsdatei unter /etc/Apache2/Apache2.conf

16
David Okwii

Haben Sie Ihre Konfigurationsdatei kürzlich geändert? Wenn ja, ich vertraue darauf, dass Sie die alte Version für Unterschiede behalten?

Wenn nicht, suchen Sie nach den Anweisungen "StartServers", "MaxSpareServers" und "MinSpareServers". Normalerweise möchten Sie diese auf den Standardeinstellungen belassen, aber es ist möglich, dass sie absichtlich hoch eingestellt wurden (schlechte Idee) oder aufgrund einer schlechten Konfigurationsbearbeitung versehentlich so eingestellt wurden.

Wenn dies nicht hilft, ist es an der Zeit, außerhalb von Apache nach einem Prozess zu suchen, bei dem Verbindungen mit einer hohen Geschwindigkeit geöffnet werden (möglicherweise wird ein Testprozess ausgeführt, der Amok läuft).

Erster Schritt ist das Zugriffsprotokoll. Der zweite Schritt besteht darin, netstat auszuführen, um festzustellen, woher die Verbindungen stammen könnten. Wenn es auf demselben System ausgeführt wird, können Sie in/proc/*/fd nach den beiden Enden der Verbindung suchen.

10
kdgregory

Diese Frage ist uralt, aber ich fühle mich gezwungen, hier eine Antwort hinzuzufügen, da alle vorhandenen Antworten eine wichtige Information aus dem OP übersehen: Nachdem die Last für ein paar Minuten zu steigen begonnen hat, berichtet top dass immer noch genügend CPU- und Speicherressourcen verfügbar sind. Normalerweise ist noch ein Schuldiger übrig, und das ist I/O.

Überprüfen Sie mit df -h, Ob es eine vollständige Partition gibt. Wenn nicht, prüfen Sie, ob Ihre Anwendung die Festplatte mit vmstat 1 10 Oder iostat 1 10 Zerschlägt (diese sind im Paket 'sysstat' unter Debian/Ubuntu enthalten). Wenn dort immer noch kein Problem auftritt, treten möglicherweise E/A-Fehler auf Geräteebene oder Netzwerkprobleme bei netzwerkbasiertem Speicher auf. Überprüfen Sie die System- und Daemon-Protokolldateien.

5
realgeek

Wie gesagt (unter der Annahme von Prefork Apache) - MaxClients = max verarbeitet auf einmal.

Wenn Sie feststellen, dass Sie mit echtem Datenverkehr überhäuft werden (und nicht mit falsch konfigurierten StartServers/Min/MaxSpareServers), können Sie folgende Aktionen ausführen:

  1. Richten Sie einen separaten, einfachen Apache-Prozess (oder lighttpd) für Ihren statischen Inhalt ein. Auf diese Weise verschmutzt das kleine, statische Material Ihren App-Prozess nicht. Dies kann sich auf demselben oder einem anderen Server befinden. Spielt keine rolle.
  2. Stellen Sie einen Reverse-Proxy wie Squid vor Ihren Apache-Prozess. Der Reverse-Proxy saugt den Inhalt von Apache schnell ab, speichert ihn im Speicher und verteilt ihn dann wieder an den Client. Auf diese Weise belasten AOL-Benutzer mit 14,4-KB-Modems keinen Ihrer wertvollen Apache-Slots. Als Bonus kann ein solches Setup so konfiguriert werden, dass einige Ihrer Inhalte zwischengespeichert werden, um die Belastung Ihrer Apache-Prozesse zu verringern.
3
Cory R. King

Ihre 'Top'-Ausgabe zeigt an, dass Sie über ausreichend freien Speicher verfügen. Ich glaube daher nicht, dass MaxClients ein Problem darstellt (es sei denn, es gibt ein Problem mit der Zuweisung von mehr als 2 GB Speicher durch Apache?). In Ihrem Fehlerprotokoll sollten Fehler angezeigt werden, wenn dies der Fall ist Probleme haben, mehr Kinder zu schaffen.

Höchstwahrscheinlich verbrauchen Ihre Apache-Prozesse sehr viele Ressourcen. Wenn Sie PHP apps ausführen, versuchen Sie, eAccelerator zu installieren, um den Code zu optimieren und zwischenzuspeichern PHP). Andere Dinge können schwere, langsame MySQL-Abfragen sein DNS-Resolver usw. Darüber hinaus wird besser verstanden, welche Programme betroffen sind und was sie tun.

2
Brandon