php性能分析工具xhprof

XHProf是一個分層PHP性能分析工具。它報告函數級別的請求次數和各種指標,包括阻塞時間,CPU時間和內存使用情況。一個函數的開銷,可細分成調用者和被調用者的開銷,XHProf數據收集階段,它記錄調用次數的追蹤和包容性的指標弧在動態callgraph的一個程序。它獨有的數據計算的報告/後處理階段。在數據收集時,XHProfd通過檢測循環來處理遞歸的函數調用,並通過給遞歸調用中每個深度的調用一個有用的命名來避開死循環。XHProf分析報告有助於理解被執行的代碼的結構,它有一個簡單的HTML的用戶界面( PHP寫成的)
xhprof安裝配置
[root@news ~]# wget http://pecl.php.net/get/xhprof-0.9.2.tgz
[root@news ~]# tar zxf xhprof-0.9.2.tgz
[root@news xhprof-0.9.2]#cd xhprof-0.9.2
[root@news xhprof-0.9.2]#cp -r xhprof_html xhprof_lib /www/auto/(網站源碼路徑複製完成之後記得修改用戶所有者權限)
[root@news xhprof-0.9.2]#cd extension
[root@news extension]# ./configure --with-php-config=/usr/local/php/bin/phpize
[root@news extension]# make && make install
安裝完成之後修改php.ini添加(前提是你的擴展路徑已經修改成extension_dir = "/usr/local/php/lib/php/extensions/no-debug-non-zts-20060613/")
extension = xhprof.so
xhprof.output_dir=/log/xhprof
修改完成之後重新啓動web服務 apache重啓服務 nginx重啓php-fpm服務
安裝Graphviz:(也可以不安裝,如果安裝了Graphviz,XHProf會用比較牛的圖形方式展現統計數據)
root@news ~]# wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
root@news ~]# tar zxf graphviz-2.24.0.tar.gz
root@news ~]# cd graphviz-2.24.0
[root@news graphviz-2.24.0]# ./configure
[root@news graphviz-2.24.0]#make
[root@news graphviz-2.24.0]#make install
安裝完成後,會生成/usr/local/bin/dot文件,你應該確保路徑在PATH環境變量裏,以便XHProf能找到它
xhprof_enable(); //統計的代碼部分之前加,如果要顯示CPU佔用 可以加入XHPROF_FLAGS_CPU參數,內存是XHPROF_FLAGS_MEMORY,如果兩個一起:XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY,如:xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
xhprof_disable();//統計的代碼部分之後加
這樣xhprof就可以統計當前頁面的函數性能情況了。xhprof會把每次訪問加入統計代碼的頁面的性能統計結果在指定目錄下生成一個文件,文件名命名方式爲:本次訪問的系統ID.命名空間,每次刷新頁面都會重新生成一個文件,每個的系統ID都不同。
然後通過xhprof_html目錄的http訪問url來查看結果。如:http://app/xhprof_html/?run=運行id&source=命名空間(其中運行ID和命名空間可以根據xhprof生成的文件名來確定)
使用XHProf:

// start profiling
xhprof_enable();

// run program
....

// stop profiler
$xhprof_data = xhprof_disable();

//
// Saving the XHProf run
// using the default implementation of iXHProfRuns.
//
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

$xhprof_runs = new XHProfRuns_Default();

// Save the run under a namespace "xhprof_foo".
//
// **NOTE**:
// By default save_run() will automatically generate a unique
// run id for you. [You can override that behavior by passing
// a run id (optional arg) to the save_run() method instead.]
//
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");

echo "---------------\n".
"Assuming you have set up the http based UI for \n".
"XHProf at some address, you can view run at \n".
"http://<xhprof-ui-address>/index.php?run=$run_id&source=xhprof_foo\n".
"---------------\n";

貼下我的一個測試文件
[root@news trunk]# vi test.php 

<?php
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
phpinfo();
$data = xhprof_disable();
include_once "xhprof_lib/utils/xhprof_lib.php";
include_once "xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($data, "xhprof_foo");

echo "---------------\n".
"Assuming you have set up the http based UI for \n".
"XHProf at some address, you can view run at \n".
"http://XXXX/xhprof_html/index.php?run=$run_id&source=xhprof_foo\n".
"---------------\n";
?>
之後在瀏覽器裏面直接訪問test.php的頁面會在上面設定的xhprof.output_dir目錄裏生成名字類似52ba534254958.xhprof_foo.xhprof的數據文件,可以很方便的通過Web方式瀏覽效果:
http://XXXX/xhprof_html/index.php?run=52ba534254958&source=xhprof_foo
目前顯示的是表格形式的顯示,點擊頁面上的[View Full Callgraph],就能看到精美的圖片顯示了。

 

下面是一些參數說明
Inclusive Time                 包括子函數所有執行時間。
Exclusive Time/Self Time  函數執行本身花費的時間,不包括子樹執行時間。
Wall Time                        花去了的時間或掛鐘時間。
CPU Time                        用戶耗的時間+內核耗的時間
Inclusive CPU                  包括子函數一起所佔用的CPU
Exclusive CPU                  函數自身所佔用的CPU
所有參數說明
Function Name 函數名

   Calls 調用次數

   Calls% 調用百分比

   Incl. Wall Time (microsec) 調用的包括子函數所有花費時間 以微秒算(一百萬分之一秒)

   IWall% 調用的包括子函數所有花費時間的百分比

   Excl. Wall Time (microsec) 函數執行本身花費的時間,不包括子樹執行時間,以微秒算(一百萬分之一秒)

   EWall% 函數執行本身花費的時間的百分比,不包括子樹執行時間

   Incl. CPU(microsecs) 調用的包括子函數所有花費的cpu時間。減Incl. Wall Time即爲等待cpu的時間

   減Excl. Wall Time即爲等待cpu的時間

   ICpu% Incl. CPU(microsecs)的百分比

   Excl. CPU(microsec) 函數執行本身花費的cpu時間,不包括子樹執行時間,以微秒算(一百萬分之一秒)。

   ECPU% Excl. CPU(microsec)的百分比

   Incl.MemUse(bytes) 包括子函數執行使用的內存。

   IMemUse% Incl.MemUse(bytes)的百分比

   Excl.MemUse(bytes) 函數執行本身內存,以字節算

   EMemUse% Excl.MemUse(bytes)的百分比

   Incl.PeakMemUse(bytes) Incl.MemUse的峯值

   IPeakMemUse% Incl.PeakMemUse(bytes) 的峯值百分比

   Excl.PeakMemUse(bytes) Excl.MemUse的峯值

   EPeakMemUse% EMemUse% 峯值百分比

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章