Warum sind auf meinem Server unzählige PHP-Prozesse geöffnet?

Warum sind auf meinem Server unzählige PHP-Prozesse geöffnet?

Heute habe ich gesehen, dass eine meiner Websites nicht funktioniert. Ich habe mich also per SSH mit dem Server verbunden und „ps -eF“ ausgeführt. Ich sehe etwa 200 PHP-Prozesse, die alle seit 4 Stunden laufen.

Apache wird mit MPM-Ereignissen und Mod-Fcgid erstellt.

Ich habe alle PHP-Prozesse beendet und jetzt läuft es einwandfrei. Warum passiert das? Ist das das erwartete Verhalten?

Ich verstehe nicht wirklich, wie Apache die Anzahl der PHP-Prozesse und ihre Prozess-IDs verfolgt, daher wäre es nett, wenn mir jemand auch einen Hinweis geben könnte, wann ich darüber lesen kann.

Außerdem habe ich den Befehl „ab“ (Apache Benchmark) verwendet, um zu sehen, ob dies immer passiert. Ich habe ihn also etwa 4-5 Mal hintereinander mit 30 gleichzeitigen Anfragen ausgeführt und wieder laufen etwa 150 PHP-Prozesse. Wenn ich „ab“ jetzt weiter ausführe, werden keine weiteren Prozesse gestartet und die Website funktioniert immer noch. Um klarzustellen, die 4-5 Male, die ich „ab“ ausgeführt habe, waren nicht zur gleichen Zeit. Sobald ein „ab“-Prozess abgeschlossen war, habe ich einen anderen ausgeführt, aber jedes Mal, wenn ich „ab“ ausgeführt habe, habe ich 30 gleichzeitige Anfragen gestellt.

Bitte klären Sie mich auf! Danke :)

Antwort1

Ja, das ist das erwartete Verhalten. Es scheint, als hätten Sie 5 Kopien von ab gleichzeitig ausgeführt. Dies führte dazu, dass Ihre 150 PHP-Prozesse die 30 Anfragen für jeden Ihrer 5 ab-Prozesse verarbeiten mussten.

Apache funktioniert am besten, wenn alle Threads im Speicher ausgeführt werden können. Es wird eine Auslastung geben, bei der die Threads auf die Festplatte ausgelagert werden müssen. Die Reaktionszeit verschlechtert sich in diesem Fall rapide. Das Beenden von Prozessen wie von Ihnen wird die Leistung verbessern. Die Serverleistung kann in diesem Fall jedoch nachlassen. Wenn die maximale Anzahl an Threads zu hoch konfiguriert ist, ist es relativ einfach, mit diesem Verhalten einen DOS (Denial Of Service) auszuführen.

Ein weiterer Grund für Probleme ist, wenn zwei Prozesse bei zwei Ressourcen in eine Sackgasse geraten. Wenn die anderen Prozesse eine dieser Ressourcen benötigen, reagieren sie möglicherweise nicht. Apache begrenzt in diesem Fall die Anzahl der erstellten Prozesse. Das Beenden eines der blockierten Prozesse sollte das Problem beheben. Abhängig von der normalen Sperrreihenfolge kann es erforderlich sein, einen bestimmten Prozess zu beenden, um eine weitere Sackgasse zu verhindern. Dies hat wenig oder keine Auswirkungen auf die Serverleistung.

Programmierfehler können auch dazu führen, dass Threads hängen bleiben. Dies kann dazu führen, dass die Threads hängen bleiben, wie Sie gesehen haben. Im Nachhinein herauszufinden, was passiert ist, ist schwierig, aber der Inhalt der Protokolle Ihres Apache-Servers kann hilfreich sein. Überprüfen Sie das Fehlerprotokoll auf Probleme. Das Zugriffsprotokoll enthält möglicherweise Einträge für die Anfragen, die zu der Zeit hängen geblieben sind, als Sie die Prozesse beendet haben.

Apache sollte einige Prozesse beenden, wenn sie für einen bestimmten Zeitraum nicht verwendet werden. Dies wird durch den MaxSpareThreadsParameter gesteuert. Überprüfen Sie Ihre Steuerdatei, die einige Kommentare zu den Parametern für Threads, Server und Clients enthalten sollte. Die Standardwerte sind normalerweise gut.

Bei Problemen mit dem Code MaxRequestsPerChildhilft oft eine Einstellung im Bereich zwischen 5000 und 100. Je kleiner die Zahl, desto häufiger müssen neue Threads erstellt werden und desto härter muss der Apache-Server arbeiten.

EDIT: Apache öffnet beim Start eine Reihe von Threads. Dies hängt von der Interaktion mehrerer Parameter ab. Siehe dieMPM-Konfigurationsdokumentationfür Details zu den Parametern. Dies ist unabhängig von der Serverauslastung und ist normalerweise die Mindestanzahl von Threads, die ein laufender Server am Laufen hält.

verwandte Informationen