Imenik članaka
Broj istovremenih korisnika koje poslužitelj može obraditi ne ovisi o broju jezgri, već o tome 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 s 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 dobiven stvarnim testiranjem putem naredbenog retka:
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, fiksna granica koja određuje maksimalnu konkurentnost.

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čuna parametara i osnova podešavanja
| Konfiguracijski parametri | Vrijednost podešavanja | Osnova izračuna i postavljanja jezgre |
|---|---|---|
| pm | dynamic | Dinamički način rada omogućuje elastično dodavanje ili brisanje procesa na temelju zahtjeva za konkurentnost, balansirajući brzinu odziva i iskorištenost memorije. |
| pm.max_children | 80 | 24 GB ukupne memorije bez sistemske jezgre i MySQL/RedisNakon Nginxa, za PHP ostaje otprilike 16 GB.16,384 MB / 200 MB ≈ 81.9Postavljanje na 80 može potpuno eliminirati OOM (Out of Memory) tijekom visoke konkurentnosti. |
| pm.start_servers | 16 | Predgrijavanje pri pokretanju postavljeno je na dvostruki broj CPU jezgri (8 jezgri × 2 = 16) kako bi se osiguralo da usluga može odmah obraditi osnovnu konkurentnost nakon ponovnog pokretanja. |
| pm.min_rezervni_poslužitelji | 8 | Postavite broj jezgri CPU-a na 8 jezgri kako biste osigurali da se na nove zahtjeve može odgovoriti u bilo kojem trenutku tijekom razdoblja niskog prometa. |
| pm.max_spare_servers | 24 | Postavite ga na 3 puta veći broj jezgri CPU-a (8 jezgri × 3 = 24) kako biste zadržali umjeren broj procesa nakon što se promet smanji, te kako biste se nosili s blagim fluktuacijama. |
| pm.max_requests | 500 | Ako jedan proces dosegne 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_timeout | 10s | 超出 min_spare_servers Neaktivni procesi se automatski oslobađaju i vraćaju u sistemsku memoriju nakon 10 sekundi bez zahtjeva. |
Bitne 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, Nginxov fastcgi_read_timeout Mora se čuvati najmanje 60 sekundi, inače će ga klijent primiti prerano. 504 Gateway Timeout.
2. Strategije za prevladavanje uskih grla memorije
Maksimalno 80 istovremenih procesa znači da u ekstremnim uvjetima istodobnosti sustav 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ći OPcache: 在
php.iniSrednja konfiguracijaopcache.enable=1iopcache.memory_consumption=256Keširanje bajtkoda može smanjiti korištenje memorije jednog procesa s 200 MB na 60~100 MB. - Razumna kontrola memory_limita:将
php.inisrednjimemory_limitOgraničeno na128MIli256MKako bi se spriječili pojedinačni abnormalni skriptineograničenTroši puno memorije.
Nakon što korištenje memorije jednog procesa padne na 100 MB...pm.max_children Može se sigurno nadograditi na 150 Osim toga, mogućnost istodobnosti gotovo se udvostručila.
Navedeni autoritativni stavovi
Prema preporukama u službenoj Nginx dokumentaciji :
"FastCGI aplikacije treba uvijek pratiti direktivama timeout kako bi se spriječilo iscrpljivanje resursa."
(Izvor: Nginx dokumenti)
Službeni PHP priručnik jasno navodi:
"pm.max_children definira maksimalan broj podređenih procesa koji se mogu stvoriti. Ovo je najvažnija direktiva."
(Izvor: PHP-FPM dokumentacija)
Ovi autoritativni stavovi savršeno su usklađeni s našim praksama, dokazujući da logika optimizacije nije utemeljena 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 spremnik goriva, a PHP-FPM je dispečer voznog parka.
Bez obzira koliko je motor snažan, ako spremnik goriva nije dovoljno velik, konvoj neće daleko stići.
Pravi stručnjaci ne maksimiziraju slijepo parametre, već precizno izračunavaju korištenje memorije svakog procesa kako bi izbjegli i rasipanje i prelijevanje.
Bit optimizacije je pronaći optimalnu ravnotežu s ograničenim resursima.
Ovo nije samo tehnologija, već i filozofija.
Stoga, prestanite vjerovati da "broj jezgri određuje sve". Ono što zaista određuje ograničenje konkurentnosti je vaša kontrola nad memorijom.
Poduzmite akciju i optimizirajte svoj VPS do njegovog punog potencijala, maksimalno iskoristivši svaku kap memorije.
Nadam se da će vam članak "8-core 24GB VPS ostaje bez memorije? Ekstremno podešavanje PHP-FPM procesnog skupa pod HestiaCP" podijeljen na Chen Weiliangovom blogu ( https://www.chenweiliang.com/ ) biti koristan.
Slobodno podijelite poveznicu na ovaj članak: https://www.chenweiliang.com/cwl-34509.html
