Wie begrenzt man am besten in oder mit LC den Zahl der php-cgi die gleichzeitig laufen und dem Speicher verbrauchen.
fastcgi begrenzen
-
-
Derzeit geht das nur über globale Einstellungen (z.B. /etc/apache2/mods-enabled/fcgid.conf).
Eine Konfiguration von FCGI/FPM pro Angebot/Vertrag ist aber geplant: https://www.liveconfig.com/dev/issues/164 -
Auch wenn der Thread schon sehr alt ist, nochmal ein Beitrag dazu:
Ich habe aktuell einen Server, bei dem mir hauptsächlich diverse Wordpress-Instanzen den Server "wegschießen". D. h. der RAM-Verbrauch erreicht auf dem Server kritische Werte und dann ist der Server erst einmal voll überlastet. D. h. der RAM ist irgendwann aufgebraucht, wonach dann Swap verwendet wird, was natürlich dazu führt, dass der Server extrem langsam wird. Ist der Swap dann auch noch aufgebraucht, dann wird geplanterweise der OOM-Killer aktiv und schießt mir da diverse Prozesse mit dem größten Speicherverbrauch weg. Einer der obersten Kanditaten ist da natürlich der mysqld, wonach dann alle DB-basierten Webseiten auf dem Server offline sind.
Das Problem tritt gelegentlich auf. Eine Ursache ist vermutlich, wenn ein Kunde im Wordpress-Backend gewisse Websiteeditoren startet.
Hier mal so der aktuelle Top-20 Speicherverbrauch nach aufräumen(KiB resident Memory):
Code
Alles anzeigen[web204] 814068 [web334] 734864 [web1] 560828 [web556] 548416 [web20] 454260 [web205] 307780 [web194] 278520 [web472] 214092 [web268] 199664 [web254] 162328 [web119] 153280 [web325] 136380 [web365] 97564 [web321] 96672 [web288] 68296 [web315] 62700 [web543] 54716 [web121] 52436 [web373] 43876 [web179] 41612
Ich habe apache2/prefork/fcgid im Einsatz. Im aktuellen Zustand laufen 64 php-cgi Prozesse.
fcgid.conf
Code<IfModule mod_fcgid.c> AddHandler fcgid-script .fcgi FcgidConnectTimeout 20 FcgidPassHeader Authorization FcgidMaxProcesses 100 </IfModule>
mpm_prefork.conf
Code<IfModule mpm_prefork_module> StartServers 15 MinSpareServers 15 MaxSpareServers 15 MaxRequestWorkers 150 MaxConnectionsPerChild 10 </IfModule>
System: Debian 9
Apache: 2.4.25-3+deb9u9
php: 7.2 + 7.3php.ini
memory_limit = 64MNachdem ich mir als Sofortmaßnahme erst mal den RAM der virtuellen Maschine von 8 GB auf 16 GB erhöht habe, habe ich jetzt als Workaround erst mal ein Prüfscript(php-Script) laufen, was in kurzen Intervallen schaut, wie viel Speicher die einzelnen Kunden verbrauchen. Wenn ein fest eingestelltes Limit erreicht ist, dann werden die PHP-Prozesse mittels kill sanft beendet. Ich vermute, dass das SIGTERM dazu führt, dass der FCGID-Prozess brav den aktuellen Request zu Ende verarbeitet, bevor er dann sich selbst beendet. Das wäre schön, wenn es so wäre.
Ich habe das Speicherlimit einmal sehr heruntergedreht und konnte trotz regelmässiger Aufräumarbeiten keinerlei Probleme bei der Webseitenfunktion feststellen. Also insgesamt zumindest scheinbar ein brauchbarer Workaround.
Das ist das Script:
https://github.com/megabert/sc…/apache2-user-mem-watcherAber so richtig doll finde ich das trotzdem nicht. Ich habe in der Apache fcgid Dokumentation noch nix gefunden, was mir da helfen könnte.
Gibt es da bessere Lösungsmöglichkeiten?
Hilft da evtl. FcgidMaxProcessesPerClass?
-
Ok. Nachdem ich die Erklärung in der Apache Dokumentation als unzureichend empfand, habe ich noch etwas gegoogelt und experimentiert.
Eine Klasse meint nach aktueller Erkenntnis ein Programm, dass unter einem bestimmten Benutzer läuft.
Ein Programm wäre also z. B. die PHP-Sriptumgebung. Ein Klasse ist dann PHP pro verschiedener Version. Hat also ein Benutzer PHP 7.1, PHP7.2 und PHP7.3 für verschiedene seiner Webseiten am laufen, dann wären das insgesamt 3 Klassen für diesen Benutzer.
Habe ich also FcgidMaxProcessesPerClass auf 10 gesetzt, würde das Limit für diesen Benutzer in Summe 30 sein.
Grundsätzlich ist schon der Wert 10 zu hoch. Wenn pro Kunde da 30 Prozesse gestartet werden, dann wären das mehrere GB RAM(abzgl. der gemeinsam genutzten Speicherbereiche), was mir definitiv zu viel ist. Ich bleibe deswegen im Moment bei der Speicherbegrenzung durch das Script in Kombination mit einem Maximalwert für FcgidMaxProcessesPerClass(10).
Für einen Server mit 8 GB RAM wäre das eine sichere Konfiguration:
-
Ich weiß der Thread ist schon etwas älter aber ich würde dies ebenfalls begrüßen.
Aktuell besteht hier die Problematik, dass auf dem Server 2 Pakete laufen, 1 großer Shop und 1 kleiner Blog. Hier wäre es einfach vorteilhaft, wenn man dem Shop z.B. 50 PHP-Prozesse und dem Blog lediglich 10 erlaubten könnte. Prinzipiell sollte sich dies ja auch einfach mit "FcgidMaxProcessesPerClass" umsetzen lassen.
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!