it-swarm.com.de

richtig verstehen pm.max_children tuning

Ich habe einige Untersuchungen durchgeführt und festgestellt, dass dies den Wert pm.max_children berechnet und anpasst

https://myshell.co.uk/blog/2012/07/adjusting-child-processes-for-php-fpm-nginx/

aber zum Beispiel:

  • Ich habe 8 GB auf meinem Server
  • Ich hoste 30 Websites
  • pHP-Fpm durchschnittliche Prozessgröße um 40 MB
  • pHP-Fpm maximale Prozessgröße ca. 80 MB
  • Ich möchte maximal 5 GB meines Speichers für PHP-Fpm-Prozesse reservieren

Wenn ich das anwende:

pm.max_children = Total RAM für den Webserver/Max. untergeordnete Prozessgröße

Also in meinem Fall:

pm.max_children = 5120/80 = 64

Aber wenn ich pm.max_children = 64 zu jeder conf-Datei der php-fpm-Website hinzufüge, bedeutet dies, dass jede Website 64 Kinder verarbeiten kann X Größe von 1 Prozess (ex 40mb) = 2560Mb

Und wenn wir uns gleichzeitig vorstellen, dass alle 30 Websites den Wert pm.max_children erreicht haben, haben wir: 2560Mb (max pro Website) x 30 Websites = 76 800 Mb

Hab ich recht?

Si ja, das heißt, wenn viele Websites auf demselben Server gehostet werden, müssen wir das Ergebnis der Berechnung pm.max_children = 5120/80 = 64 Teilen = nach Anzahl der gehosteten Websites (hier 30).

Also 64/30 = 2,1 und pm.max_children = 2 pro Website

Ist es richtig oder nicht?

Vielen Dank

5
TooNetCreation

Ihre Berechnung ist korrekt nach dem, was ich sammle.

Viele Websites auf demselben Server funktionieren nur, solange nicht alle Websites alle verfügbaren Ressourcen gleichzeitig verwenden. Dies wird normalerweise als Überprovisionierung bezeichnet.

Ich schlage jedoch vor, nicht einfach pm.max_children um den verfügbaren RAM, aber um wie viele Arbeiter tatsächlich benötigt werden, damit die Bahnen richtig funktionieren. Beginnen Sie mit etwas Niedrigerem und überwachen Sie das php-fpm.log. Wenn das max_children Einstellung erreicht ist, finden Sie es im Protokoll und Sie können es erhöhen.

Stellen Sie außerdem sicher, dass die PHP Worker nur so lange wie nötig leben. In der folgenden Konfiguration kann ein Pool beispielsweise bis zu 32 PHP Worker if) verwenden Es gibt eine Reihe von Anforderungen, aber jeder Mitarbeiter wird nach 3 Sekunden Inaktivität beendet und wertvoller Arbeitsspeicher freigegeben:

pm = ondemand
pm.max_children = 32
pm.process_idle_timeout = 3s

Verwenden Sie den Prozessmanager ondemand, wenn Sie wenig RAM haben. Es ist etwas langsamer als die dynamic pm, verschwendet aber nicht RAM für inaktive Websites).

Wenn Sie die Gesamtzahl der PHP -Prozesse) steuern möchten, gibt es eine Einstellung namens process.max im php-fpm.conf. Ich habe es nie benutzt, aber es scheint mir, dass Sie es verwenden könnten, um sicherzustellen, dass es nie mehr als eine bestimmte Anzahl von Arbeitern gibt, unabhängig davon, wie die Pools konfiguriert sind.

Übrigens ist es eine sehr gute Idee, separate Pools für separate Websites zu verwenden, die separaten Benutzern gehören. Auf diese Weise haben Sie keine Probleme mit Benutzerberechtigungen oder mit Daten, die von anderen Websites zwischengespeichert wurden.

5
Oliver

Ich kann Sie nur aufgrund unserer Erfahrungen beraten.

Wir haben nur einen PHP-FPM-Pool, der zur gemeinsamen Nutzung von Ressourcen (CPU und RAM) ausgeführt wird.

Mehrere Pools ermöglichen unterschiedliche Benutzerkonten (z. B. www-data1, www-data2 ...) und können dazu beitragen, den Zugriff einzuschränken. Zusätzlich können Sie unterschiedliche Werte für CPU und RAM Verbrauch bei Bedarf) zuweisen.

Das folgende Beispiel verwendet jedoch nur einen Pool:

; www.conf
;
; set pool management to have a fixed number of php workers
pm = static
; number of php processes (6 processes per CPU core)
pm.max_children = 48

Ich empfehle die Verwendung der statischen Poolverwaltung. Dies bedeutet, dass es immer eine feste Anzahl von PHP Arbeitern) gibt.

; www.conf
;
; redirect worker stdout and stderr into main error log
catch_workers_output = yes

Dies kann hilfreich sein, wenn in Ihrer Anwendung Fehler auftreten.

; php-fpm.conf
;
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10s

Dies ist eine grundlegende Lebensüberwachung Ihrer laufenden PHP Arbeiter).

Vergessen Sie nicht, Ihren PHP-FPM-Dienst nach diesen Änderungen neu zu starten.

1
Jens Bradler