Hvordan forhindre at PHP-FPM bruker for mye RAM i Linux


Hvis du har distribuert en LEMP (Linux, NGINX, MySQL/MariaDB og PHP) stack, så bruker du sannsynligvis FastCGI-proxying innenfor NGINX (som en HTTP-server), for PHP-behandling. PHP-FPM (et akronym av FastCGI Process Manager) er en mye brukt og høyytelses alternativ PHP FastCGI-implementering.

Her er de nyttige veiledningene for å sette opp LEMP Stack i Linux.

  • Hvordan installere LEMP Stack med PhpMyAdmin i Ubuntu 20.04
  • Hvordan installere LEMP Server på CentOS 8
  • Hvordan installere LEMP på Debian 10 Server

Nylig ble alle våre PHP-nettsteder på en av våre LEMP-nettservere trege og sluttet til slutt å svare når de logget på serveren. vi oppdaget at systemet hadde lite RAM: PHP-FPM hadde forbrukt mesteparten av RAM-en, som angitt i følgende skjermbilde (blikk – systemovervåkingsverktøy).

glances

I denne artikkelen vil vi vise hvordan du forhindrer at PHP-FPM bruker for mye eller alt systemminnet ditt (RAM) i Linux. På slutten av denne veiledningen vil du lære hvordan du reduserer PHP-FPM-minneforbruket med 50 % eller mer.

Reduser PHP-FPM minnebruk

Etter å ha gjort litt undersøkelser på Internett, oppdaget vi at vi trengte å rekonfigurere PHP-FPM-prosessbehandleren og visse aspekter av den for å redusere PHP-FPMs minneforbruk i bassengkonfigurasjonsfilen.

Standardpoolen er www og konfigurasjonsfilen er plassert på /etc/php-fpm.d/www.conf (på CentOS/RHEL/Fedora) eller /etc/php/7.4/fpm/pool.d/www.conf (på Ubuntu/Debian/Mint).

sudo vim /etc/php-fpm.d/www.conf             [On CentOS/RHEL/Fedora]
sudo vim /etc/php/7.4/fpm/pool.d/www.conf    [On Ubuntu/Debian/Mint]

Finn følgende direktiver og still inn verdien for å passe til ditt bruksområde. For direktiver som er kommentert ut, må du fjerne kommentarer.

pm = ondemand
pm.max_children = 80
pm.process_idle_timeout = 10s
pm.max_requests = 200

La oss kort forklare direktivene ovenfor og deres verdier. pm-direktivet bestemmer hvordan prosesslederen skal kontrollere antall underordnede prosesser. Standardmetoden er dynamisk, noe som betyr at antall barn (underordnede prosesser) settes dynamisk avhengig av noen andre direktiver, inkludert pm.max_children som definerer det maksimale antallet barn som kan være i live samtidig.

Den mest ideelle prosesslederen er ondemand-ordningen der ingen underordnede prosesser opprettes ved oppstart, men blir skapt på forespørsel. Underordnede prosesser er kun forked når nye forespørsler kobles til basert på pm.max_children og pm.process_idle_timeout som definerer antall sekunder som en inaktiv prosess vil bli drept etter.

Sist, men ikke minst, må vi sette pm.max_requests-parameteren som definerer antall forespørsler hver underordnede prosess skal utføre før re-spawning. Merk at denne parameteren også kan brukes som en løsning for minnelekkasjer i tredjepartsbiblioteker.

Etter å ha gjort disse konfigurasjonene ovenfor, la jeg merke til at RAM-bruken nå er bra på serveren vår. Har du noen tanker å dele knyttet til dette emnet eller spørsmålene? Nå oss via tilbakemeldingsskjemaet nedenfor.