fragen stichworte

Der Apache-Server erzeugt mehr und mehr Prozesse, maximiert den Arbeitsspeicher und stirbt

Wir haben ein LAMP-Setup, das seit einem halben Jahr ziemlich gut funktioniert hat, als der Apache-Server (MySQL-Server befinden sich nicht auf dieser Box) gerade erst sterben. Es scheint mit der Zeit immer mehr Prozesse hervorzubringen. Schließlich verbraucht es den gesamten Speicher und der Server würde einfach sterben. Wir verwenden Prefork.

In der Zwischenzeit fügen wir einfach mehr RAM hinzu und erhöhen den Parameter MaxClients und ServerLimit auf 512. Aber der Absturz verlängert sich nur. Die Zahl steigt noch langsam an. Vielleicht würde es an einem Tag diese Grenze erreichen.

Was ist los? Wir haben nur etwa 15-20 Anfragen pro Sekunde. Wir haben 1 GB Speicher und werden nicht zur Hälfte verwendet. Es findet kein Tausch statt.

Warum erstellt Apache immer mehr Prozesse? Es ist fast so, als ob irgendwo ein Leck wäre!

Die Datenbankfelder sind in Ordnung, sie verursachen keine Verzögerung bei Anforderungen. Wir haben einige Fragen getestet, alles ist schnell!

antworten

[Für andere, die über diese ältere Frage stolpern ...]

Schnelle Antwort:

Überprüfen Sie Ihre KeepAlive -Einstellungen in Ihrer Datei apache2.conf oder httpd.conf. Stellen Sie Ihren KeepAliveTimeout auf 2-5 Sekunden.

Details:

Ich habe festgestellt, dass Apaches KeepAlive standardmäßig on ist und der Wert KeepAliveTimeout auf 15 Sekunden gesetzt ist. Das bedeutet, dass ein einzelner Seitentreffer eines Benutzers dazu führt, dass der Server 15 Sekunden lang wartet, bis derselbe Benutzer eine andere Seite/Ressource anfordert, bevor er die Anfrage einer anderen Person aufgibt und bearbeitet.

Diese Konfiguration ist sehr nützlich, wenn ein Benutzer die erste index.html-Datei anfordert und dann die verknüpften CSS-, Javascript- und Bilddateien ein oder zwei Sekunden später anfordert. Moderne Computer und Netzwerk-/Internetverbindungen bedeuten jedoch, dass ein Browser die verknüpften Ressourcen normalerweise in weniger als 2 Sekunden abfragt. Apache bedient die folgenden Seiten und wartet dann weitere 15 Sekunden, falls der Benutzer etwas anderes wünscht. Dies ist in einer Umgebung mit hohem Verkehrsaufkommen äußerst ineffizient.

Wenn Sie 15 eindeutige Verbindungen pro Sekunde erhalten und jede Verbindung 15 Sekunden am Leben bleibt ... Ich bin mir sicher, dass Sie sehen können, wie die Dinge ziemlich heftig werden. 225 Apache-Prozesse werden beschleunigt, von denen 90 +% vollständig im Leerlauf sind, und warten auf eine weitere Seitenanforderung für die offene Verbindung.

Ich habe eine Reihe von Vorschlägen gesehen, um Ihren KeepAliveTimeout auf 2 bis 5 Sekunden einzustellen. Ich habe einige Server, die auf 2 und andere auf 5 eingestellt sind. Ich bekomme nicht die gleichen Systemverlangsamungen, wenn ich Verkehrsspitzen mehr bekomme.

In Ihrer httpd.conf -Datei haben Sie wahrscheinlich einen auskommentierten Abschnitt, der etwa wie folgt aussieht:

<IfModule mod_status.c>
        <Location "/server-status">
                SetHandler server-status
                Order deny,allow
                Deny from all
                Allow from 127.0.0.1
        </Location>
        ExtendedStatus On
</IfModule>

Wenn ich einen meiner Server anschaue, bei dem die Last zu hoch wurde, sehe ich ein ähnliches Problem ... Die Zeilen von 'SS' sollten niemals so hoch werden:

Srv   PID    Acc       M  CPU   SS       ...  Request

0-0   22830  1/9/3640  K  2.36  7        ...  GET/[].css HTTP/1.1
1-0   79114  0/0/858   W  0.00  121462   ...  POST/cgi/[] HTTP/1.1
2-0   22856  0/1/3211  W  0.00  20       ...  POST/cgi/[] HTTP/1.1
3-0   22890  0/0/2697  W  0.00  0        ...  GET/server-status HTTP/1.0
4-0   79105  0/5/525   W  0.34  121463   ...  POST/cgi/[] HTTP/1.1
5-0   22892  1/1/764   K  0.00  6        ...  GET/[].js HTTP/1.1
6-0   22893  1/1/449   K  0.00  5        ...  GET/[].js HTTP/1.1
7-0   22894  1/1/57    K  0.00  5        ...  GET/[].js HTTP/1.1
8-0   22895  1/1/426   K  0.00  4        ...  GET/[].js HTTP/1.1
9-0   -      0/0/40    .  0.00  2        ...  OPTIONS * HTTP/1.0
10-0  22897  0/0/16    _  0.00  4        ...  OPTIONS * HTTP/1.0
11-0  22898  0/0/8     _  0.00  4        ...  OPTIONS * HTTP/1.0

(Möglicherweise müssen Sie nach unten scrollen, um die Tabelle anzuzeigen. Die oberen Tabellen enthalten allgemeine Serverstatistiken. Anschließend wird eine Visualisierung der jeweils untergeordneten Elemente angezeigt)

update: Natürlich geht das davon aus, dass etwas schief läuft. (basierend auf Ihrem Kommentar von nur 10-15 Anfragen pro Sekunde). Ich habe einige andere Server, auf denen Leute Dateien von uns spiegeln, und da die Dateien ziemlich groß sind, gibt es einige, von denen bekannt ist, dass sie 500 Streams mit nicht so großer Bandbreite öffnen. Aber es ist völlig normal und verursacht keinen Absturz.

Wenn Sie Probleme mit Runaway-CGIs haben, sollten Sie die Verwendung von suExec oder CGIwrap erwägen, um die Ausführungszeit zu begrenzen. Es kann jedoch ein Aufwand für deren Verwendung entstehen.

Haben Sie genügend Internetbandbreite, um die Antworten zu verwalten? Die eingehenden Anforderungen sind anteilsmäßig sehr klein. Wenn Sie also ein Bein (LAN, WAN oder was auch immer) maximal ausschalten, stauen sich Ihre Server beim Versuch, in das Netzwerk zu schreiben.

Überprüfen Sie die Sendewarteschlange mit dem Befehl netstat (1) Ihres Systems. zB "netstat -nat" und schauen Sie sich die send Q Spalte an. Wenn Sie viele ausgehende Datenwarteschlangen haben, ist dies ein Zeichen dafür, dass Sie irgendwo im Netzwerk (außerhalb Ihrer physischen Netzwerkkarte) einen Engpass haben.