Tags voor dit FAQ item:
CentOS Debian Linux NGinx PHP

Help ons door dit artikel te beoordelen!

Score van 4 sterren, gebaseerd op 8 beoordelingen

Correct instellen van child processen voor PHP-FPM op NGinx

Laatste bijgewerkt: 07/06/2018

Wie gebruik maakt van een NGinx webserver met PHP-FPM moet mogelijk een paar aanpassingen maken aan de standaard instellingen van php-fpm. Indien in het php-fpm.log bestand volgende fout voorkomt:

[26-Mar-2018 10:10:04] WARNING: [pool www] server reached pm.max_children setting (35), consider raising it
[26-Mar-2018 12:04:52] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers)

Wil dit zeggen dat er niet voldoende processen beschikbaar zijn voor php-fpm.

U kan uitrekenen aan de hand van realtime logging gegevens wat de correcte instellingen zijn voor de php-fpm configuratie op uw server. De precieze instellingen hangen af van het geheugen dat uw cloud server ter beschikking heeft. Hou hierbij ook rekening met de andere processen die ook in gebruik zijn (bvb. MariaDB, MySQL, Redis). Gebruik dus nooit 100% van het geheugen dat aan de machine is toegewezen als uitgangspunt!

Volgende waarden moet u gaan aanpassen in het /etc/php/fpm/pool.d/www.conf bestand (het pad kan verschillen afhankelijk van de PHP versie die u gebruikt):

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

Om de correcte waarden te berekenen moet u nagaan hoeveel geheugen één proces in neemt. Let op want dit kan u enkel meten op een server waarvan u weet dat de site in kwestie een stabiel geheugenverbruik heeft per proces, met andere woorden voor een shared hosting omgeving met verschillende websites en dus verschillende programmatie zal het geheugenverbruik per PHP process sterk fluctueren!
Gebruik volgend commando (via SSH) om een realtime output te krijgen van de processen en hun geheugenverbruik:

ps -ylC php-fpm --sort:rss

De naam php-fpm komt overeen met de naam van het proces. Het is mogelijk dat de exacte naam van eht proces verschilt op basis van de PHP versie op uw server.

In de kolom RSS ziet u het gemiddelde geheugenverbruik in kilobytes per process. 

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

In ons geval is dit 61588 kilobytes of dus omgerekend +- 60 Mb per proces.

Een andere optie is om gemiddeld voor één php-fpm process de grootte op te vragen:

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

Om de correcte waarde voor het aantal pm.max_children te berekenen moeten we kijken hoeveel geheugen de cloud server ter beschikking kan hebben voor het php-fpm proces en dat delen door de gemiddelde grootte in Mb van ons net opgevraagde proces.

Een voorbeeld, als onze cloud server beschikt over 4 GB RAM en er draait een MariaDB database op waarvan zeker 1 GB in gebruik zal zijn door het MySQL proces dan nemen we best als uitgangspunt 4 - 1 - 0,5 (marge) GB = 2,5 GB RAM of 2560 Mb.

pm.max_children brengt ons dan op 2560 Mb / 60 Mb = 42 max_children

We hebben volgende aanpassingen ingebracht in ons www.conf bestand in de php-fpm pool:

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-fpm service en kijk na of de server op een correcte manier geheugen toewijst.