Puncte:1

PHP-FPM + nginx - Pool ocupat și optimizat pentru cod PHP probabil rău - eroare 502

drapel br

Am fost în situația în care nu pot obține lucru PHP-FPM pentru mine, chiar și în cazul unei creșteri ușoare a traficului. Am încercat să urmăresc cauza reală de la un timp și nu au avut succes până acum.

A început cu un anumit site care dă eroare 502, uitându-mă în jurnalele PHP-fpm, obțin asta:

AVERTISMENT: [pool www-userA] pare ocupat (poate fi necesar să creșteți pm.start_servers sau pm.min/max_spare_servers), generând 8 copii, sunt 39 inactiv și 49 total de copii

Apoi am verificat resursele serverului, partea de sus spune că este aproape 0, cu doar 2-4% utilizare a resurselor. Următoarea a fost modificarea pool-ului PHP-FPM:

pm = dinamic
pm.max_children = 800
pm.process_idle_timeout = 5s
pm.start_servers = 40
pm.min_spare_servers = 40
pm.max_spare_servers = 80
pm.max_requests = 500
php_admin_value[max_execution_time] = 60

;Adăugat mai târziu pentru a depana în continuare
request_slowlog_timeout = 5s
slowlog = /var/log/pool_userA_fpm_slow_log

;Adăugat mai târziu pentru a compensa dacă există o problemă de coadă pentru depanare
listen.backlog =24000

Am fost aproape la fiecare postare PHP-FPM legată de acest subiect, inclusiv: https://stackoverflow.com/questions/25097179/warning-pool-www-seems-busy-you-may-need-to-increase-pm-start-servers-or-pm

Acest server are aproximativ 12 GB de RAM și procesor cu 8 nuclee numai pentru nginx+php-fpm. Fiecare proces PHP este de aproximativ 15-20 MB fiecare.

A încercat să crească pm.max_children = 1500 dar după un timp am văzut din nou aceeași eroare pentru „Piscina fiind ocupată”.

Apoi am activat slowlog în php-fpm și, de asemenea, am activat slowlog pentru mysql.

  • În jurnalul lent php-fpm, am găsit câteva pagini php care durează aproximativ 5 secunde pentru a fi finalizate,
  • În jurnalul lent mysql, am găsit câteva interogări care examinează 2-5 milioane de rânduri (durand aproximativ 5 secunde pentru a fi finalizate)

Presupunând că scriptul PHP ar putea cauza coadă sau întârziere, așa că am adăugat listen.backlog =24000 precum și în /etc/security/limits.conf adăugat limită soft și hard pentru acest utilizator special, astfel încât există spațiu pentru scripturi lente,

userA soft nofile 4096
userA hard nofile 65536

Mai departe în sysctl adică.

echo "net.core.somaxconn=65536" >> /etc/sysctl.conf

Mai departe, în php-fpm master s-a adăugat php-fpm.conf, de exemplu. conf. piscină exterioară:

rlimit_files = 65536
rlimit_core = 0

Ale mele ulimit -Hn spune:

524288

În plus, deoarece php-fpm era ocupat, am descoperit că pot adăuga următoarele directive în php-fpm pentru a reporni în cazul în care sunt ocupat, dar nu se întâmplă, trebuie să repornesc manual php-fpm pentru a reporni site-ul :

[global]
emergency_restart_threshold 10
emergency_restart_interval 1m
proces_control_timeout 10s

După cum s-a spus, directiva de mai sus nu face repornire în cazul în care pool-ul este o eroare ocupată în php-fpm.log

Până acum cred că din cauza scriptului PHP lent, copiii mei php-fpm sunt epuizați și provoacă o eroare 502. Nu am control asupra PHP și trebuie să prezint o soluție ajustând configurația serverului pentru aceasta.

Am încercat să măresc pm.max_children = 2000 dar tot aceeasi problema. Uneori primind 504 Gateway Time-out erori.

Pe de altă parte, dacă eu changed pm = ondemand

Primesc mai întâi următoarea notificare:

 listen.backlog(25000) a fost prea scăzut pentru managerul de proces la cerere. L-am actualizat pentru tine la 65535

Mai târziu am primit această eroare și din nou de data aceasta eroare 504:

[11-Nov-2021 06:56:45] AVERTISMENT: serverul [pool userA] a ajuns la setarea max_children (800), luați în considerare creșterea acesteia.

Un lucru de remarcat în toate este că nu există aproape nicio încărcare pe server în toate cazurile, 2-4% utilizare a resurselor. Deci, cred că este mai multă problemă de configurare decât utilizarea resurselor.

Am fost la aproape toate subiectele legate de PHP-FPM aici despre serverfault și o mulțime de documente, dar tot nu am câștigat. Aici sper ca cineva ma poate indruma in directia buna.

Mulțumiri

Wilson Hauck avatar
drapel jp
Cerere informatii suplimentare, va rog. Există dispozitive SSD sau NVME pe serverul MySQL Host? Postați pe pastebin.com și distribuiți linkurile. Din rădăcina dvs. de conectare SSH, rezultă text de: A) SELECTARE COUNT(*) FROM information_schema.tables; B) AFIȚI STARE GLOBALĂ; după minim 24 de ore UPTIME C) AFIȘAȚI VARIABILELE GLOBALE; D) AFIȚI LISTA COMPLETĂ DE PROCES; ȘI informații foarte utile, includ - htop SAU top pentru majoritatea aplicațiilor active, ulimit -a pentru o listă de limite Linux/Unix, iostat -xm 5 3 pentru IOPS în funcție de dispozitiv și număr de nuclee/procesoare, pentru analiza de reglare a sarcinii de lucru a serverului pentru a oferi sugestii.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.