php5-fpm: Server hat pm.max_children erreicht

41

Ich habe Nginx + php5-fpm . Mehrmals pro Stunde bleibt meine Website hängen und im Logbuch sehe ich folgendes:

WARNUNG: Der [Pool-WWW] -Server hat die Einstellung pm.max_children (5) erreicht.

Die Datei /etc/php5/fpm/pool.d/www.conf enthält die folgende Konfiguration:

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Server: AMD Opteron ™ 3280, Octo-Core, 8 x 2,4 GHz, 16 GB DIMM (DDR3).

Ich habe keine Ahnung, welche Nummern ich für diesen Server in die www.conf-Datei eintragen soll. Kann ich jemandem helfen? Vielen Dank

user1821484
quelle

Antworten:

40

Es gibt viele mögliche Gründe, warum Ihr PHP-FPM das erreichen würde max_children. Die häufigsten sind:

  • Viele parallele Anfragen von Ihren Kunden
  • Langsame Ausführung der PHP-Skripte
  • Sehr niedrige Einstellung der max_children

Wenn Sie sich die technischen Daten Ihres Computers ansehen und davon ausgehen, dass nichts anderes als PHP + Nginx ausgeführt wird, können Sie den Wert auf einen höheren Wert als 5 einstellen. Sie sagen, Sie haben 8 Kerne, normalerweise benötigt Nginx viel weniger CPU als PHP, also mit 5 Kindern Sie werden wahrscheinlich nie in der Lage sein, alle von ihnen zu verwenden. Normalerweise stelle ich es auf so etwas wie die Anzahl der Kerne x 2 oder die Anzahl der Kerne x 4 ein , abhängig vom Speicherverbrauch Ihrer PHP-Skripte.

Wiederholung
quelle
Es ist eine Dating-Website mit PHP-Chat und Benutzer senden Millionen von Sofortnachrichten. Letzte Nacht, als ich ~ 300 Benutzer online hatte, war das Ergebnis des Befehls netstat -an | grep 80 | wc - fast 400.
user1821484
1
Ich habe tatsächlich eine ähnliche Dating-Website. Ich denke, Sie brauchen definitiv mehr PHP-Kinder. Meine Konfiguration ist wie folgt: 20.000 gleichzeitige Online-Benutzer, 12 PHP-Maschinen mit jeweils 8 Kernen, 32 Arbeiter auf jeder der PHP-Maschinen. Das funktioniert ganz gut Sie sollten sich auch ansehen, wie viel freien Speicher Sie haben, ich vermute, Sie haben einige, es sei denn, Ihr PHP ist riesig. Wenn Sie freien Speicher haben, können Sie ihn dann für weitere Mitarbeiter verwenden.
Wiederholung
@ user1821484 Dies ist korrekt. pm.max_childrenist viel zu niedrig . Ein Wert von 10 ist für einen kleinen VPS-Server mit 1 GB RAM angemessen. Sie haben einen viel größeren Server. Erhöhen Sie diesen Wert, bis Sie die Fehler nicht mehr erhalten, und erhöhen Sie ihn dann erneut, falls Sie eine Verkehrsspitze erhalten.
Michael Hampton
Danke für die Antworten. Ich habe die Einstellung für pm.max_children auf 10 erhöht und nun habe ich folgende Fehlermeldung erhalten: WARNUNG: [pool www] scheint ausgelastet zu sein (möglicherweise müssen Sie die Anzahl der pm.start_servers oder pm.min / max_spare_servers erhöhen), und es gibt 16 Kinder mit 0 müßig und insgesamt 8 Kinder. Kann mir jemand vorschlagen, was ich erhöhen muss? Vielen Dank.
user1821484
Kerne x 2 oder Kerne x 4 klingen für mich sehr leise. Ich habe eine Maschine mit 8 Kernen und 8 GB RAM mit pm.max_children = 48 und wir bekommen immer noch den Server mit pm.max_children- Warnungen erreicht. Dieser Computer ist nicht in der Nähe seiner CPU- oder Speichergrenzen. Ich denke, ein besserer Ansatz wäre, diese Einstellung in Verbindung mit den entsprechenden Nginx- (oder Apache-) Einstellungen zu optimieren und einen Wert auszuwählen, nachdem Sie bestimmt haben, wie viel Speicher jeder PHP-Prozess belegt.
S. Imp
18

Ich fand heraus, dass das Setzen des Werts pm.max_requests (der standardmäßig auskommentiert ist) zur Behebung dieser Fehler beitrug. Diese Einstellung erzwingt, dass untergeordnete Anforderungen nach dem Ausführen einer bestimmten Anzahl von Anforderungen erneut gestartet werden. Sie kann hilfreich sein, wenn irgendwo in Ihrem Code oder in den Bibliotheken von Drittanbietern Speicherverluste auftreten.

In /etc/php-fpm.d/www.conf :

pm.max_requests = 500
Tom Jowitt
quelle
13

Dieser Link kann hilfreich sein. Er erläutert, wie die Anzahl der untergeordneten Prozesse basierend auf der Größe des Arbeitsspeichers im System berechnet wird:

HTF
quelle
7
Diese Antwort ist unbrauchbar, sobald der Link weg ist.
miken32
2
Grundsätzlich heißt es auf dem Link ... Ein geeigneter Wert für pm.max_children kann wie folgt berechnet werden: pm.max_children = Gesamter RAM für den Webserver /
Maximale