PHP-FPM konfigurieren: Verwendung von pm static für maximale Leistung

PHP-FPM konfigurieren: Verwendung von pm static für maximale Leistung

Die unveränderte Version des Artikels wurde ursprünglich veröffentlicht auf haydenjames.io und wird hier mit Genehmigung veröffentlicht von Autor.

Ich werde kurz erläutern, wie man PHP-FPM am besten konfiguriert, um die Bandbreite zu erhöhen, die Latenz zu senken und die CPU- und Speicherressourcen stabiler zu nutzen. Standardmäßig hat die PM-Zeile (Process Manager, Prozessmanager) in PHP-FPM den Wert dynamic, und wenn Sie nicht genügend Speicher haben, sollten Sie besser ondemandeinstellen. Lassen Sie uns die beiden Steuerungsoptionen anhand der Dokumentation von php.net vergleichen und sehen, worin sich mein Favorit unterscheidet: static pm für hohen Traffic:

pm = dynamic — die Anzahl der Kindprozesse wird dynamisch basierend auf den folgenden Direktiven eingestellt: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.
pm = ondemand — Prozesse werden nach Bedarf erstellt (im Gegensatz zur dynamischen Erstellung, bei der pm.start_servers beim Start des Dienstes gestartet wird).
pm = static — die Anzahl der Kindprozesse ist festgelegt und wird durch den Parameter pm.max_children.

Details finden Sie in im vollständigen Verzeichnis der globalen Direktiven php-fpm.conf.

Ähnlichkeiten des PHP-FPM-Prozessmanagers mit dem CPU-Frequenzregler

Das mag wie ein Off-Topic erscheinen, aber ich werde es mit dem Thema der PHP-FPM-Konfiguration verknüpfen. Wer hat nicht schon einmal erlebt, dass der Prozessor – sei es auf einem Laptop, in einer virtuellen Maschine oder auf einem dedizierten Server – ins Stocken gerät? Erinnern Sie sich an das Scaling der CPU-Frequenz? Diese Einstellungen, die für nix und Windows verfügbar sind, können die Leistung und die Reaktionsgeschwindigkeit des Systems verbessern, wenn Sie den Parameter des CPU-Regulators von ondemand findet man performance* ändern. Lassen Sie uns diesmal die Beschreibungen vergleichen und die Ähnlichkeiten betrachten:

Governor = ondemand – dynamisches Skalieren der CPU-Frequenz je nach aktueller Last. Wechselt abrupt auf die maximale Frequenz und senkt sie dann, wenn die Leerlaufzeiten zunehmen.
Governor = conservative = dynamisches Skalieren der Frequenz abhängig von der aktuellen Last. Erhöht und verringert die Frequenz sanfter als ondemand.
Governor = performance – die Frequenz ist immer maximal.

Details finden Sie in eine vollständige Liste der Parameter des CPU-Frequenzreglers.

Sehen Sie die Ähnlichkeiten? Ich wollte diesen Vergleich zeigen, um Sie zu überzeugen, dass es am besten ist, pm static für PHP-FPM zu verwenden.

Für den Prozessorregler ist die Einstellung Performance entscheidend, um die Leistung sicher zu steigern, da diese nahezu vollständig vom CPU-Limit des Servers abhängt. Zudem spielen natürlich Faktoren wie Temperatur, Akkuladung (bei Laptops) und andere Nebeneffekte, die durch eine ständige Auslastung des Prozessors bei 100 % entstehen können, eine Rolle. Die Einstellung Performance sorgt für die schnellste Arbeitsweise des Prozessors. Lesen Sie beispielsweise über den Parameter force_turbo auf dem Raspberry Pi, bei dem das RPi-Dashboard den Regler nutzt Performance, wo die Leistungssteigerung aufgrund der niedrigen Taktrate des CPUs deutlicher spürbar ist.

Die Verwendung von pm static für die maximale Serverleistung

hängt maßgeblich von dem verfügbaren Speicher auf dem Server ab. Wenn wenig Speicher vorhanden ist, sollte besser die Auswahl pm static . Auf der anderen Seite, wenn ausreichend Speicher vorhanden ist, können die Zusatzkosten des PHP-Prozessmanagers vermieden werden, indem pm ondemand oder dynamicauf die maximale Kapazität des Servers eingestellt wird. Mit anderen Worten, um alles gut zu kalkulieren, sollte man static pm.static auf die maximale Anzahl der PHP-FPM-Prozesse, die gleichzeitig ausgeführt werden können, setzen. für die maximale Anzahl an PHP-FPM-Prozessen, die ausgeführt werden können, ohne Probleme mit unzureichendem Speicher oder Cache. Aber nicht so hoch, dass die Prozessoren überlastet werden und eine Menge von PHP-FPM-Operationen warten müssen..

PHP-FPM konfigurieren: Verwendung von pm static für maximale Leistung

