
Die unbearbeitete Version des Artikels wurde ursprünglich auf veröffentlicht und wird hier mit Genehmigung von .
Ich werde kurz erläutern, wie man PHP-FPM am besten konfiguriert, um die Durchsatzrate zu erhöhen, die Latenz zu verringern und CPU- sowie Speicherressourcen stabiler zu nutzen. Standardmäßig ist die Zeile PM (Process Manager, Prozessmanager) in PHP-FPM auf dynamic, und wenn Ihnen der Speicher ausgeht, ist es besser, ondemandzu wählen. Lassen Sie uns die beiden Steuerungsvarianten anhand der Dokumentation von php.net vergleichen und sehen, was mein Favorit für hohes Verkehrsaufkommen unterscheidet: static pm für hohen Verkehr:
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 Dienststart gestartet werden).
pm = static — die Anzahl der Kindprozesse ist festgelegt und wird durch den Parameter pm.max_children.
Details siehe .
Ähnlichkeiten zwischen dem Prozessmanager PHP-FPM und einem CPU-Frequenzregler
Das mag vielleicht off-topic erscheinen, aber ich werde es mit der Konfiguration von PHP-FPM verknüpfen. Wer hat nicht schon einmal CPU-Aussetzer erlebt – auf einem Laptop, einer virtuellen Maschine oder einem dedizierten Server? Erinnern Sie sich an das Skalieren der CPU-Frequenz? Diese Parameter, die für nix und Windows verfügbar sind, können die Leistung und Reaktionsgeschwindigkeit des Systems verbessern, wenn der Parameter des CPU-Reglers auf ondemand auf performance* geändert wird. Lassen Sie uns dieses Mal 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 wieder, wenn die Leerlaufzeiten zunehmen.
Governor = conservative = dynamisches Skalieren der Frequenz basierend auf der aktuellen Last. Erhöht und senkt die Frequenz sanfter als ondemand.
Governor = performance — die Frequenz ist immer maximal.
Details siehe .
Sehen Sie die Ähnlichkeit? 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 CPU-Regler ist der Parameter performance hilft, die Leistung sicher zu steigern, da sie fast vollständig vom CPU-Limit des Servers abhängt. Darüber hinaus gibt es natürlich auch Faktoren wie Temperatur, Akkuladezustand (bei Laptops) und andere Nebenwirkungen eines kontinuierlich mit 100 % laufenden Prozessors. Die Performance-Konfiguration sorgt für die schnellste Arbeitsweise des Prozessors. Lesen Sie zum Beispiel über , mit dem das RPi-Panel den Regler verwenden wird performance, wo die Leistungsverbesserung aufgrund der niedrigen CPU-Taktrate deutlicher sein wird.
Die Verwendung von pm static zur Maximierung der Serverleistung
Der PHP-FPM-Parameter pm static hängt stark vom verfügbaren Speicher auf dem Server ab. Wenn der Speicher niedrig ist, ist es besser, ondemand oder dynamic. Auf der anderen Seite, wenn Sie Speicher haben, können unnötige Kosten des PHP-Prozessmanagers vermieden werden, indem pm static auf die maximale Serverkapazität eingestellt wird. Mit anderen Worten, wenn alles gut durchdacht ist, sollte man pm.static auf die maximale Anzahl an PHP-FPM-Prozessen einstellen, die ausgeführt werden können, ohne Probleme mit unzureichendem Speicher oder Cache zu verursachen. Aber nicht so hoch, dass die Prozessoren überlastet werden und eine Menge PHP-FPM-Operationen in der Warteschlange stehen..
Im obigen Screenshot hat der Server pm = static und pm.max_children = 100, und das benötigt etwa 10 GB von den verfügbaren 32. Beachten Sie die hervorgehobenen Spalten, das ist hier alles klar. Bei diesem Screenshot gab es etwa 200 aktive Benutzer (mehr als 60 Sekunden) in Google Analytics. Auf diesem Niveau sind etwa 70 % der PHP-FPM-Kindprozesse immer noch inaktiv. Das bedeutet, dass PHP-FPM immer auf die maximalen Serverressourcen eingestellt ist, unabhängig vom aktuellen Traffic. Prozesse im Leerlauf warten auf Verkehrsspitzen und reagieren sofort. Sie müssen nicht warten, bis pm Kindprozesse erstellt und diese dann beendet, wenn der Zeitraum pm.process_idle_timeoutabgelaufen ist. Ich habe einen sehr hohen Wert für pm.max_requestsgesetzt, da dies ein Arbeitsserver ohne Speicherausfälle in PHP ist. Sie können pm.max_requests = 0 mit static einstellen, wenn Sie sich vollständig über Ihre bestehenden und zukünftigen PHP-Skripte im Klaren sind. Aber es ist besser, die Skripte mit der Zeit neu zu starten. Stellen Sie eine große Anzahl an Anfragen ein, denn wir möchten unnötige Kosten für pm vermeiden. Zum Beispiel mindestens pm.max_requests = 1000 – abhängig von der Anzahl pm.max_children und der Anzahl der Anfragen pro Sekunde.
Der Screenshot zeigt den Befehl , gefiltert nach u (Benutzer) und dem Benutzername PHP-FPM. Es werden nur die ersten 50 oder so Prozesse angezeigt (genau habe ich nicht gezählt), aber im Wesentlichen zeigt top die wichtigsten Statistiken, die in ein Terminalfenster passen. In diesem Fall wird nach % CPU (%CPU) sortiert. Um alle 100 PHP-FPM-Prozesse zu sehen, führen Sie den Befehl aus:
top -bn1 | grep php-fpmWann pm ondemand und dynamic verwenden?
Wenn pm verwendet wird dynamic, treten solche Fehler auf:
WARNUNG: [pool xxxx] scheint beschäftigt zu sein (Sie müssen möglicherweise pm.start_servers oder pm.min/max_spare_servers erhöhen), es werden 32 Kinder erzeugt, es sind 4 inaktiv, und insgesamt gibt es 59 Kinder.Versuchen Sie, den Parameter zu ändern, der Fehler wird nicht verschwinden, wie . In diesem Fall war der Wert von pm.min zu niedrig, und da der Webverkehr stark schwankt und hohe Spitzen sowie tiefe Täler hat, ist es schwierig, pm angemessen einzustellen. dynamic. Im Allgemeinen wird pm verwendet, ondemand, . Aber es ist noch schlimmer, denn ondemand beendet inaktive Prozesse bis null, wenn der Verkehr gering oder gar nicht vorhanden ist, und letztendlich werden Sie immer noch mit den Kosten bei Verkehrsschwankungen zu kämpfen haben. Es sei denn, Sie haben eine lange Wartezeit festgelegt. Dann sollten Sie besser pm.static + eine hohe Zahl pm.max_requests.
PM dynamic und insbesondere ondemand könnten 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, wo, sagen wir, über 100 cPanel-Konten und etwa 200 Domains sind, und pm.static oder sogar dynamic würden mich nicht retten. Hier brauchen wir nur ondemand, denn über zwei Drittel der Websites erhalten wenig oder gar keinen Verkehr, und mit ondemand fallen alle untergeordneten Prozesse aus, was uns eine Menge Speicher spart! Glücklicherweise haben die Entwickler von cPanel dies bemerkt und den Standardwert auf ondemandgesetzt. Früher, als der Standardwert dynamicwar, war PHP-FPM überhaupt nicht für stark genutzte Shared-Server geeignet. Viele verwendeten suPHP, weil pm dynamic auch bei inaktiven Pools und cPanel-Konten RAM verbraucht hat. Wahrscheinlich werden Sie bei gutem Verkehr nicht auf einem Server mit vielen PHP-FPM-Pools (Shared Hosting) gehostet.
Fazit
Wenn Sie PHP-FPM verwenden und Ihr Verkehr erheblich ist, werden die Prozessmanager ondemand und dynamic für PHP-FPM die Durchsatzkapazität aufgrund ihrer inhärenten Kosten einschränken. Untersuchen Sie Ihr System und passen Sie die PHP-FPM-Prozesse an die maximale Kapazität des Servers an. Stellen Sie zunächst ein pm.max_children je nach maximaler Nutzung von pm dynamic oder ondemand, und erhöhen Sie dann diesen Wert auf das Niveau, bei dem der Speicher und der Prozessor ohne übermäßige Überlastung arbeiten. Sie werden feststellen, dass pm static, da alles im Speicher gespeichert ist, Traffic-Spitzen über die Zeit weniger Spitzen für den Prozessor verursachen und die durchschnittlichen Lastwerte von Server und Prozessor sich angleichen. Die durchschnittliche Größe des PHP-FPM-Prozesses hängt vom Webserver ab und erfordert manuelle Anpassungen, weshalb automatisiertere Prozessmanager dynamic und ondemand — beliebter sind. Ich hoffe, der Artikel war hilfreich.
UPD Ein Benchmark-Diagramm wurde hinzugefügt . Wenn die PHP-FPM-Prozesse im Speicher sind, erhöht sich die Leistung durch den Speicherverbrauch, wo sie sitzen und warten. Finden Sie die optimale Lösung für sich.
Quelle: habr.com
