Puncte:0

Cele mai bune practici pentru depanarea aplicației PHP blocate din cauza apelurilor interne curl către punctele finale care nu răspund

drapel cn

Recent m-am trezit cu un site web (Prestashop e-commerce pe o mașină Centos PHP-FPM /Apache / MySql) care nu răspundea și nu răspundea solicitărilor web.

După investigație, problema s-a datorat unui apel API făcut cu php-curl către un endpoint care era temporar offline, în interiorul unui fișier PHP al aplicației care a fost rechemat în toate paginile site-ului.

Apelul cURL a fost efectuat greșit fără o setare CURLOPT_TIMEOUT_MS, astfel încât utilizatorii care mi-au vizitat site-ul au completat rapid numărul maxim de conexiuni php, blocând procesele php-fpm și împiedicând serverul meu să primească alte conexiuni de intrare.

Mă întreb dacă se poate preveni/identifica rapid și eficient o astfel de problemă „în producție” de la terminal dacă se întâmplă din nou (mai ales pentru a înțelege rapid care este endpoint-ul blocat sau pentru a identifica fișierul din care este generat scriptul care a blocat serverul) , deoarece în cazul meu a trebuit să verific problema la „nivel de aplicație” și nu de pe server, deoarece:

  • lansând „top”, serverul arată lista de procese php-fpm blocate fără nicio informație suplimentară pentru a înțelege problema (de asemenea, media de încărcare a serverului a fost de aproximativ 0,00, deoarece nu a existat aproape nicio activitate din cauza conexiunilor blocate).
  • Lansarea „netstat -nputw” îmi arată o mulțime de conexiuni interne în starea TIME_WAIT, dar din nou nu există informații despre întreruperea „vinovat” (aș putea vedea punctul final apelat de php-curl cu netstat sau o comandă de rețea similară?)
  • Lansând o „rătăcire” a proceselor php-fpm văd o mulțime de fișiere implicate, dar acest lucru nu este de mare ajutor deoarece site-ul, cu trafic mediu, deschide zeci și zeci de fișiere.
  • Jurnalele serverului web m-au informat doar despre conexiunile timeout la resursele web, dar nu și despre scriptul care conține apelul problematic cURL.

Multumesc pentru ajutor.

drapel ua
Adăugați timeout-ul și măsurați cât de lung se blochează.
user3256843 avatar
drapel cn
întrebarea nu este ce să faci după ce ai înțeles rădăcina problemei, ci cum să o detectezi corect în cazul în care se întâmplă din nou (de exemplu, pe un alt site web)
drapel ua
Dacă rezultatele buclei sunt necesare pentru construirea paginii, atunci trebuie să așteptați până când curl-ul eșuează sau expiră. Ce aspect al acestei afirmații te poți relaxa?
user3256843 avatar
drapel cn
poate nu am fost suficient de clar in formularea intrebarii, ceea ce trebuie sa stiu este, din punct de vedere "sysadmin", cum sa gasesc din terminal, in cel mai scurt timp posibil, cauza principala intr-o situatie de genul asta daca ar trebui să se întâmple din nou, de exemplu, pe un alt server, fără a fi conștienți de modul în care se face aplicația și fără a analiza aplicația.
drapel ua
Iar sugestia mea a fost un pas spre asta. S-ar putea să am mai multe indicii după ce îmi răspunzi la întrebări. (Când nu pot răspunde la o întrebare, măcar încerc să ajut cu depanarea.)
user3256843 avatar
drapel cn
O sa incerc sa ma explic mai bine: odată ce am găsit problema pe aplicație, știu perfect că, pentru a o rezolva, trebuie setat un timeout pentru apelul curl care nu răspunde (sau apelul curl trebuie dezactivat cu totul), dar remedierea aplicației scrise proaste nu a făcut parte. de meseria mea... Întrebarea a fost pusă deoarece nevoia mea este ca administrator de sistem - să identific cauza principală a problemei fără să știu nimic despre aplicația de bază în cel mai scurt timp posibil, cu un shell în fața mea.
drapel ua
O anecdotă: În urmă cu mulți ani, aveam un program care făcea multe bucle. Din când în când, se bloca. După ce am cercetat destul de mult și am întrebat experți, am ajuns la concluzia că ceva foarte scăzut în sistemul de operare a cauzat problema. Am putut arăta în mod repetat că blocarea a fost de exact 80,0 secunde. Acest lucru, desigur, era inacceptabil. Dar nu am putut găsi o soluție în fir. (Eventual folosirea mai multor fire m-ar fi permis să continui procesarea, dar nu am vrut să merg acolo.)

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.