So verhindern Sie, dass PHP-FPM unter Linux zu viel RAM verbraucht
Wenn Sie einen LEMP-Stack (Linux, NGINX, MySQL/MariaDB und PHP) bereitgestellt haben, verwenden Sie wahrscheinlich FastCGI-Proxying innerhalb von NGINX (als HTTP-Server) für die PHP-Verarbeitung. PHP-FPM (ein Akronym für FastCGI Process Manager) ist eine weit verbreitete und leistungsstarke alternative PHP FastCGI-Implementierung.
Hier sind die nützlichen Anleitungen zum Einrichten des LEMP-Stacks unter Linux.
- So installieren Sie den LEMP-Stack mit PhpMyAdmin in Ubuntu 20.04
- So installieren Sie den LEMP-Server unter CentOS 8
- So installieren Sie LEMP auf einem Debian 10-Server
In letzter Zeit wurden alle unsere PHP-Websites auf einem unserer LEMP-Webserver langsam und reagierten schließlich nicht mehr, wenn sie sich beim Server anmeldeten. Wir stellten fest, dass das System zur Neige ging: PHP-FPM hatte den größten Teil des Arbeitsspeichers verbraucht, wie im folgenden Screenshot (Glances – System Monitoring Tool) zu sehen ist.
$ glances
In diesem Artikel zeigen wir, wie Sie verhindern können, dass PHP-FPM unter Linux zu viel oder den gesamten Systemspeicher (RAM) verbraucht. Am Ende dieser Anleitung erfahren Sie, wie Sie den PHP-FPM-Speicherverbrauch um 50 % oder mehr reduzieren können.
Reduzieren Sie die PHP-FPM-Speicherauslastung
Nach einigen Recherchen im Internet stellten wir fest, dass wir den PHP-FPM-Prozessmanager und bestimmte Aspekte davon neu konfigurieren mussten, um den Speicherverbrauch von PHP-FPM in der Pool-Konfigurationsdatei zu reduzieren.
Der Standardpool ist www und seine Konfigurationsdatei befindet sich unter /etc/php-fpm.d/www.conf (unter CentOS/RHEL/Fedora) oder /etc/php/7.4/fpm/pool.d/www.conf (unter Ubuntu/Debian/Mint).
$ sudo vim /etc/php-fpm.d/www.conf [On CentOS/RHEL/Fedora]
sudo vim /etc/php/7.4/fpm/pool.d/www.conf [On Ubuntu/Debian/Mint]
Suchen Sie die folgenden Direktiven und legen Sie ihren Wert entsprechend Ihrem Anwendungsfall fest. Bei Direktiven, die auskommentiert sind, müssen Sie die Auskommentierung aufheben.
pm = ondemand
pm.max_children = 80
pm.process_idle_timeout = 10s
pm.max_requests = 200
Lassen Sie uns kurz die oben genannten Richtlinien und ihre Werte erklären. Die pm-Direktive legt fest, wie der Prozessmanager die Anzahl der untergeordneten Prozesse steuert. Die Standardmethode ist dynamic, was bedeutet, dass die Anzahl der untergeordneten Prozesse dynamisch festgelegt wird, abhängig von einigen anderen Direktiven, einschließlich pm.max_children, die die maximale Anzahl von Kindern definiert, die gleichzeitig aktiv sein können.
Der idealste Prozessmanager ist das Ondemand-Schema, bei dem beim Start keine untergeordneten Prozesse erstellt, sondern bei Bedarf erzeugt werden. Untergeordnete Prozesse werden nur dann geforkt, wenn neue Anforderungen basierend auf pm.max_children und pm.process_idle_timeout eine Verbindung herstellen, die die Anzahl der Sekunden definiert, nach denen ein Prozess im Leerlauf beendet wird.
Zu guter Letzt müssen wir den Parameter pm.max_requests setzen, der die Anzahl der Anfragen definiert, die jeder untergeordnete Prozess ausführen soll, bevor er wieder startet. Beachten Sie, dass dieser Parameter auch als Workaround für Speicherlecks in Bibliotheken von Drittanbietern verwendet werden kann.
Nachdem ich diese oben genannten Konfigurationen vorgenommen hatte, bemerkte ich, dass die RAM-Auslastung auf unserem Server jetzt in Ordnung ist. Haben Sie irgendwelche Gedanken oder Fragen zu diesem Thema? Kontaktieren Sie uns über das untenstehende Feedback-Formular.
