8 branduolių 24 GB VPS baigiasi atmintis? Ekstremalus PHP-FPM procesų telkinio derinimas HestiaCP

Vienu metu serverio apdorojamų vartotojų skaičius priklauso ne nuo to, kiek branduolių jis turi, o nuo to, kiek atminties sunaudoja kiekvienas procesas.

Šis teiginys gali skambėti kaip provokacija, tačiau tai yra realiausia ir skaudžiausia patirtis eksploatavimo ir priežiūros pramonėje.

Kodėl atmintis yra pagrindinė kliūtis?

Daugelis žmonių, matydami VPS su 8 branduolių procesoriumi ir 24 GB atminties, pasąmoningai mano, kad jie gali lengvai vykdyti šimtus PHP-FPM procesų.

Tačiau iš tikrųjų vieno PHP proceso RSS atminties naudojimas dažnai siekia net 200 MB.

Tai rezultatas, gautas atlikus faktinį testavimą per komandinę eilutę:

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

Sudėtingoje „HestiaCP “ sistemoje ir kelių įskiepių aplinkoje, ypač be „OPcache“ optimizavimo, 200 MB yra norma.

Tai reiškia, kad atmintis, o ne CPU, yra griežta riba, lemianti maksimalų lygiagretumą.

8 branduolių 24 GB VPS baigiasi atmintis? Ekstremalus PHP-FPM procesų telkinio derinimas HestiaCP

Rekomenduojamas konfigūracijos failas (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

Parametrų skaičiavimo logika ir nustatymo pagrindas

Konfigūracijos parametraiNustatoma vertėŠerdies skaičiavimas ir sąrankos pagrindas
pmdynamicDinaminis režimas leidžia lanksčiai pridėti arba ištrinti procesus pagal lygiagretumo reikalavimus, subalansuojant atsako greitį ir atminties panaudojimą.
pm.max_vaikai8024 GB bendros atminties, atėmus sistemos branduolį ir MySQL/RedisPo „Nginx“ PHP lieka maždaug 16 GB.16,384 MB / 200 MB ≈ 81.9Nustačius reikšmę 80, galima visiškai pašalinti atminties trūkumą (OOM) didelio lygiagretumo metu.
pm.start_servers16Paleidimo metu išankstinis pašildymas nustatomas dvigubai daugiau nei procesoriaus branduolių (8 branduoliai × 2 = 16), siekiant užtikrinti, kad paslauga galėtų iš karto apdoroti pagrindinį lygiagretumą po paleidimo iš naujo.
pm.min_atsarginiai_serveriai8Nustatykite procesoriaus branduolių skaičių į 8, kad užtikrintumėte, jog į naujas užklausas būtų galima atsakyti bet kuriuo metu esant mažam srautui.
pm.max_spare_servers24Nustatykite jį į 3 kartus didesnį nei procesoriaus branduolių skaičius (8 branduoliai × 3 = 24), kad išlaikytumėte vidutinį procesų skaičių po srauto sumažėjimo ir galėtumėte valdyti nedidelius svyravimus.
pm.max_requests500Jei vienas procesas pasiekia didelę 200 MB bazę, sumažinus užklausų skaičių iki 500 prieš sunaikinimą ir atkūrimą, galima greičiau pašalinti netiesioginius atminties nutekėjimus.
pm.process_idle_timeout10sViršijantis min_spare_servers Neveiki procesai automatiškai paleidžiami ir grąžinami į sistemos atmintį po 10 sekundžių, kai nėra užklausų.

Svarbiausi palaikomieji nustatymai ir optimizavimo pasiūlymai

1. Laiko apribojimo mechanizmas nuo pagirių

request_terminate_timeout = 60s Štai ir esmė.

Jis gali priverstinai nutraukti procesus, kurie užstrigo dėl duomenų bazės aklavietės arba trečiosios šalies API blokavimo.

Tuo tarpu „Nginx“ fastcgi_read_timeout Jis turi būti saugomas bent 60 sekundžių, kitaip klientas jį gaus anksčiau laiko. 504 Gateway Timeout.

2. Strategijos atminties kliūtims įveikti

Maksimalus 80 vienu metu vykstančių procesų skaičius reiškia, kad esant ekstremalioms lygiagrečioms sąlygoms sistema gali vienu metu apdoroti daugiausia 80 dinaminių HTTP užklausų.

Jei norite dar labiau padidinti pajėgumus, reikėtų sutelkti dėmesį į atminties naudojimo mažinimą kiekvienam procesui.

  • Įgalinti OPcache:在 php.ini Vidutinė konfigūracija opcache.enable=1opcache.memory_consumption=256Baitų kodų kaupimas talpykloje gali sumažinti vieno proceso atminties naudojimą nuo 200 MB iki 60–100 MB.
  • Protinga atminties limito kontrolė:将 php.ini viduryje memory_limit Apribota iki 128M Arba 256MSiekiant išvengti atskirų nenormalių scenarijųneribotasTai sunaudoja daug atminties.

Kai vieno proceso atminties naudojimas sumažėja iki 100 MB...pm.max_children Jį galima saugiai atnaujinti iki 150 Be to, lygiagretumo galimybė beveik padvigubėjo.

Cituoti autoritetingi požiūriai

Remiantis oficialioje „Nginx“ dokumentacijoje pateiktomis rekomendacijomis :

„FastCGI“ programas visada reikėtų stebėti naudojant skirtojo laiko direktyvas, kad būtų išvengta išteklių išeikvojimo.“
(Šaltinis: „Nginx“ dokumentai)

Oficialiame PHP vadove aiškiai parašyta:

„pm.max_children“ apibrėžia maksimalų sukurtų antrinių procesų skaičių. Tai svarbiausia direktyva.“
(Šaltinis: PHP-FPM dokumentacija)

Šios autoritetingos nuomonės puikiai atitinka mūsų praktiką, įrodydamos, kad optimizavimo logika grindžiama ne tik patirtimi, bet ir standartizuota geriausia praktika.

Išvada: mano požiūris ir pagrindinės citatos

Didelio lygiagretumo scenarijuose CPU yra variklis, atmintis – degalų bakas, o PHP-FPM – parko dispečeris.

Kad ir koks galingas variklis būtų, jei degalų bakas nėra pakankamai didelis, vilkstinė toli nenuvažiuos.

Tikri ekspertai aklai nemaksimalizuoja parametrų, o tiksliai apskaičiuoja kiekvieno proceso atminties naudojimą, kad išvengtų ir švaistymo, ir perpildymo.

Optimizavimo esmė – rasti optimalų balansą su ribotais ištekliais.

Tai ne tik technologija, bet ir filosofija.

Todėl nustokite tikėti, kad „branduolių skaičius lemia viską“. Kas iš tikrųjų lemia lygiagretumo ribą, yra jūsų atminties kontrolė.

Imkitės veiksmų ir optimizuokite savo VPS iki galo, išnaudodami kiekvieną atminties lašą.

发表 评论

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

Pereikite į viršų