Onafhankelijke vergelijking · geen betaalde rankings
Home / Blog / Technisch / PHP-FPM verzadigd: onderscheid gebrek aan werknemers en blokkerende code

PHP-FPM verzadigd: onderscheid gebrek aan werknemers en blokkerende code

PHP-FPM-wachtrij vol? Voordat u pm.max_children verhoogt, controleert u of uw werknemers slapen op een externe API-aanroep of een SQL-query van 30 seconden.

Redactie Hébergeurs.eu 1 min Bijgewerkt 19 jul. 2026

Nginx geeft 'upstream time-out tijdens het lezen van de responsheader van upstream' weer. PHP-FPM geeft luisterwachtrij len 32 aan. Onmiddellijke reflex: verander pm.max_children van 50 naar 150. Het verkeer wordt geabsorbeerd - RAM stijgt naar 98%, de OOM-killer raakt MySQL. Oorzaak nooit aangepakt: een synchrone betalingswebhook van 25 seconden per bestelling.

Verzadigde PHP-FPM presenteert twee ziekten met vergelijkbare symptomen: feitelijk niet genoeg werkers voor een korte CPU-belasting, of werkers geblokkeerd op netwerk-I/O, trage SQL-query, bestandsvergrendeling. Het verwarren van deze twee kost veel RAM - en verbergt het echte knelpunt wekenlang.

Als de slowlog overal dezelfde oproeptracering weergeeft, is het geen FPM-probleem; het is die oproeptrace.

De gouden regel: vierentwintig uur slowlog, daarna pm-instelling – nooit andersom. Het verhogen van max_children zonder het kritieke pad te verkorten betekent het inhuren van kassiers terwijl elke klant nog steeds betaalt met onaangekondigde cheques.

Lees de php-fpm-status en slowlog

Schakel eerst zichtbaarheid in:


pm.status_path = /fpm-status

ping.pad = /fpm-ping

request_slowlog_timeout = 5s

slowlog = /var/log/php-fpm/slow.log

Bescherm /fpm-status achter nginx - maak het niet publiekelijk openbaar. Verzadigingssignalen:

  • actieve processen ≈ max permanent;
  • luisterwachtrij > 0;
  • server heeft pm.max_children-logboeken bereikt.

RAM-formule: (max_children × geheugen per kind) + OS + MySQL <totaal RAM — marge minimaal 20%.

Diagnose A versus B: onvoldoende werknemers of blokkeercode

A — onvoldoende werkers: verzoeken van minder dan 200 ms, hoge PHP-processor, lege slowlog of gediversifieerde sporen → verhoog pm.max_children in stappen van tien, waarbij RAM wordt gecontroleerd.

B — code blokkeren: actieve werkers, lage processor, slowlog geconcentreerd op dezelfde regel (curl, PDO, file_get_contents) → in asynchrone wachtrij plaatsen, curl time-out drie tot vijf seconden, correctie van de SQL-index — zie missing MySQL index en PHP profiling.

Breng fastcgi_read_timeout nginx in lijn met de realiteit van de applicatie - een nginx-time-out korter dan de webhook verbergt het probleem in 504 zonder slowlog. Bij gedeeld is een door de host opgelegde proceslimiet een signaal van een VPS-upgrade in plaats van een oneindige afstemming.

Voor N+1 queries, zie MySQL dynamic site — een query-lus kan alle werkers zonder hoge CPU blokkeren.

Tuning pm: dynamisch, on-demand, statisch

ModeWanneer moet u het gebruikenRisico
dynamischVariabel verkeer, gecontroleerd RAMOnverwachte pieken als max_children te laag is
op aanvraagSporadisch verkeer, beperkt RAMLatentie bij koude start
statischPlatte belasting, voorspelbaar RAMAfval als er weinig verkeer is

Begin met pm = dynamic met pm.max_children berekend op basis van de RAM-formule. Test 'ondemand' alleen als de latentie bij koude start acceptabel is voor uw publiek.

De top: geen werknemers meer met blokkeercode

Vergelijk VPS waarbij je PHP-FPM beheert via de overzicht. Op een gedeeld platform valt niet te onderhandelen over het procesplafond: de diagnose blijft hetzelfde, maar de oplossing omvat upgrades of code-optimalisatie.

Beslis en ga vooruit zonder blinde vlek

Voordat u max_children verhoogt:

  1. Activeer status en slowlog — zonder zichtbaarheid stem je blindelings af.
  2. Classificeer de verzadiging: hoge processor (A) of drukke werknemers, lage processor (B).
  3. Corrigeer de code of SQL als de slowlog geconcentreerd is – geen pm-afstemming vóór correctie.
  4. Pas pm.max_children aan in stappen van tien met gedocumenteerd RAM-budget.
  5. Lijn fastcgi_read_timeout nginx en applicatietime-outs uit (curl, PDO).
  6. Laadtest hetzelfde eindpunt na het patchen: de wachtrij moet bij normale belasting op nul blijven staan.

Veelgestelde vragen

Hoe weet ik of PHP-FPM verzadigd is?

luisterwachtrij groter dan nul, max_children-logboeken bereikt, 502/504 nginx-fouten, latentie lineair met verkeer. Schakel pm.status_path in om te observeren vóór de fout, en niet pas erna.

Is het verhogen van max_children voldoende?

Tijdelijk voor diagnose A. Bereken het beschikbare RAM; als de slowlog geconcentreerd is, repareer dan eerst de code; het verdubbelen van werknemers met blokkerende code veroorzaakt een OOM-kill.

Hoe blokkeercode identificeren?

slowlog PHP-FPM en profileringstool. Symptoom: alle werknemers zijn bezig, CPU laag. Overal hetzelfde spoor = geïdentificeerd knelpunt – geen gebrek aan werknemers.

on-demand versus dynamisch?

dynamisch of on-demand voor variabel verkeer; statisch voor vlakke belasting. ondemand bespaart RAM, maar voegt opstartlatentie toe - test in pre-productie.


Verzadigde PHP-FPM duidt op een gebrek aan kassa's of vaste kassamedewerkers. Het verwarren van de twee kost veel RAM.

Vergelijk Europese providers

Filter op compliance, locatie en gebruikssituatie — open daarna de fiches om het echte bereik te controleren.

Blader door het overzicht
Blog

Gerelateerde lectuur

Alle artikelen →