8-jezgrenom 24GB VPS-u ponestaje memorije? Ekstremno podešavanje PHP-FPM procesnog skupa u HestiaCP-u

Broj istovremenih korisnika koje server može obraditi ne zavisi od broja jezgara, već od toga koliko memorije svaki proces troši.

Ova izjava možda zvuči kao provokacija, ali to je najstvarnije i najbolnije iskustvo u industriji operacija i održavanja.

Zašto je memorija ključno usko grlo?

Mnogi ljudi vide VPS sa 8-jezgrenim CPU-om i 24 GB memorije i podsvjesno misle da mogu lako pokrenuti stotine PHP-FPM procesa.

Međutim, u stvarnosti, korištenje RSS memorije jednog PHP procesa često iznosi i do 200 MB.

Ovo je rezultat dobijen stvarnim testiranjem putem komandne linije:

ps --no-headers -o rss -p $(pgrep php-fpm) | awk '{sum+=$1} END {print sum/NR/1024 " MB"}'

U HestiaCP -ovom složenom okviru i okruženju s više dodataka, posebno bez OPcache optimizacije, 200 MB je norma.

To znači da je memorija, a ne CPU, fiksno ograničenje koje određuje maksimalnu konkurentnost.

8-jezgrenom 24GB VPS-u ponestaje memorije? Ekstremno podešavanje PHP-FPM procesnog skupa u HestiaCP-u

Preporučena konfiguracijska datoteka (php-fpm.conf)

pm = dynamic
pm.max_children = 80
pm.start_servers = 16
pm.min_spare_servers = 8
pm.max_spare_servers = 24
pm.max_requests = 500
pm.process_idle_timeout = 10s
request_terminate_timeout = 60s

Logika izračunavanja parametara i osnova podešavanja

Parametri konfiguracijeVrijednost podešavanjaOsnova za izračun i podešavanje jezgra
pmdynamicDinamički način rada omogućava elastično dodavanje ili brisanje procesa na osnovu zahtjeva za konkurentnost, balansirajući brzinu odziva i iskorištenost memorije.
pm.max_children8024 GB ukupne memorije bez sistemskog kernela i MySQL/RedisNakon Nginx-a, za PHP ostaje otprilike 16 GB.16,384 MB / 200 MB ≈ 81.9Postavljanje na 80 može potpuno eliminirati OOM (Out of Memory - nedostatak memorije) tokom visoke konkurentnosti.
pm.start_servers16Predgrijavanje pri pokretanju postavljeno je na dvostruki broj CPU jezgara (8 jezgara × 2 = 16) kako bi se osiguralo da servis može odmah obraditi osnovnu konkurentnost nakon ponovnog pokretanja.
pm.min_rezervni_serveri8Postavite broj jezgara CPU-a na 8 jezgara kako biste osigurali da se na nove zahtjeve može odgovoriti u bilo kojem trenutku tokom perioda niskog prometa.
pm.max_spare_servers24Postavite ga na 3 puta veći broj CPU jezgara (8 jezgara × 3 = 24) kako biste zadržali umjeren broj procesa nakon što se promet smanji, te kako biste se nosili s blagim fluktuacijama.
pm.max_requests500Ako jedan proces dostigne veliku bazu od 200 MB, smanjenje broja zahtjeva na 500 prije uništavanja i ponovne izgradnje može brže očistiti implicitna curenja memorije.
pm.process_idle_timeout10s超出 min_spare_servers Neaktivni procesi se automatski oslobađaju i vraćaju u sistemsku memoriju nakon 10 sekundi bez zahtjeva.

Osnovne prateće postavke i prijedlozi za optimizaciju

1. Mehanizam protiv mamurluka s vremenskim ograničenjem

request_terminate_timeout = 60s To je ključ.

Može prisilno prekinuti procese koji su zaglavljeni zbog zastoja u bazi podataka ili blokiranja API-ja treće strane.

U međuvremenu, Nginx-ov fastcgi_read_timeout Mora se čuvati najmanje 60 sekundi, u suprotnom će ga klijent primiti prijevremeno. 504 Gateway Timeout.

2. Strategije za prevazilaženje uskih grla memorije

Maksimalno 80 istovremenih procesa znači da pod ekstremnim uslovima konkurentnosti, sistem može istovremeno obraditi maksimalno 80 dinamičkih HTTP zahtjeva.

Ako želite dodatno poboljšati kapacitet, fokus bi trebao biti na smanjenju korištenja memorije po procesu.

  • Omogućite OPcache:在 php.ini Srednja konfiguracija opcache.enable=1 i opcache.memory_consumption=256Keširanje bajtkoda može smanjiti korištenje memorije jednog procesa sa 200 MB na 60~100 MB.
  • Razumna kontrola memorijskog limita:将 php.ini srednji memory_limit Ograničeno na 128M256MDa biste spriječili pojedinačne abnormalne skripteneograničenoTroši mnogo memorije.

Kada potrošnja memorije jednog procesa padne na 100 MB...pm.max_children Može se bezbedno nadograditi na 150 Osim toga, mogućnost konkurentnosti se gotovo udvostručila.

Citirana autoritativna gledišta

Prema preporukama u službenoj Nginx dokumentaciji :

"FastCGI aplikacije treba uvijek pratiti pomoću direktiva o vremenskom ograničenju kako bi se spriječilo iscrpljivanje resursa."
(Izvor: Nginx dokumentacija)

Zvanični PHP priručnik jasno navodi:

"pm.max_children definira maksimalan broj podređenih procesa koji će biti kreirani. Ovo je najvažnija direktiva."
(Izvor: PHP-FPM dokumentacija)

Ovi autoritativni stavovi su savršeno usklađeni s našim praksama, dokazujući da logika optimizacije nije zasnovana samo na iskustvu, već i na standardiziranim najboljim praksama.

Zaključak: Moji stavovi i ključni citati

U scenarijima s visokom konkurentnošću, CPU je motor, memorija je rezervoar za gorivo, a PHP-FPM je dispečer voznog parka.

Bez obzira koliko je motor snažan, ako rezervoar za gorivo nije dovoljno velik, konvoj neće stići daleko.

Pravi stručnjaci ne maksimiziraju slijepo parametre, već precizno izračunavaju korištenje memorije svakog procesa kako bi izbjegli i rasipanje i prelijevanje.

Suština optimizacije je pronaći optimalnu ravnotežu s ograničenim resursima.

Ovo nije samo tehnologija, već i filozofija.

Stoga, prestanite vjerovati da "broj jezgara određuje sve". Ono što zaista određuje ograničenje konkurentnosti je vaša kontrola nad memorijom.

Preduzmite akciju i optimizirajte svoj VPS do njegovog punog potencijala, maksimalno iskoristivši svaku kap memorije.

Komentari

您的邮箱地址不会被公开。必填项已用*标注

Dođite na vrh