codez Posted June 29, 2010 Report Share Posted June 29, 2010 (edited) Šodien pusi dienas ņēmos ar metodes atrašanu Windows videi, ar kuru varētu precīzi un vienkārši izmērīt, nevis skripta izpildes laiku, bet gan tieši php patērēto procesora resursu. Man tas izdevās, tāpēc nolēmu padalīties savā atklājumā ar php komūnu. Kāpēc tas vajadzīgs? Tāpēc, ka bieži PHP komunicē ar citiem serveriem, piemēram, mysql, vai kāds ārējs API. Ja mēra vienkārši laiku, tas neļauj novērtēt patieso PHP skripta performanci, jo klāt tiek pieskaitīts laiks, kamēr php skripts gaida uz ārējiem serveriem. Lūk neliela klase ar izmantošanas piemēru: http://paste.php.lv/b9494e558a37e953566873d6c627cb12?lang=php Klase ļauj mērīt laiku arī citiem procesiem, ja zināms faila nosaukums. Konkrētajā piemērā mēru reālo skripta izpildes laiku, paša webservera patērēto CPU laiku un mysqld.exe (mysql servera) procesa patērēto CPU laiku. Daži rezultāti: 1. 10M cikls ar mainīgā piešķiršanu: for($i=0;$i<10000000;$i++){ $a=$i; } Real time:3.4060549736023 Httpd time:3.344 mysqld time:0 Kā redzam, reālais laiks gandrīz sakrīt ar httpd patērēto CPU laiku, jo šāds cikls visu laiku noslogo procesoru. 2. 10M cikls + 5 sekunžu sleep for($i=0;$i<10000000;$i++){ $a=$i; } sleep(5); Real time:9.0285861492157 Httpd time:3.687 mysqld time:0 Kā redzams, tad httpd CPU patērētais laiks ir aptuveni tāds pats kā 1. piemērā, taču kopējais laiks ir aptiveni par 5 sekundēm lielāks. Tas ir tāpēc, ka sleep aiztur skriptu, bet procesoru nenoslogo. 3. mysql select-s ar pilnu 10000x10000 rindu join-a skenēšanu: $db=new mysqli('localhost','root','','test'); $db->query('select max(t3.val) from t3,t3 as t4 WHERE t3.id+t4.id>5'); Real time:15.235244035721 Httpd time:0 mysqld time:14.719 Kā redzams, tad httpd cpu laiks ir 0, kamēr mysql laiks ir 15 sekundes, kas apmēram sakrīt ar pilno skripta laiku. Tas nozīme, ka praktiski visi aprēkini šijā pieprasījumā tika veikti mysql serverī. 4. 10M cikls + 5 sek. sleep + mysql kverijs for($i=0;$i<10000000;$i++){ $a=$i; } $db=new mysqli('localhost','root','','test'); $db->query('select max(t3.val) from t3,t3 as t4 WHERE t3.id+t4.id>5'); sleep(5); Real time:22.411914110184 Httpd time:3.969 mysqld time:12.765 Kā redzam PHP skripts ir patērējis gandrīz 4 sekundes, mysql serveris 12,8, bet viss kopējais laiks ir 22,4 sekundes, kas ir aptuveni 4+12,8+5=21,8 sekundes. Tas, ka kopējais laiks visu laiku ir nedaudz lielāks par visu laiku summu, norāda uz to, ka datorā ir citi procesi, kas arī strādā uz tiem pašiem CPU kodoliem. Vēl jāņem vērā, ka veicot benchmarkus ar šo metodi, jālaiž viens request vienlaicīgi, jo visi requesti iet zem apache procesa. Šāda mērīšanas metode ļauj objektīvi novērtēt PHP skripta patieso CPU resursa noslodzi, jo atšķirībā no vienkārša laika mērīšanas, neiekļauj sevī blakus procesu slodzi uz CPU. Cerams, ka kādam noderēs! :) P.S. jāieslēdz php_win32ps extension-s Edited June 29, 2010 by codez Quote Link to comment Share on other sites More sharing options...
briedis Posted June 29, 2010 Report Share Posted June 29, 2010 Interesanta štelle! Quote Link to comment Share on other sites More sharing options...
codez Posted June 29, 2010 Author Report Share Posted June 29, 2010 Šeit nedaudz ērtāks interfeiss mērīšanai: http://paste.php.lv/2070681a415d1337f6c3f19513ea6628?lang=php $st=new ProcessStats(); // izveidojam mērīšanas objektu $st->init(); //inicializējam taimerus // šeit mērāmais kods $st->measure(array('httpd.exe','mysqld.exe')); // mērām, norādot, kuriem procesiem gribam mērīt, vai measure('all'), ja visiem. $st->show(); //parādām datus //šeit mērāmais kods $st->measure(array('httpd.exe','mysqld.exe')); // atkal mērām $st->show(); //parādām datus Quote Link to comment Share on other sites More sharing options...
marrtins Posted June 29, 2010 Report Share Posted June 29, 2010 Nice! Bet labāk atdalīt kernel no user time, lai var skaidrāk redzēt, kur kas pazūd vai tērējas. Vai var arī divas papildus metodes. Quote Link to comment Share on other sites More sharing options...
daGrevis Posted June 29, 2010 Report Share Posted June 29, 2010 O! Benchmarks. =) Quote Link to comment Share on other sites More sharing options...
codez Posted June 29, 2010 Author Report Share Posted June 29, 2010 marrtins, tā drošvien arī būs jādara. Vēl ir iespējams iegūt vairākus parametrus par procesu atmiņas patēriņu, kad būši pilnībā ticis skaidrībā, ko katrs parametrs sevī iekļauj, tad pievienošu tos arī monitoringam un reportam. Pašlaik vēl lasos un meklēju infu, vai nav iespējams monitorēt cpu noslodzi atsevišķiem thread-iem, lai monitorēšana strādātu arī ar paralēliem request-iem. Quote Link to comment Share on other sites More sharing options...
mounkuls Posted June 29, 2010 Report Share Posted June 29, 2010 Moins... Sākumā, lasot to penteri, pirmā doma bija tiešām ka mauc reizē bezmaz..... Labi, bet 4. kur loģika? Gadijumā neaptrūka RAM? Quote Link to comment Share on other sites More sharing options...
codez Posted June 30, 2010 Author Report Share Posted June 30, 2010 Tie visi ir piemēri, kas demonstrē to, ka var mērīt CPU noslodzes laiku atsevišķi procesiem. 4. piemērā demonstrēts tas, ka skriptā tiek izpildītas 3 dažāda veida darbības un ka tiek izmērīrīts ne tikai kopējais izpildes laiks, bet noslodzes ilgums, ko rada tikai PHP skripts un tikai mysql datubāzes serveris. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.