Aplikacijų monitoringas: xhprof


Taigi, tęsiame mūsų paieškas aplikacijų monitoringe. Facebook vyrai sugalvojo analogą XDEBUG skirtą būtent production sistemoms – xhprof. Pačio PHP išplėtimo (extension) diegimas nėra sudėtingas, nes galime naudoti pecl repositoriją, kompiliuosite rankomis ar ne – Jūsų pasirinkimas. Nurodžius išplėtimą php.ini faile ir perkrovę PHP procesus iš karto pradedame rinkti informaciją. Yra keletas programėlių kuriomis galime peržiūrėti surinktus duomenis, visai kaip su XDEBUG. Žinoma mūsų tai netenkina, todėl ieškome kaip viską atvaizduoti online. Čia ir prasideda sunkioji dalis.

Atsisiuntę visą paketą ir išarchyvavę viduje randame katalogą, kuriame yra jau parašyta sistemėlė su kuria teoriškai turėtumėme pamatyti rezultatus. Nurodžius reikiamus nustatymus pasileidžiame ir … Vaizdas nustebino: didelis kiekis klaidų pranešimų ir tiek. Na faile pasirašę indas ir kinietis matyt nebuvo patys geriausi facebook programuotojai, bet taip netvarkingai programuoti visgi nereikėtų :) . Tuomet susiradau https://github.com/preinheimer/xhprof. Žmonės sutvarkė facebook programuotojų klaidas ir perkelė visą informaciją į MySql duomenų bazę. Pagal instrukcijas atliekame visus žingsnius. Pirma reikia į savo aplikaciją pradžioje ir pabaigoje includinti du failus header.php ir footer.php. Pagal numatymą profiliavimas veikia ne visada, reikia tam tikrų parametrų url adrese, tačiau pamodifikavus header.php galime pasidaryti kaip norime. Aš pabandymui nustačiau, kad profiliavimas būtų įjungtas nuolat. Sekantis žingsnis yra apsirašyti funkciją _aggregateCalls kuri daugybę skirtingų adresų susistemina, pavyzdžiui turite adresą /naujienos/pirma-naujiena ir /naujienos/antra-naujiena ir tikriausia norėsite matyti šiuos du adresus kaip /naujienos, nes sistemos modulis bus tas pats, skirsis tik iš duomenų bazės gaunama informacija. Ši funkcija yra jau aprašyta, tačiau kiekviena sistema turi savo specifiką, tad paliekama laisvė daryti taip kaip norime. Nepamirštame sukurti reikiamą lentelę duomenų bazėje ir nurodyti prisijungimus prie jos.
Viską paleidus laukiame rezultatų. Po kelių minučių jau galime džiaugtis surinkta informacija. Vartotojo sąsaja itin paprasta. Matome transakcijų sąrašą, data ir laikas, procesoriaus apkrova, vykdymo laikas, atminties sunaudojimas, url adresas, su funkcija _aggregateCalls apdorotas adresas. Galime rikiuoti įrašus pagal kiekvieną iš stulpelių, galime pasirinkti filtrus (praeitą savaitę daugiausia sunaudoję RAM atminties ar šiandien ilgiausia vykdomi).

Paspaudę ant pilno adreso arba ant mūsų apdoroto matysime tik to adreso įrašus plius papildomai nubraižomas grafikas.

Paspaudę ant datos atsidaro visa informacija apie mūsų aplikacijos vidurius.

Pateikiamos informacijos kiekis yra pakankamas, pagal visus stulpelius galime informaciją rikiuoti, pateikiama agreguota statistika apie skriptą, bei grafiškai atvaizduojamas sunaudotas laikas pagal PHP funkcijas. Paspaudę ant konkrečios funkcijos matome kokiuose failuose ji buvo iškviesta ir žinoma pateikiami sunaudoti resursai.

Iš esmės tai kaip ir yra tai ko norėjome, tačiau yra vienas BET. Per 5 testavimo dienas buvo atlikti 747 260 puslapio atvertimai, lentelės dydis duomenų bazėje yra 3.1 GB … Tas tikrai nėra mažai, plius kiekis gali būti ir didesnis, jei naudojamų funkcijų bus daug daugiau. Kita vertus profiliavimas nėra skirtas nuolatiniam monitoringui. Tai pat galime pasilesti cronjob’ą kuris pravalytų nebereikalingus duomenis. Beto tokio dydžio lentelėje pasimatė ir lentelės struktūros problemos, vienas stulpelis buvo be indekso, tad pasileisti vartotojo aplinkos šį ryt taip ir nepavyko, teko indeksą pridėti pačiam, o tikriausia žinote kaip šauniai pridedamas indeksas tokio dydžio lentelei :) .

Taigi sprendimas šiuo metu matosi toks: naudoti ankstesniame straipsnyje aprašytą newrelic sistemą, kur nemokamoje versijoje galime matyti paskutinių 30 minučių duomenis, pasirašyti cronjob’ą kuris kas 15 ar 30 minučių peržiūrėtų duomenis prieinamus per newrelic web API ir jei nėra kažkokių problemų – pravalyti peržiūrimo laikotarpio xhprof surinktus duomenis. Aišku čia reiks patiems parogramuoti, bet ir pats xprof sprendimas reikalauja jau atskirai prisėsti prie savo sistemos. Jei tai negąsdina – turėsime gana neblogą monitoringo sistemą. Jei nepavyks rasti kažko panašaus bandysim tokią sistemą pasirašyti… Laukite tęsinio…

Žygimantas

Lead developer at Soundest. Zend Certified Engineer.

More Posts - Website

Žymos: , ,

4 komentarai

  1. Egzistuoja dar toks labai neblogas daiktas kaip DTRACE, tik jis man rodos dar ne visur veikia taip, kaip Solaryje

    • Vien to neužteks reikia pačio DTRACE, yra jis ir Linux’e ir FreeBSD jau kuris laikas, tai gal net ir veiks kaip priklauso (-;

  2. Kiek daugiau paieškojęs, matau jau vieną problemą – nėra web gui… Arba ją sunku rasti…

Parašykite komentarą

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *

Galite naudoti šias HTML žymas ir atributus: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>