Wenn Sie PHP-FPM auf Ihrem Server verwenden, sind Sie möglicherweise bei steigendem Traffic auf diese Warnung gestoßen: „WARNING: [pool www] seems busy (you may need to increase pm.start_servers, pm.min_spare_servers, pm.max_spare_servers, or pm.max_children)“. Diese Warnung ist ein Thema, bei dem die Lösung oft falsch verstanden wird. Da ich als HostingServer.com.tr häufig dazu befragt werde, habe ich mich entschlossen, diesen Artikel zu schreiben. Anstatt einfach nur den max_children-Wert zu erhöhen, werden wir den tatsächlichen Bedarf berechnen und eine dauerhafte Lösung schaffen.
Warum wird die Warnung ausgegeben?
PHP-FPM erstellt für jede Anfrage einen separaten Child-Prozess. pm.max_children bestimmt die maximale Anzahl gleichzeitig laufender Prozesse. Wenn dieser Wert erreicht ist, werden neue Anfragen in die Warteschlange gestellt und erst bearbeitet, wenn Prozesse frei werden. Wenn die Anzahl der wartenden Anfragen stark ansteigt, wird der Server langsamer und Sie erhalten Fehler. Die Standardeinstellungen reichen oft nicht aus. Beispielsweise hat ein virtueller Server von DigitalOcean mit 2 GB RAM standardmäßig einen max_children-Wert von 5-10. Wenn Sie gleichzeitig 30-40 Besucher haben, ist dieser Wert viel zu niedrig.
Die definitive Lösung: Ressourcenberechnung
Um den richtigen max_children-Wert zu ermitteln, müssen Sie wissen, wie viel RAM jeder PHP-FPM-Prozess verbraucht. Das erfahren Sie mit folgendem Befehl: ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%dMB", sum/1024) }'. Dieser Befehl gibt den gesamten RAM-Verbrauch aller PHP-FPM-Prozesse in MB aus. Teilen Sie diesen Wert durch die Anzahl der Prozesse, um den durchschnittlichen Speicherverbrauch pro Prozess zu erhalten. Wenn beispielsweise 10 Prozesse 512 MB verbrauchen, sind es etwa 51 MB pro Prozess. Vergessen Sie nicht, dass auf Ihrem Server auch andere Dienste laufen. Sie können etwa 80 % des gesamten RAMs für PHP-FPM reservieren. Bei 2 GB RAM entspricht das 1,6 GB = 1638 MB. 1638 / 51 ≈ 32. Also max_children = 32. Passen Sie auch pm.max_spare_servers und pm.min_spare_servers entsprechend an. Mein Vorschlag: min_spare = 5, max_spare = 15.
Alternative Methode: pm.status-Messung
Ein anderer Weg ist die Aktivierung der pm.status-Seite und die Überwachung der Live-Daten. Konfigurieren Sie pm.status_path = /status und rufen Sie curl http://localhost/status?full auf, um die aktuelle Prozessanzahl und die wartenden Anfragen (Queue) zu sehen. Wenn die 'listen queue' ständig über 0 liegt, muss max_children erhöht werden. Aber Vorsicht: Nur zu erhöhen reicht nicht; wenn der Server beginnt, Swap zu nutzen, reicht der RAM nicht aus. Dann müssen Sie entweder mehr RAM bereitstellen oder Ihre Anwendung optimieren.
PHP-FPM-Einstellungen ändern
Um die Einstellungen zu ändern, bearbeiten Sie die Datei /etc/php/8.x/fpm/pool.d/www.conf. Die Standardwerte sind: pm = dynamic, pm.max_children = 5, pm.start_servers = 2, pm.min_spare_servers = 1, pm.max_spare_servers = 3. Tragen Sie Ihre berechneten Werte ein und starten Sie den Dienst neu: systemctl restart php8.2-fpm (je nach Version). Beobachten Sie einen Tag lang; wenn die Warnung erneut auftritt, wiederholen Sie die Berechnung.
Wichtige Hinweise
- Nicht jeder Prozess verbraucht gleich viel Speicher; das hängt von Ihrer Anwendung ab. Eine WordPress-Seite kann 30 MB, Magento 100 MB verbrauchen.
- Auf dem Server laufende Dienste wie MySQL, Nginx, Redis belegen ebenfalls Speicher. Berücksichtigen Sie diese.
- Vermeiden Sie Swap-Nutzung; übermäßiger Swap verschlechtert die Leistung.
Wichtig: Eine zu hohe Einstellung von max_children kann zum Absturz Ihres Servers führen. Erhöhen Sie immer schrittweise und mit Bedacht.
Fazit
Die PHP-FPM max_children-Warnung beeinträchtigt bei Vernachlässigung die Benutzererfahrung. Mit der richtigen Methode ist die Lösung jedoch einfacher als gedacht. Messen Sie die Ressourcen Ihres Servers, berechnen Sie realistisch und passen Sie die Einstellungen entsprechend an. Auf HostingServer.com.tr finden Sie weitere Inhalte zu diesem Thema und können in den Kommentaren Ihre Fragen stellen. Im nächsten Artikel werde ich auf die Live-Überwachung mit pm.status eingehen.