Tags voor dit FAQ item:
CentOS Debian Linux NGinx PHP

Help ons door dit artikel te beoordelen!

Score van 4 sterren, gebaseerd op 7 beoordelingen

Correct instellen van child processen voor PHP-FPM op NGinx

Laatste bijgewerkt: 19/01/2016

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

[26-Mar-2015 10:10:04] WARNING: [pool www] server reached pm.max_children setting (35), consider raising it
[26-Mar-2015 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 of vps beschikbaar heeft, rekening houdende met andere processen die ook in gebruik zijn (bvb. MySQL). Gebruik dus nooit 100% van het geheugen dat aan de machine is toegewezen als uitgangspunt!

Volgende waarden moet u gaan aanpassen in het /etc/php5/fpm/pool.d/www.conf bestand:

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 een 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 proces fluctueren!
Gebruik volgend commando (via SSH) om een realtime output te krijgen van de processen en hun geheugenverbruik:

ps -ylC php5-fpm --sort:rss

De naam php5-fpm komt overeen met de naam van het proces. Het is mogelijk dat dit op uw server php-fpm is.

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

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 php5-fpm
S    33 24701 24439  2  80   0 61588 63335 -      ?        00:04:07 php5-fpm
S    33 25319 24439  2  80   0 61620 63314 -      ?        00:02:35 php5-fpm

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

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

ps --no-headers -o "rss,cmd" -C php5-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 of vps 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 MySQL 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 php5-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 php5-fpm service en kijk na of de server op een correcte manier geheugen toewijst.