php-fpm Speicherverbrauch

  • Sag mal Alex, oder die anderen, die Erfahrungen mit FPM haben.... Wie schaut es denn eigentlich mit dem Speicherverbrauch aus?

    Ich meine, es heißt überall, FPM wäre das bessere Modul als mod_php. Irgendwie kann ich das so nicht wirklich nachvollziehen.

    Datenbank- und Fileserver: Ok, bei dem ist es besser. Da braucht der Apache-Prozess so an die 8 MB und jeder FPM-Child so um die 25 MB. Dort ist es perfekt, denn da laufen nur 2 FPM-Childs (1 Pool) und an die 200 Apache-Childs.

    Aber, bei meinem normalen Webserver, der zu 99,8% PHP verarbeitet und eben nicht wie der Fileserver zu 99,9% Bilder, schaut das ganz anders aus. Hier sehe ich keine Spur von, dass FPM besser ist, im Gegenteil.

    Mal als Vergleich, der alte Server, den der neue ersetzen soll. Der alte lief klassisch mit Apache-Prefork und mod_php. Da waren immer 80 Apache-Prozesse gestartet und bei Bedarf konnten noch mal 150 dazu kommen., also max. 230. So, da ist PHP dank mod_php ja immer im Prozess integriert. Jeder Prozess brauchte da an die 18 MB. Im Vergleich dazu ist der Fileserver natürlich deutlich besser, da der in der Regel ohne PHP auskommt.

    Aber mein neuer Server.... Hier haben die reinen Apache-Prozesse so an die 9 MB, also fast wie der Fileserver, aber die FPM Prozesse haben zwischen 25 und 50 MB, je nach dem, wie alt sie sind. Hallo, wie soll der denn da mit den ganzen Pools skalieren können? Es laufen 11 Pools, alle mit min 5 Childs, zwei auch mit bis zu 50 Childs.

    ^^ Rein rechnerisch sind 9x5 Childs + 2x50 Childs also vom Speicher her zu viel bzw. können zu viel werden. Dabei haben die Pools so aber noch nicht mal Lastreserven, die der alte Server immer und zu jeder Zeit hatte.

    Wo ist denn da der Denkfehler oder braucht FPM wirklich so viel mehr, entgegen den Aussagen, dass es weniger braucht? Ich müsste eigentlich für jeden Pool noch mal 10 Childs drauf packen, dass auch Lastspitzen abgefangen werden, aber das ist schlicht nicht möglich. Zudem ist ja unbekannt, welcher Pool das dann eventuell wann überhaupt braucht.... Und alle um 10 erhöhen? Keine Chance. Oder doch alles in einen Pool werfen und den hochschrauben, dann ist ja egal welche Seite Reserven anfordert? Nur irgendwie ist dann ja der Sinn von FPM und Prozesstrennung verloren.

    Hm. Wo ist mein Denkfehler?

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • Der Denkfehler ist evtl das du bei PHP5-FPM auch die Möglichkeit des "ondemand" Manager hast. Nicht dynamic, on demand. Geht aber erst ab PHP 5.3.?, also jedem aktuellen PHP.
    Von der Performance und Sicherheit ist es korrekt eingerichtet auch besser als alles andere. Es gibt allerdings auch schon was neues... HHVM was sehr vielversprechend sein soll. PHP7 kann sich allerdings damit auch messen. Da kommt dann wieder die FPM Variante, welche ihre Muskeln gut ausspielen kann und mit HHVM mithalten kann.

    Für die eigenen Webseiten bevorzuge ich FPM immer noch.

    Möglichkeiten die ich sehe sind:

    • FPM
    • HHVM
    • Fast-CGI
    • CGI
    • Mod PHP
    • und SUPHP

    PHP-FPM finde ich halt gut. Pagespeed.de läuft auch damit und kann locker ne Millionen Requests abarbeiten. Speicher Problem hatte ich bisher nicht, auch wenn ichs anfangs auf dem Schirm hatte.

    wenn etwas möglich erscheint mach ich das, wenn das nicht klappt gehts ans unmögliche und ansonsten das undenkbare.

    - nun stolz rauchfrei - Ich denke also Bing ich!

    Support 24h Bereitschaft 0173 6107465 - NUR Für Kunden von SEO NW!

  • Hi Alex,

    also das könnte dann ja mal ein interessantes Thema werden. In der Tat nutze ich "dynamic". "ondemand" hatte ich mich schon eingelesen, aber nicht so ganz verstanden, wo der Vorteil ist. Den Nachteil des ständigen i/o wegen Prozess auf zu hingegen schon.

    Gibt es eine Möglichkeit, die Gesamtzahl aller Kinder zu beschränken, Pool-übergreifend? Das habe ich nicht verstanden. Kann das ondemand? Wenn ja, dann wäre das die Lösung. Oder regelt der auch jeden Pool einzeln für sich? Dann hat es keinen Vorteil.

    Ich habe z.B. bei einer kleinen bis mittleren Seite:

    pm = dynamic
    pm.max_children = 15
    pm.start_servers = 4
    pm.min_spare_servers = 2
    pm.max_spare_servers = 8
    pm.max_requests = 500

    Das reicht da eigentlich aus. Allerdings gab es auch schon Warnungen, dass ich max_children erhöhen soll. Und genau das ist mein Problem. Ich kann ja nicht jeden Pool einfach so anheben. Wenn dann wirklich mal bei 4 oder 5 gleichzeitig die Reserven benötigt werden, dann ist der Speicher weg. Bei mod_php waren ja immer genug Prozesse da, die gerade nichts taten, dann wurden die einfach genommen. Jetzt ist das aber alles in einzelne Pools gekapselt und da fehlt mir die Dynamik. Was mache ich denn z.B. mit der Geranien-Seite, die a) 100 Zugriffe im Monat haben kann, aber auch b) 10.000 am Tag?

    Fast-CGI läuft natürlich, geht mit FPM ja gar nicht anders ;)

    HHVM habe ich auch schon durch. Das kommt derzeit nicht in Frage, so lange das nicht von PHP selbst kommt, sondern einer externen Firma.

    Wegen den Speicherproblemen. Klar hast Du da keine, Du hast ja auch Server jenseits von Gut und Böse ;) Meine Frage war aber eigentlich in dem Fall viel spezieller. Wie hoch ist der Speicherbedarf von einem Prozess?

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(

  • moin,

    Code
    pm = ondemand
    pm.max_children = 15
    pm.process_idle_timeout = 20s
    pm.max_requests = 500

    Pool Übergreifend glaube ich schon das es funktioniert.
    Global kannste das evtl mit process.max int definieren.


    Zitat

    process.max *** Link veraltet *** Die Höchstanzahl von Prozessen, die FPM forken wird. Dies wurde konzipiert, um die globale Prozessanzahl zu kontrollieren, wenn dynamisches PM in vielen Pools verwendet wird. Mit Vorsicht zu verwenden. Standardwert: 0.

    *** Link veraltet ***

    Du solltest aber mehr frei haben schon mit ondemand, solltest du das überall so nutzen. Du kannst auch am Timeout basteln, der ist mit 20 Sekunden sehr hoch gegriffen.
    Wenn halt nix genutzt wird, ist viel frei. Wird was genutzt - funktionierts. Wird zuviel genutzt = Server schmiert ab :holly:

    Ehrlich gesagt nehme ich PHP-FPM auch wegen der Sicherheit bevorzugt per default. Wie du gehört hast, das es auch ressourcen schonender sein soll, vom gleichen gehe ich auch aus. Kann das jetzt leider nicht belegen. Aja und FPM ist auch flott. Weiterer Vorteil.

    Wieviel Ram haste denn auf dem Server?

    wenn etwas möglich erscheint mach ich das, wenn das nicht klappt gehts ans unmögliche und ansonsten das undenkbare.

    - nun stolz rauchfrei - Ich denke also Bing ich!

    Support 24h Bereitschaft 0173 6107465 - NUR Für Kunden von SEO NW!

  • Ah, ok, die Option habe ich wohl jedes mal gekonnt überlesen ;) Hört sich gut an, wenn das ein globales Limit ist, dann kann ich die Pools hochschrauben und ein globales Limit von z.B. 180 setzen. In welchem Pool die dann sind oder wie sie sich verteilen, das ist dann egal.

    Allerdings steht da: "wenn dynamisches PM in vielen Pools verwendet wird". Also das was ich habe. Eben genau das Problem mit den vielen Pools :) Aber eben auch "dynamisches PM".

    RAM: 4GB, mein alter Server auch.

    Allerdings sind beim neuen jetzt fast 2 GB belegt, beim alten waren es immer so um die 0,8 bis 1GB. Der braucht also jetzt schon den doppelten Speicher und dabei sind noch nicht mal alle Webseiten wirklich online. Auf einigen bin ich alleine unterwegs.

    Wenn ein Mensch nicht um dich kämpft, hat er nur gewartet, dass du gehst. ;(