Jump to content
php.lv forumi

CPU slodzes mērīšana atsevišķiem procesiem


codez

Recommended Posts

Š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 by codez
Link to comment
Share on other sites

Š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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...