Im obigen Screenshot ist auf dem Server eingestellt pm = static und pm.max_children = 100, und das belegt ungefähr 10 GB von den verfügbaren 32. Beachten Sie die markierten Spalten, hier ist alles klar. In diesem Screenshot waren ungefähr 200 aktive Benutzer (mehr als 60 Sekunden) in Google Analytics. Auf diesem Niveau sind ungefähr 70 % der PHP-FPM-Kinderprozesse immer noch im Leerlauf. Das bedeutet, dass PHP-FPM immer mit der maximalen Ressourcenauslastung des Servers eingerichtet ist, unabhängig vom aktuellen Traffic. Der Leerlaufprozess wartet auf Verkehrsspitzen und reagiert sofort. Sie müssen nicht warten, bis pm Kindprozesse erstellt werden und dann beendet werden, wenn die Frist abläuft. pm.process_idle_timeout. Ich habe einen sehr hohen Wert für pm.max_requests, eingestellt, da dies ein Arbeitsserver ohne Speicherlecks in PHP ist. Sie können pm.max_requests = 0 Verwenden Sie PHP-FPM im statischen Modus, wenn Sie sich sicher sind, dass Ihre aktuellen und zukünftigen PHP-Skripte stabil sind. Es ist jedoch besser, die Skripte im Laufe der Zeit neu zu starten. Setzen Sie eine hohe Anzahl an Anfragen, um unnötige Ressourcenbelastungen zu vermeiden. Zum Beispiel mindestens pm.max_requests = 1000 – je nach Anzahl pm.max_children und Anzahl der Anfragen pro Sekunde.

Im Screenshot sehen Sie den Befehl Linux top, gefiltert nach u (user) und dem Benutzernamen PHP-FPM. Es werden nur die ersten 50 Prozesse oder so angezeigt (genau gezählt habe ich nicht), aber im Grunde zeigt top die wichtigsten Statistiken, die in das Terminalfenster passen. In diesem Fall mit der Sortierung nach % CPU (%CPU). Um alle 100 PHP-FPM-Prozesse zu sehen, führen Sie den Befehl aus:

top -bn1 | grep php-fpm

Wann pm ondemand und dynamic verwenden

Wenn Sie pm verwenden dynamic, treten folgende Fehler auf:

WARNUNG: [pool xxxx] scheint beschäftigt zu sein (möglicherweise müssen Sie pm.start_servers oder pm.min/max_spare_servers erhöhen), 32 Kinder werden erzeugt, 4 sind inaktiv und insgesamt 59 Kinder.

Versuchen Sie, die Einstellung zu ändern, der Fehler wird jedoch bestehen bleiben, wie in diesem Beitrag auf Serverfault beschrieben. Hier war der Wert von pm.min zu klein, und da der Webverkehr stark schwankt und hohe Spitzen und tiefe Rückgänge aufweist, ist es schwierig, pm angemessen zu konfigurieren. dynamic. Normalerweise wird bei dieser Situation pm verwendet. ondemand, wie im gleichen Beitrag empfohlen. Doch das ist noch schlimmer, denn ondemand schließt inaktive Prozesse auf null, wenn der Traffic gering oder gar nicht vorhanden ist, und letztlich werden Sie immer noch mit Kosten bei Trafficänderungen kämpfen. Es sei denn, Sie haben eine extrem lange Wartezeit eingestellt. In diesem Fall wäre es besser, auf die maximale Anzahl der PHP-FPM-Prozesse, die gleichzeitig ausgeführt werden können, setzen. + eine hohe Zahl pm.max_requests.

PM dynamic und besonders ondemand kann nützlich sein, wenn Sie mehrere PHP-FPM-Pools haben. Zum Beispiel hosten Sie mehrere cPanel-Konten oder mehrere Websites in verschiedenen Pools. Ich habe einen Server, auf dem beispielsweise über 100 cPanel-Konten und etwa 200 Domains laufen, und pm.static oder sogar dynamic würde mir nicht helfen. Hier braucht man nur ondemand, denn mehr als zwei Drittel der Websites erhalten wenig oder gar keinen Traffic, und mit ondemand fallen alle Kindprozesse aus, was uns eine Menge Speicher spart! Glücklicherweise haben die Entwickler von cPanel das bemerkt und den Standardwert festgelegt ondemand. Früher, als der Standardwert dynamic, war PHP-FPM überhaupt nicht geeignet für stark ausgelastete Shared-Server. Viele benutzten suPHP, weil pm dynamic hat selbst bei inaktiven Pools und cPanel PHP-FPM Speicher verbraucht. Wahrscheinlich werden Sie bei starkem Traffic nicht auf einem Server mit einer hohen Anzahl von PHP-FPM-Pools (Shared Hosting) untergebracht sein.

Fazit

Wenn Sie PHP-FPM verwenden und erheblichen Traffic haben, werden die Prozessmanager ondemand und dynamic für PHP-FPM die Bandbreite aufgrund ihrer inhärenten Kosten begrenzen. Überprüfen Sie Ihr System und konfigurieren Sie die PHP-FPM-Prozesse entsprechend der maximalen Kapazität des Servers. Setzen Sie zuerst pm.max_children abhängig von der maximalen Nutzung pm dynamic oder ondemand, und erhöhen Sie dann diesen Wert auf ein Niveau, bei dem der Speicher und die CPU ohne übermäßige Überlastung arbeiten. Sie werden feststellen, dass mit pm static, da alles im Speicher gespeichert ist, die Traffic-Spitzen im Laufe der Zeit weniger Spitzen für die CPU verursachen und die durchschnittlichen Lastwerte des Servers und der CPU ausgeglichen werden. Die durchschnittliche Größe des PHP-FPM-Prozesses hängt vom Webserver ab und erfordert manuelle Anpassungen, weshalb automatisierte Prozessmanager häufiger vorkommen — dynamic und ondemand — sind beliebter. Ich hoffe, der Artikel war hilfreich.

UDP Ein Benchmark-Diagramm wurde hinzugefügt ab. Wenn die PHP-FPM-Prozesse im Speicher sind, erhöht sich die Leistung durch den aktuellen Speicherverbrauch, in dem sie sitzen und warten. Finden Sie die optimale Lösung für sich.

PHP-FPM konfigurieren: Verwendung von pm static für maximale Leistung

Quelle: habr.com

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster