PHP-FPM-Setup: Verwenden Sie pm static für maximale Leistung

PHP-FPM-Setup: Verwenden Sie pm static für maximale Leistung

Eine unbearbeitete Version dieses Artikels wurde ursprünglich auf veröffentlicht haydenjames.io und hier mit ihrer Erlaubnis veröffentlicht Autor.

Ich erkläre Ihnen kurz und bündig, wie Sie PHP-FPM am besten konfigurieren, um den Durchsatz zu erhöhen, die Latenz zu reduzieren und CPU und Speicher konsistenter zu nutzen. Standardmäßig lautet die PM-Zeile (Prozessmanager) in PHP-FPM dynamisch, und wenn Sie nicht über genügend Speicher verfügen, ist es besser, es zu installieren auf Nachfrage. Vergleichen wir zwei Steuerungsoptionen basierend auf der php.net-Dokumentation und sehen wir, wie sich mein Favorit davon unterscheidet statisch PM für hohes Verkehrsaufkommen:

pm = dynamisch — Die Anzahl der untergeordneten Prozesse wird dynamisch basierend auf den folgenden Anweisungen konfiguriert: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.
pm = auf Anfrage - Prozesse werden bei Bedarf erstellt (im Gegensatz zur dynamischen Erstellung, wenn pm.start_servers beim Start des Dienstes gestartet werden).
pm = statisch — Die Anzahl der untergeordneten Prozesse ist festgelegt und wird durch den Parameter angegeben pm.max_children.

Einzelheiten finden Sie unter vollständige Liste der globalen Anweisungen php-fpm.conf.

Ähnlichkeiten zwischen dem PHP-FPM-Prozessmanager und dem CPU-Frequenzcontroller

Das mag vielleicht nicht zum Thema gehören, aber ich werde es mit dem Thema PHP-FPM-Konfiguration verknüpfen. Wer hat nicht mindestens einmal eine Prozessorverlangsamung erlebt – auf einem Laptop, einer virtuellen Maschine oder einem dedizierten Server? Erinnern Sie sich an die CPU-Frequenzskalierung? Diese Optionen sind verfügbar für nix und Windows können die Systemleistung und Reaktionsfähigkeit verbessern, indem sie die Prozessordrosselungseinstellung von ändern auf Nachfrage auf Leistung*. Vergleichen wir dieses Mal die Beschreibungen und schauen uns die Gemeinsamkeiten an:

Governor=ondemand — dynamische Skalierung der Prozessorfrequenz abhängig von der aktuellen Auslastung. Springt schnell auf die maximale Frequenz und reduziert sie dann, wenn die Inaktivitätsperioden zunehmen.
Gouverneur=konservativ= dynamische Frequenzskalierung abhängig von der aktuellen Last. Erhöht und verringert die Frequenz reibungsloser als bei Bedarf.
Gouverneur = Leistung — Die Frequenz ist immer maximal.

Einzelheiten finden Sie unter vollständige Liste der Parameter des Prozessorfrequenzreglers.

Sehen Sie die Ähnlichkeiten? Ich wollte diesen Vergleich zeigen, um Sie davon zu überzeugen, dass er am besten zu verwenden ist Uhr statisch für PHP-FPM.

Für den Prozessorreglerparameter Leistung trägt dazu bei, die Leistung sicher zu steigern, da sie fast ausschließlich vom CPU-Limit des Servers abhängt. Hinzu kommen natürlich noch Faktoren wie Temperatur, Akkuladung (im Laptop) und andere Nebenwirkungen, wenn der Prozessor ständig auf 100 % läuft. Die Leistungseinstellung sorgt für die schnellste Prozessorleistung. Lesen Sie zum Beispiel darüber force_turbo-Parameter im Raspberry Pi, mit dem das RPi-Panel den Regler verwendet Leistung, wobei die Leistungsverbesserung aufgrund der niedrigen CPU-Taktrate deutlicher spürbar sein wird.

Verwenden Sie pm static, um maximale Serverleistung zu erzielen

PHP-FPM-Option Uhr statisch hängt weitgehend vom freien Speicher auf dem Server ab. Wenn der Speicher knapp ist, ist es besser zu wählen auf Nachfrage oder dynamisch. Wenn Sie jedoch über Speicher verfügen, können Sie den Overhead des PHP-Prozessmanagers vermeiden, indem Sie pm festlegen statisch bis zur maximalen Serverkapazität. Mit anderen Worten: Wenn alles gut berechnet ist, müssen Sie es feststellen pm.static auf das maximale Volumen der ausführbaren PHP-FPM-Prozesse, ohne Probleme mit wenig Arbeitsspeicher oder Cache zu verursachen. Aber nicht so hoch, dass es die Prozessoren überlastet und eine Menge PHP-FPM-Operationen ansammelt, die darauf warten, ausgeführt zu werden.

PHP-FPM-Setup: Verwenden Sie pm static für maximale Leistung

