fastcgi begrenzen

  • 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):



    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.3


    php.ini
    memory_limit = 64M


    Nachdem 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-watcher


    Aber 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:


    Code
    <IfModule mod_fcgid.c>
      ...
      FcgidMaxProcesses 50
      FcgidMaxProcessesPerClass 5
    </IfModule>
  • 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!