Knowledge base

Het juiste aantal child-processen voor PHP-FPM bepalen

Categorie: Cloud servers

CentOS Debian Linux Nginx PHP

U kunt de effecten van een onjuiste configuratie van child-processen ervaren als uw website prestatieproblemen heeft, veel resources (CPU, geheugen) gebruikt of foutmeldingen in uw php-fpm.log bestand krijgt zoals:

[pool www] server reached pm.max_children setting (x), consider raising it
[pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)

Andere voorbeelden van veelvoorkomende problemen die duiden op een behoefte aan PHP-FPM tuning zijn:

  • Trage website- of applicatieprestaties en vertragingen bij het verwerken van aanvragen
  • Hoog CPU- of geheugengebruik: te veel child processen kunnen uw server overbelasten, terwijl te weinig kan leiden tot een trage responstijd
  • 502/504 Gateway Timeout fouten

Al deze symptomen vertellen u dat u niet genoeg ruimte over heeft voor requests binnen uw PHP-FPM proces. Laten we dat oplossen!

Het juiste aantal processen voor PHP-FPM bepalen

Op basis van de realtime logs is het eenvoudig om de juiste instellingen voor de php-fpm configuratie op je server te bepalen. De exacte instellingen zijn gebaseerd op het geheugen dat beschikbaar is op je cloud server... maar wees ervan bewust dat je ook rekening moet houden met de andere processen die ook knabbelen aan de beschikbare resources (voorbeelden: MariaDB, MySQL, Redis). Gebruik nooit zomaar 100% van het geheugen welke beschikbaar is voor jouw cloud server!

De volgende stappen moeten worden aangepast in het bestand /etc/php/8.2/fpm/pool.d/www.conf (dit is een typische locatie op een Linux Debian-server, dit pad kan dus variëren):

pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 4
pm.max_spare_servers = 8

Om de juiste waarden te vinden, moet je meten hoeveel geheugen één enkel PHP proces gebruikt.

Let op! Dit is alleen mogelijk op een server waar de website een stabiel geheugengebruik per proces heeft. Als de FPM-pool wordt gebruikt door meerdere websites met verschillende eisen, kan het geheugengebruik van processen sterk variëren. Dit maakt het moeilijk om het gemiddelde gebruik te bepalen.

De volgende regel (uitgevoerd in shell) geeft waardevolle uitvoer:

ps -ylC php-fpm8.2 --sort:rss

De naam php-fpm8.2 komt overeen met je procesnaam.
Het is mogelijk dat het een andere naam heeft op jouw server, dit hangt af van de PHP pakketten die gebruikt worden.

Je zou de juiste procesnaam op deze manier moeten kunnen vinden:

ps -e | grep php-fpm

De kolom RSS bevat het gemiddelde geheugengebruik in kilobytes per proces.

S UID PID PPID C PRI NI RSS SZ WCHAN TTY TIJD CMD
S 0 24439 1 0 80 0 6364 57236 - ? 00:00:00 php-fpm8.2
S 33 24701 24439 2 80 0 61588 63335 - ? 00:04:07 php-fpm8.2
S 33 25319 24439 2 80 0 61620 63314 - ? 00:02:35 php-fpm8.2

In dit voorbeeld: 61588 kilobytes of ongeveer +- 60 Mb per proces.

Een andere optie is om het gemiddelde van één php-fpm proces te krijgen:

ps --no-headers -o "rss,cmd" -C php-fpm8.2 | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"Mb") }'

Berekenen van pm.max_children

Om de juiste waarde voor het aantal pm.max_children te krijgen, moeten we controleren hoeveel geheugen onze cloud server kan gebruiken voor het php-fpm proces, en dat totaal delen door de gemiddelde grootte in Mb van ons zojuist gecontroleerde proces.

Een voorbeeld:

Onze cloudserver heeft 4 GB RAM.
We hebben ook een MariaDB databaseservice op de server draaien. MariaDB gebruikt minstens 1 GB RAM.
Dan blijft er 3 GB RAM over, maar we moeten een marge aanhouden. In dit geval nemen we 0,5 GB.

Als we rekening houden met deze marge, houden we 2560 Mb (of ruwweg 2,5 GB RAM) over voor onze PHP processen.

We delen ons vrije geheugen door de hoeveelheid die een PHP proces gebruikt. Dit geeft ons het maximale aantal processen:

2560 Mb / 60 Mb = 42 processen

Dus, pm.max_children brengt ons op 42 max_children
Dit kan worden gebruikt om het php-fpm pool configuratiebestand bij te werken.

We hebben de volgende wijzigingen aangebracht:

pm.max_children = 40
pm.start_servers = 15
pm.min_spare_servers = 15
pm.max_spare_servers = 25
pm.max_requests = 500

Herstart de php-fpm82 service en kijk of de server zich correct gedraagt en geheugen toewijst zoals geconfigureerd.

Bonus: door het specificeren van pm.max_requests vertel je PHP om zijn proces te "recyclen" na X aantal verzoeken (in ons geval 500).
Dit betekent dat zodra het proces de 500 aanvragen heeft overschreden, het opnieuw wordt aangemaakt. Dit kan handig zijn om geheugenlekken in bibliotheken van derden te omzeilen.
Of, zoals uitgelegd in de officiële PHP documentatie: Het aantal verzoeken dat elk child process mag uitvoeren voordat het opnieuw gestart wordt.

Heeft u hulp nodig met PHP-FPM optimalisatie of performante hosting?

Het configureren van het juiste aantal Child processen voor PHP-FPM is cruciaal om ervoor te zorgen dat uw server efficiënt draait zonder prestatieproblemen. Of u nu last heeft van trage responstijden, hoog resource gebruik of frequente foutenmeldingen, een goede afstelling kan een significant verschil maken.

Bij Kinamo zijn we gespecialiseerd in het optimaliseren van hosting omgevingen voor topprestaties en stabiliteit. Neem contact met ons op als u deskundig advies nodig heeft over PHP-FPM configuratie, managed hosting of server optimalisatie.


Gerelateerde artikels

Een SSL certificaat kopen? Wat is een SSL certificaat?

Ontdek wat een SSL-certificaat is, waarom het essentieel is voor de beveiliging van een site en hoe eenvoudig een SSL-certificaat...

Lees meer

Instellen van een automatische SPAM filter via Kinamo Webmail

Heeft u een email bij Kinamo? Ontdek hier hoe u via de Kinamo Webmail een speciale filter kan aanmaken SPAM...

Lees meer

Is mijn e-mail adres beschermd tegen ongewenste e-mail of spam?

Het e-mail verkeer bij Kinamo is beveiligd met strenge anti-spam controle. Als u dit artikel ziet, bent u waarschijnlijk helaas...

Lees meer

Extra hulp nodig?

Werden niet al uw vragen beantwoord?
Geen nood, via een support aanvraag helpen wij u graag verder!

Kinamo

Selecteer uw taal

Alle talen: