Správa o vlastnostiach človeka php pm. Berte PHP vážne. Pomocou pm = static získate najlepší výkon zo svojho servera

  • 20.06.2020

Po prehrabaní mojich návrhov som našiel celkom zaujímavú tému – nastavenie správcu procesov pre php-fpm a nginx, aby fungovali. Pokúsim sa poskytnúť k tejto téme čo najviac informácií. Na názorných príkladoch vám poviem, čo je lepšie a ako sa berú do úvahy niektoré dôležité parametre v php-fpm.

Čo je teda „správca procesov“ v php-fpm? Správca procesov v php-fpm je správca procesov pre PHP-FPM, ktorý vytvára a používa procesy PHP, aby z vášho servera vyťažil maximum.

Odrody správcu procesov v php-fpm:

  • dynamický - Má dynamické číslo pm.max_children (podriadené procesy). Čo sa mení a nastavuje na základe: pm.max_children, pm.start_servers, pm.min_spare_servers, pm.max_spare_servers.
  • static - Má pevný počet pm.max_children (podriadených procesov).
  • ondemand - Detské procesy sa nespúšťajú od začiatku. Počet procesov vytvorených na požiadanie (ako sa objavujú požiadavky, na rozdiel od PM dynamic, keď sa spustí zadaný počet procesov, rovný pm.start_servers, keď sa služba spustí.

Toto sú 3 hlavní správcovia procesov pre php-fpm.

Nastavenie správcu procesov ako dynamického pre php-fpm v systéme Unix/Linux

Štandardný procesný manažér a je dobré, že má niekoľko PHP-FPM majstrov.

A tak upravíme náš bazén a nastavíme:

Pm = dynamický

A tak teraz môžete určiť maximálny počet procesov. Existuje na to vzorec:

Celkový maximálny počet procesov = (celkový počet RAM - (použitý RAM + vyrovnávacia pamäť)) / (pamäť na proces php)

Predpokladajme, že server má 6 GB RAM, ale môžete to vidieť pomocou nasledujúceho nástroja:

# cat /proc/meminfo | grep -E "MemTotal" MemTotal: 6291456 kB

Pomocou nasledujúceho príkazu skontrolujte, koľko pamäte používa PHP-FPM:

# ps -aylC "php-fpm" | grep -Ev "grep" | triediť -n | awk "(sum+=$8; ++n) KONIEC (tlač "Tot="súčet"("n")";tlač "Avg="súčet"/"n"="súčet/n/1024"MB")" Celkom=3126148(46) Priemer=3126148/46=66,3669 MB

Ak chcete zobraziť zoznam všetkých procesov php-fpm, použite:

# ps --no-headers -o "rss,cmd" -C php-fpm | triediť -n | awk "(tlač $ 1/1024 "Mb")"

Najtučnejší proces:

# ps --no-headers -o "rss,cmd" -C php-fpm | triediť -n | awk "(tlač $1/1024,"Mb")" | chvost-n1

Inač:

Na 1. karte spustite:

# zatiaľ čo pravda; do curl https://site &> /dev/null; spánok1; hotový

Na 2. karte spustíme kontrolu:

# ps aux | grep -E "php-fpm"| grep -Ev "grep" | awk "(tlač 6/1024 $, "Mb")"

Opäť som ukázal zoznam všetkých procesov. Ako urobiť správnu vec a vziať priemernú hodnotu alebo maximálne, je len na vás. Všetko treba otestovať! Množstvo pamäte využívanej procesmi je možné skontrolovať pomocou pomôcky ps_mem:

Potom je možné vypočítať maximálny počet procesov (rozhodol som sa dať všetku RAM na použitie PHP):

(1024*6) / 66 = 93.0909

Vidíme, že pre php-fpm môžete použiť maximálne 93 serverov:

Pm = dynamické pm.max_children = 93 pm.start_servers = 30 pm.min_spare_servers = 30 pm.max_spare_servers = 45 pm.process_idle_timeout = 10s;

Hlavné parametre:

  • pm = dynamický - Ako už bolo spomenuté, ide o manažéra procesov. pm = dynamický
  • pm.max_children - Nastavuje maximálny počet podriadených procesov (podradených procesov), ktoré vytvára PM. pm.max_children= (celková virtuálna pamäť)/(pamäť pridelená 1 procesu php) = 93
  • pm.start_servers - Nastavuje počet podriadených procesov, ktoré PM vytvorí pri spustení PHP-FMP. pm.start_servers = ~(pm.max_children/3) = 31
  • pm.min_spare_servers - Nastavuje počet procesov, ktoré majú zostať nečinné ako "náhradné", čakajúce na vykonanie úloh, ak je ich počet menší, vytvoria sa nové; pm.min_spare_servers = (nastavené na 1 jadro) ALEBO ~(pm.max_children/3) = 31
  • pm.max_spare_servers - naopak, maximálny počet procesov, ktoré by mali zostať nečinné, ak je počet väčší, niektoré deti budú zničené: pm.max_spare_servers = (celkový počet jadier) ALEBO ~(pm.max_children/2) = 45
  • pm.max_requests - počet požiadaviek na proces, po ktorých bude proces znovu vytvorený, užitočné na zabránenie úniku pamäte (memory-leak); pm.max_requests = 100 000
  • pm.process_idle_timeout - čas v sekundách, po ktorom bude nečinný proces vymazaný. pm.process_idle_timeout = 10 s

Upozorňujem, že som nebral do úvahy (Použitý Ram + Buffer). To by bolo potrebné, ak by server mal databázy:

# cat /proc/meminfo | grep -E "(MemTotal|MemFree|Cached)" MemTotal: 6291456 kB MemFree: 1678704 kB Vo vyrovnávacej pamäti: 2205940 kB

Pomocou nasledujúceho príkazu môžete skontrolovať využitie vyrovnávacej pamäte a pamäte:

# voľných -m celkom použitých voľných zdieľaných buffov/vyrovnávacej pamäte k dispozícii Mem: 6144 1521 1622 641 3000 3716 Výmena: 0 0 0

Celkový maximálny počet procesov = (6 144 - (1 521 + 3 000)) / 66 = 24

Reštartujte službu php-fpm:

# reštart služby php-fpm

Teraz použijeme htop/top a ab na kontrolu toho, čo funguje a ako to funguje.

Spustite záťažový test:

Ab -n 10000 -c 500 http://localhost/index.php

# cd /usr/local/src && wget https://website/wp-content/uploads/scripts/php-fpm/php-fpmpal.sh -q -O - | bash

Dáva dobrú radu:

() (((*)\) (/()\))\))\) (((()/()\())(()/(()/((()/() \))())\ /(_))((_)\ /(_)) /(_)) /(_))((_)()\ `) (/(((_) (_) )) _((_)(_)) (_))_|(_)) (_()((_) /(/()(_)) _ | _ \ | || || _ \ ___ | |_ | _ \ | \/ |((_)_\ ((_)_ | | | _/ | __ || _/|___|| __| | _/ | |\/| || "_ \)/ _` || | |_| |_||_||_| |_| |_| |_| |_|| .__/ \__,_||_| ====== ==================================== |_| ============= = = AH00558: httpd: Nepodarilo sa spoľahlivo určiť úplný názov domény servera pomocou 31.187.70.238. Globálne nastavte direktívu „Názov_servera“ na potlačenie tejto správy AH00558: httpd: Nepodarilo sa spoľahlivo určiť úplne kvalifikovanú doménu servera name , pomocou 31.187.70.238 Globálne nastavte direktívu "ServerName" na potlačenie tejto správy ===== Zoznam PHP-FPM poolov ===== --- nagios --- Konfiguračný súbor: /etc/php-fpm. d/nagios.conf Zoznam procesov: 53028 53029 53030 53031 53032 Počet procesov: 5 Aktuálna hodnota max_children: 50 Celkové využitie pamäte pre oblasť v KB: 54440 Priemerné využitie pamäte na proces v KB: 10888 Celkové potenciálne využitie pamäte pre oblasť (na základe priemerného procesu) (KB): 544400 Najväčší proces v tejto oblasti je (KB): 10888 Celkové potenciálne využitie pamäte pre oblasť (na základe najväčšieho procesu) (KB): 544400 --- www --- Configuration file: /etc/php-fpm.d/www.conf List of processes: 53033 53034 53035 53036 53037 53038 53039 53040 53041 53042 53043 53044 53045 53046 53047 53048 53049 53050 53051 53052 53053 53054 53055 53056 53057 53058 53059 53060 53061 53062 53083 53119 53434 53491 61608 73379 Počet procesov: 36 Aktuálna hodnota max_children: 50 Celkové využitie pamäte pre oblasť v KB: 2295440 Priemerné využitie pamäte na proces pri priemernom využití procesu v 7 KB: Celková potenciálna pamäť na základe 63 ): 3188100 Najväčší proces v tejto oblasti je (KB): 67792 Celkové potenciálne využitie pamäte pre oblasť (na základe najväčšieho procesu) (KB): 3389600 ===== Štatistika využitia pamäte servera ===== Celková pamäť servera v KB : 6291456 =Celkové využitie pamäte Apache v KB: 0 =Celkové využitie pamäte nginx v KB: 55868 =Celkové využitie pamäte Varnish v KB: 0 0 =Celkové využitie pamäte MySQL v KB: 201324,8 =Celkové využitie pamäte PHP-FPM v KB: 2349880 Dostupná pamäť na priradenie k fondom PHP-FPM v KB: 6099670 (celková voľná pamäť + PHP- Súčasné využitie pamäte FPM) Celkové potenciálne využitie pamäte PHP-FPM na základe najväčších procesov (KB): 3934000 (64,49 %)...DOBRE 🙂 Celkové potenciálne využitie pamäte PHP-FPM na základe priemernej veľkosti procesu (KB): 3732500 ( 61,19%) ...DOBRE 🙂 ===== Odporúčania na fond ===== -- nagios -- momentálne využíva 54440 kB pamäte (2. 31 % všetkého využitia pamäte PHP-FPM). Malo by byť povolené používať približne 140 902 KB všetkej dostupnej pamäte. Jeho priemerná veľkosť procesu je 10888 kB, takže to znamená, že max_children by malo byť nastavené na ~12. Momentálne je nastavený na 50 (toto je možné zmeniť v /etc/php-fpm.d/nagios.conf). -- www -- v súčasnosti využíva 2295440 KB pamäte (97,68 % všetkého využitia pamäte PHP-FPM). Malo by byť povolené používať približne 5958157 KB všetkej dostupnej pamäte. Jeho priemerná veľkosť procesu je 63762 KB, takže to znamená, že max_children by malo byť nastavené na ~93. Momentálne je nastavený na 50 (toto je možné zmeniť v /etc/php-fpm.d/www.conf). ===== Ďalšie úvahy, ktoré treba vziať do úvahy ===== Zo súborov denníka chýb PHP-FPM (/var/log/php-fpm/error.log): - bazén www dosiahol svoju hodnotu max_children 50 dňa 2. príležitosti Pre tieto oblasti možno budete chcieť porovnať odporúčanú hodnotu max_children s týmito informáciami a rozhodnúť sa, či by odporúčaná hodnota bola dostatočne vysoká na to, aby zabránila zasiahnutiu max_children v budúcnosti. Poznámka: Nie je ideálne spúšťať PHP-FPMpal krátko po reštarte PHP-FPM alebo vašich webových služieb. Je to preto, že PHP-FPMpal vydáva odporúčania na základe priemernej veľkosti procesu poolu a ak bol PHP-FPM pred chvíľou reštartovaný, potom je vysoká pravdepodobnosť, že od reštartu nebude na stránky odoslaných veľa požiadaviek a metriky budú skreslené a nebudú zobrazovať normalizovaný priemer. Za zmienku tiež stojí, že ak ste nedávno reštartovali akékoľvek služby, ktoré bežne zaberajú veľké množstvo pamäte, pravdepodobne budete chcieť chvíľu počkať, kým spustíte PHP-FPMpal (napr. MySQL bežne využíva 50 % pamäte, ale práve ste ju reštartovali, potom môže práve teraz využívať iba 10 % pamäte, takže odporúčania budú veľmi skreslené). ============== ===============================================

Nastavenie správcu procesov ako statického pre php-fpm v systéme Unix/Linux

Správca statických procesov sa takmer nepoužíva, pretože existuje 1 PHP-FPM master.

Otvorte svoj bazén z php-fpm a zmeňte parametre:

Pm = statické pm.max_children = 5

Reštartujte službu php-fpm:

$ sudo service php5-fpm reštart

# reštart služby php-fpm

PS: Použite príkaz v závislosti od typu OS.

Spustite záťažový test:

# ab -n 1000 -c 10 http://localhost/index.php # ab -n 5000 -c 20 http://localhost/index.php

Viac o utilite „ab“ sa dozviete v článku:

Otvorte konfiguračný súbor pre fond php-fpm. Dá sa nájsť hľadaním (ak niekto nevie, kde leží).

Odkomentujte riadok s možnosťou „pm.max_requests“:

Pm.max_requests = 500

Znova reštartujte php-fpm a skontrolujte zaťaženie:

# ab -n 5000 -c 20 http://localhost/index.php

Môžete vidieť, že niektoré procesy - zomreli, a potom boli niektoré procesy zabité a potom boli znovu splodené!

Nastavenie správcu procesov ako dopytu pre php-fpm v systéme Unix/Linux

Najpokročilejší (podľa mňa) manažér procesov. Už z názvu je zrejmé, že procesy neopúšťa, ale vytvára ich podľa potreby.

Príklad bazénu vyzerá takto:

User=www-data group=www-data listen=/var/run/php5-fpm/linux-notes.og/sock listen.owner=www-data listen.group=www-data listen.mode=770 chdir=/ srv/www/wp-content/linux-notes.og/ pm=ondemand pm.max_children=5 pm.max_requests=500

Hlavné parametre:

  • pm = ondemand - Ako už bolo spomenuté, ide o manažéra procesov. pm = na požiadanie
  • pm.max_children - Nastavte maximálny počet podriadených procesov. pm.max_children= (celková virtuálna pamäť)/(pamäť pridelená 1 procesu php) = 93
  • pm.process_idle_timeout - Nastavte čas v sekundách, po ktorom bude nečinný proces vymazaný. pm.process_idle_timeout = 10 s
  • pm.max_requests - Nastavte počet spracovaných požiadaviek, po ktorých sa reštartujú procesy php-fpm. pm.max_requests = 100 000

Ak potrebujete väčší výkon, potom vám nebude vyhovovať správca procesov – „OnDemand“. V 90 % prípadov je však konfigurácia PHP-FPM v režime OnDemand lepšia ako statická alebo dynamická.

P HP-FPM má predvolenú konfiguráciu, ktorá využíva viac pamäte, ako je potrebné. Má pripravené na spustenie záložné procesy PHP-FPM, ktoré zaberajú pamäť v prípade, že sa spracováva PHP kód. Aj keď to nie je problém, ak máte veľa pamäte RAM, môže to byť problém s nízkou VPS RAM a ak používate agresívne ukladanie stránok do vyrovnávacej pamäte, potom sa táto pamäť využíva zbytočne, čo by sa mohlo použiť na (MySQL) alebo iné dôležité procesy. Táto príručka vysvetľuje, ako nakonfigurovať PHP-FPM bežiace na PHP 7.0, aby využívalo čo najmenej RAM.

Vyladenie PHP-FPM pre výkon + nízka pamäť

Otvorte konfiguračný súbor PHP-FPM pre PHP 7.0.

sudo nano /etc/php/7.0/fpm/pool.d/www.conf

Nastavte nasledujúce hodnoty, ako je uvedené nižšie, venujte pozornosť ; pred pm.start_servers , pm.min_spare_servers a pm.max_spare_servers .

pm = ondemand znamená, že podriadené procesy v PHP-FPM sa budú spúšťať iba v prípade potreby

pm.max_children je maximálny počet podriadených procesov, ktorý bude povolený, 50 je dosť liberálne, ale ak v archíve denníka uvidíte, že počet podriadených procesov prekročil maximálnu hodnotu, musíte túto hodnotu zvýšiť

pm.process_idle_timeout zabíja podriadené procesy, keď boli nečinné 10 sekúnd

pm.max_requests nastavuje maximálny počet požiadaviek PHP pre každý podradený proces

Pm = na požiadanie; Počet podriadených procesov, ktoré sa vytvoria, keď je pm nastavené na "statický" a; Maximálny počet podriadených procesov, keď je pm nastavené na "dynamické" a "na vyžiadanie". Táto hodnota nastavuje limit počtu súbežných požiadaviek, ktoré sa vykonajú; behať. Ekvivalent k direktíve ApacheMaxClients v mpm_prefork. ; Ekvivalentná premenná prostredia PHP_FCGI_CHILDREN v pôvodnom PHP ; CGI. Nižšie sú predvolené nastavenia založené na serveri bez použitia významných zdrojov. nie; zabudnite na nastavenia hodiniek.* podľa vašich potrieb. ; Poznámka: používa sa, keď je pm nastavené na „statický“, „dynamický“ alebo „na požiadanie“ ; Poznámka: Táto hodnota je povinná. pm.max_children = 50 ; Počet podriadených procesov vytvorených pri spustení. ; Poznámka: používa sa len vtedy, keď je pm nastavené na "dynamický" ; Predvolená hodnota: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 ;pm.start_servers = 2 ; Požadovaný minimálny počet nečinných procesov servera. ; Poznámka: používa sa len vtedy, keď je pm nastavené na "dynamický" ; Poznámka: Vyžaduje sa, keď je pm nastavené na "dynamické" ;pm.min_spare_servers = 1 ; Požadovaný maximálny počet procesov nečinného servera. ; Poznámka: používa sa len vtedy, keď je pm nastavené na "dynamický" ; Poznámka: Vyžaduje sa, keď je pm nastavené na "dynamické" ;pm.max_spare_servers = 3 ; Počet sekúnd, po ktorých bude nečinný proces ukončený. ; Poznámka: používa sa len vtedy, keď je pm nastavené na "na požiadanie" ; Predvolená hodnota: 10s pm.process_idle_timeout = 10s; ; Počet žiadostí, po ktorých sa podriadený proces reštartuje. To môže byť užitočné pri predchádzaní úniku pamäte v knižniciach tretích strán. Pre; nekonečné spracovanie požiadavky, uveďte "0". Ekvivalent PHP_FCGI_MAX_REQUESTS. ; Predvolená hodnota: 0 pm.max_requests = 500

Skontrolujte, či je vaša syntax konfigurácie PHP-FPM správna

php-fpm7.0 -t

Mali by ste vidieť, že konfigurácia je účinná.

UPOZORNENIE: test konfiguračného súboru /etc/php/7.0/fpm/php-fpm.conf bol úspešný

Teraz môžete reštartovať php7.0-FPM

reštartujte službu sudo php7.0-fpm

Môžete vidieť, že množstvo pamäte RAM sa využíva podstatne menej.

V predchádzajúcich článkoch sme hodnotili výkon PHP na rôznych runtime, pridávali serverové zdroje (CPU a RAM) a porovnávali Symfony Proxy a Varnish – pomocou eZ Platform – CMS postaveného na Symfony Framework.

Teraz skúsme netradičný spôsob spúšťania PHP aplikácií, PHP-PM.

PHP sa stalo populárnym čiastočne aj vďaka tomu, že je veľmi jednoduché a bezpečné, pri každej požiadavke sa PHP spustí od nuly, nabootuje aplikáciu, odošle odpoveď a zanikne.

Vývojári PHP sa nemusia obávať zložitosti aplikácie s dlhou životnosťou s únikom pamäte, ale neustále opakovanie rovnakých základných úloh má vplyv na výkon. Opcaching pomáha zlepšiť výkon, ale stále je potrebné vykonať veľa práce pre nič".

Takmer pred dvoma rokmi, vo februári 2014, alternatívny spôsob spúšťania PHP bol predstavený: Prineste vysoký výkon do svojej aplikácie PHP (s ReactPHP) . Po prvom spôsobení vĺn v komunite PHP ustúpilo do pozadia.

Ale viedlo to priamo k PHP-PM a pravdepodobne ovplyvnilo vytvorenie PHPFastCGI . Obidva bežia PHP ako nepretržitý proces, ktorý reaguje na požiadavky, čo umožňuje odstrániť z rovnice rutinné bootstrapping.

To prináša zvýšený výkon, ale robí aplikáciu zraniteľnejšou voči chybám vývojárov a únikom pamäte v dôsledku dlhšieho životného cyklu. To je dôvod, prečo je metóda stále považovaná za experimentálnu, ale niektorí ju považujú za budúcnosť vykonávania PHP.

PHP-PM štandardne podporuje aplikácie Symfony Framework a platforma eZ fungovala podľa očakávania hneď po vybalení. Takže stojí za to vykonať kolo testov, aby ste zistili, ako obstojí v reálnej aplikácii.

PHP-PM vs. Výkon PHP-FPM

V súlade s predchádzajúce testy Spustil som požiadavky proti inštalácii eZ Platform Demo. Tradičné nastavenie PHP-FPM bežalo na PHP 7.0.1. PHP-PM bol za Nginxom ako vyrovnávač zaťaženia a testovali sa HHVM 3.11 aj PHP 7.0.1.

Počty procesov pre PHP-PM boli nastavené na dvojnásobok počtu jadier CPU, PHP-FPM mal limit max_child 10 - Vyskúšajte bezplatnú skúšobnú verziu pre vysoko výkonný VPS na UpCloud. Súbežnosť požiadaviek bola nastavená na 10. Testy boli spustené na prednej stránke a volaniach REST API bez Symfony Proxy alebo iného ukladania do vyrovnávacej pamäte na vysokej úrovni. Testy sa opakovali trikrát a uvádzajú sa priemerné výsledky.

Predná strana bez Symfony Proxy

Pre úplné vykreslenie stránky PHP-PM zobrazuje významnú výhodu oproti tradičnému nastaveniu PHP-FPM. PHP-FPM zostáva na rovnakej úrovni ako PHP-PM. HHVM je trvalo výkonnejší ako náprotivok PHP 7.


API bez Symfony Proxy

Pri volaniach API prinášajú spustenie PHP-PM výrazne vyššie výsledky ako nastavenie PHP-FPM, čo naznačuje, že väčšie percento času pri nich strávi bootsrapovaním, zatiaľ čo spracovanie je minimálne. HHVM začína na vrchole a po nerozhodnom výsledku na 2 CPU poskytuje PHP 7 vyššie výnosy s nastaveniami 4 a 8 CPU.

Porovnanie PHP-FPM, PHP-PM, Symfony Proxy a Varnish

Aby sa čísla dostali do väčšej perspektívy s výsledkami uloženými vo vyrovnávacej pamäti, porovnávajú sa s výsledkami pre výsledky Symfony Proxied (spustené pomocou PHP-FPM) a Varnish.


Celá predná strana

Pre úplné načítanie stránky obidva Symfony PHP Reverse Proxy a Varnish potláčajú akékoľvek dynamicky generované načítavanie stránok. S dobrou stratégiou ukladania do vyrovnávacej pamäte a zlúčenie fragmentov s ESI na úrovni proxy a backend PHP-FPM pravdepodobne prinesie najlepšie výsledky v reálnom svete.


Volanie REST API

Pre volania REST API s obmedzeným spracovaním PHP-PM s PHP o 7 palcov bližšie k výkonu Symfony Proxy. Zatiaľ čo PHP proxy je stále dvakrát rýchlejšia, stojí za zváženie, že pre požiadavky, ktoré sa ťažko ukladajú do vyrovnávacej pamäte a vyčistia, môže byť praktickou možnosťou dostatočne rýchly dynamický backend.

Závery

Spúšťanie dlhodobých procesov PHP zostáva kuriozitou, ale výsledky ponúkajú prísľub výrazne zlepšeného výkonu, keď je čas strávený zavádzaním aplikácie relatívne dlhý v porovnaní s celkovou dĺžkou spracovania.

Príkladom je nepretržite spustený démon v momentálne módnom svete drobných volaní API. V zákulisí sa môžu stať kaskádou cez dlhú reťaz, napr. služba volá REST API, ktorá volá REST API, ktorá volá REST API, ktorá volá REST API, ktorá volá REST API...

Bohužiaľ PHP-PM ešte nie je praktickým riešením pre spustenie produkčných služieb, pretože PHP 7 aj HHVM z času na čas skončia. Vychádzajúc z čistého pocitu HHVM sa zdá byť o niečo stabilnejší v porovnaní s PHP-PM.