Im Screenshot oben hat der Server pm = static und pm.max_children = 100, und das nimmt etwa 10 GB der verfügbaren 32 ein. Achten Sie auf die hervorgehobenen Spalten, hier ist alles klar. In diesem Screenshot gab es ungefähr 200 aktive Nutzer (mehr als 60 Sekunden) in Google Analytics. Auf dieser Ebene befinden sich etwa 70 % der untergeordneten PHP-FPM-Prozesse noch im Leerlauf. Dies bedeutet, dass PHP-FPM unabhängig vom aktuellen Datenverkehr immer auf die maximale Menge an Serverressourcen eingestellt ist. Ein Leerlaufprozess wartet auf Verkehrsspitzen und reagiert sofort. Sie müssen nicht warten bis pm erstellt untergeordnete Prozesse und beendet sie nach Ablauf des Zeitraums pm.process_idle_timeout. Ich habe den Wert auf sehr hoch eingestellt pm.max_requestsweil dies ein funktionierender Server ohne Speicherlecks in PHP ist. Sie können installieren pm.max_requests = 0 mit static, wenn Sie mit bestehenden und zukünftigen PHP-Skripten vollkommen vertraut sind. Es ist jedoch besser, die Skripte im Laufe der Zeit erneut auszuführen. Stellen Sie eine große Anzahl an Anfragen ein, da wir unnötige PN-Kosten vermeiden möchten. Zumindest zum Beispiel pm.max_requests = 1000 - je nach Menge pm.max_children und die Anzahl der Anfragen pro Sekunde.

Der Screenshot zeigt den Befehl Linux top, gefiltert nach u (Benutzer) und PHP-FPM-Benutzername. Es werden nur die ersten etwa 50 Prozesse angezeigt (ich habe nicht genau gezählt), aber im Wesentlichen zeigt top die Top-Statistiken an, die in das Terminalfenster passen. In diesem Fall sortiert nach % CPU (%CPU). Um alle 100 PHP-FPM-Prozesse anzuzeigen, führen Sie den folgenden Befehl aus:

top -bn1 | grep php-fpm

Wann sollte man PM OnDemand und Dynamic verwenden?

Wenn Sie pm verwenden dynamisch, treten Fehler wie dieser auf:

WARNING: [pool xxxx] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 32 children, there are 4 idle, and 59 total children

Versuchen Sie, den Parameter zu ändern. Der Fehler wird nicht behoben beschrieben in diesem Beitrag auf Serverfault. In diesem Fall war der pm.min-Wert zu klein, und da der Webverkehr so ​​stark schwankt und hohe Spitzen und tiefe Täler aufweist, ist es schwierig, pm angemessen anzupassen dynamisch. Normalerweise wird pm verwendet auf Nachfrage, wie im selben Beitrag empfohlen. Aber das ist noch schlimmer, denn auf Nachfrage Beendet inaktive Prozesse auf null, wenn nur wenig oder gar kein Datenverkehr vorhanden ist, und am Ende entsteht trotzdem der Overhead durch sich ändernden Datenverkehr. Es sei denn natürlich, Sie legen eine große Wartezeit fest. Und dann ist es besser zu verwenden pm.static + hohe Zahl pm.max_requests.

PM dynamisch und insbesondere auf Nachfrage kann nützlich sein, wenn Sie über mehrere PHP-FPM-Pools verfügen. Sie hosten beispielsweise mehrere cPanel-Konten oder mehrere Websites in verschiedenen Pools. Ich habe einen Server mit beispielsweise mehr als 100 cpanel-Konten und etwa 200 Domänen, und pm.static oder sogar dynamisch würden mich nicht retten. Alles, was Sie hier brauchen, ist auf NachfrageImmerhin erhalten mehr als zwei Drittel der Websites wenig oder gar keinen Traffic, und das mit auf Nachfrage Alle untergeordneten Prozesse fallen aus, was uns viel Speicher spart! Glücklicherweise haben die cPanel-Entwickler dies bemerkt und den Wert auf Standard gesetzt auf Nachfrage. Zuvor war die Standardeinstellung dynamisch, PHP-FPM war überhaupt nicht für ausgelastete Shared-Server geeignet. Viele haben verwendet suPHP, weil Uhr dynamisch verbrauchte Speicher, selbst bei inaktiven Pools und cPanel-PHP-FPM-Konten. Wenn der Datenverkehr gut ist, werden Sie höchstwahrscheinlich nicht auf einem Server mit einer großen Anzahl von PHP-FPM-Pools gehostet (Shared Hosting).

Abschluss

Wenn Sie PHP-FPM verwenden und Ihr Datenverkehr stark ist, wenden Sie sich an die Prozessmanager auf Nachfrage и dynamisch Für PHP-FPM ist der Durchsatz aufgrund des inhärenten Overheads begrenzt. Verstehen Sie Ihr System und konfigurieren Sie PHP-FPM-Prozesse entsprechend der maximalen Serverkapazität. Erstes Set pm.max_children Abhängig von der maximalen PM-Nutzung dynamisch oder auf Nachfrage, und erhöhen Sie diesen Wert dann auf ein Niveau, bei dem Speicher und Prozessor ohne Überlastung arbeiten. Das werden Sie merken Uhr statischDa sich alles im Arbeitsspeicher befindet, führen Verkehrsspitzen mit der Zeit zu weniger CPU-Spitzen und die durchschnittliche Server- und CPU-Auslastung gleicht sich aus. Die durchschnittliche PHP-FPM-Prozessgröße hängt vom Webserver ab und erfordert eine manuelle Konfiguration, weshalb dies bei automatisierteren Prozessmanagern der Fall ist dynamisch и auf Nachfrage - bekannter. Ich hoffe, der Artikel war nützlich.

UPD Benchmark-Diagramm hinzugefügt ab. Wenn sich PHP-FPM-Prozesse im Speicher befinden, erhöht sich die Leistung auf Kosten des Speicherverbrauchs dort, wo sie warten. Finden Sie die beste Option für sich.

PHP-FPM-Setup: Verwenden Sie pm static für maximale Leistung

Source: habr.com

Kommentar hinzufügen