Acum aproape trei săptămâni fac un deploy în organizația cu care lucrez. După câteva ore, lucrurile încep să o ia la vale: procesoarele serverelor erau la 100%, memoria și baza de date abia erau atinse.
Interludiu
Înainte să intru în detalii, să spun întâi despre cum funcționează bestia.
Mediul în care rulează toată povestea este AWS, cu resurse decente: în zilele normale sunt 2-6 servere t3.xlarge (4CPU, 16Gb RAM) scalate automat, în funcție de trafic.
Toată infrastructura este administrată prin Terraform, iar pentru orice schimbare se face commit. Orice deployment este făcut prin pipeline și înseamnă un server nou pe care se reinstalează tot.
Pe lângă asta, avem două servere extra, unul pentru dev, altul pentru staging. Din motive de timp, serverele astea două extra sunt reciclate (lucru important, dar aflat abia aseară) și trec prin procesul de reinstalare doar dacă trec de un anumit threshold la resursele folosite.
De când a început nebunia, s-a făcut întâi upgrade la 10 ✕ t3.2xlarge (8CPU, 32Gb RAM), apoi la altele și mai mari, cu 32CPU. Practic, aveam 320 CPU iar site-ul murea la 100 vizitatori. 🤦♂️
Pentru că planetele s-au aliniat foarte bine, serverul de dev era enervant de rapid, restul erau lente. Cât de lente? +30s pentru o pagină goală. Pe dev, aceeași pagină se încărca în 3-400ms. Și ca să fie totul și mai frustrant, resursele pe serverul ăsta erau cele mai mici, gen 1CPU, 2Gb RAM.
Serverul local? All good.
Semne bune
Cum set-up-ul este minunat – WordPress multisite, WPML, Elementor, plus alte 30 plugins – primul gând a fost: este buba la un plugin. Fac rapid restore și se rezolvă. Țeapă, am făcut restore la câteva versiuni din trecut. Nimic. Fac restore la baza de date. Nimic.
După ce am luat lucrurile metodic (dezactivat plugin-uri, activat unul câte unul, install fresh etc), am ajuns la concluzia că singurul lucru care ar putea fi de vină este AWS. Sysadmin-ul zice că n-are cum, eu îi zic: hai să mai facem un server, să vedem. Nu mă, n-are cum. Humor me.
Server nou AWS. La fel de lent.
După ce am primit voie de la legal (să mut baza de date), am făcut un droplet pe Digital Ocean. Rapid. Deci problema trebuie să fie în AWS! Pe de altă parte, erau atât de multe diferențe între DO și AWS încât nu eram atât de sigur.😅
Disperare
Am încercat tot ce mi-a trecut prin cap. Am întrebat, am explicat. Profiler. Debugger. Tracing. Toate arătau că problema ar fi de la Elementor. Dar de ce nu pot replica în toate mediile?
Nimeni nu avea o explicație logică. Am fost nevoit să trec la lucruri cu adevărat serioase.
Degeaba.
Casual Talk
La un moment dat, întreb pe Slack-ul Toptal. Îmi răspunde un tip, că și el a observat probleme de performanță și îmi dă un screenshot din New Relic cu timpii de încărcare.
Încep să-l descos pe individ, să văd ce set-up are. Nu avea nimic în comun cu set-up-ul meu, cu excepția a două lucruri:
- Elementor
- New Relic
Nimic altceva. Nici servere, nici nu era multi-site, nici nimic.
Și apoi mă lovește: mai este o diferență între serverul de pe DO și cele din AWS: cel de pe DO nu are New Relic. Și nici cel local.
Hmmm, n-are cum să fie asta, nu?
N-are cum să fie New Relic, nu?
Și fac un test în staging: scot extensia New Relic din php.ini. Lucrurile revin instant la normal. Facem rapid un test, facem deploy șiiii….
Apoi încep să apară mai multe semne. Pe Github. Pe forum.
Explicația
Am zis mai sus treaba asta:
Pe lângă asta, avem două servere extra, unul pentru dev, altul pentru staging. Din motive de timp, serverele astea două extra sunt reciclate (lucru important, dar aflat abia aseară) și trec prin procesul de reinstalare doar dacă trec de un anumit threshold la resursele folosite.
Ei bine…
Pentru că serverele nu treceau prin procesul de reinstalare, agentul New Relic nu era modificat.
Concluzii
Am învățat/aflat/mi-am reamintit câteva lucruri în toată povestea asta:
- nu sunt eu de vină pentru toate relele care se întâmplă 😅😅
- că nu există „nu se poate să fie de aici”. Când ceva nu are explicație, ia în considerare orice posibilitate;
- nu trebuie să ai încredere în sysadmin 😂 Nu pentru că ar fi rău intenționat, ci pentru că este posibil să-i scape anumite aspecte;
- cu răbdarea treci marea.
Lasă un răspuns