引言:
XHProf是一個分層PHP性能分析工具。它報告函數級別的請求次數和各種指標,包括阻塞時間,CPU時間和內存使用情 況。一個函數的開銷,可細分成調用者和被調用者的開銷。原始數據收集部分是用純C實現的,是一個名叫xhprof的 Zend擴展 。XHProf有一個簡單的HTML的用戶界面( PHP寫成的)。基於瀏覽器的性能分析用戶界面能更容易查看,或是與同行們分享成果。也能繪製調用關係圖。
XHProf報告往往可以有助於理解被執行的代碼的結構。的等級性質的報告可用來確定,例如,什麼鏈要求導致了所謂的特殊 功能得到。
XHProf可以比較兩次運行的結果(又名“差異報告”)或是從多次運行得到的彙總數據。差異和彙總報告,就像單一運行報 告一樣,也提供“平板”以及“分層”的性能分析視圖。
XHProf是一種輕量級的性能分析工具。在數據收集階段,它記錄調用次數的追蹤和包容性的指標弧在動態 callgraph的一個程序。它獨有的數據計算的報告/後處理階段。在數據收集時,XHProfd通過檢測循環來處理遞歸的函數調用,並通過給遞歸調用 中每個深度的調用一個有用的命名來避開死循環。
XHProf的輕量級性質和匯聚功能,使得它非常適合用於收集“生產環境”的性能統計數據的統計。
安裝:
wget http://pecl.php.net/get/xhprof-
tar zxf xhprof-
cd xhprof-
cp -r xhprof_html xhprof_lib <directory_for_htdocs>
cd extension
phpize
./configure
make
make install
編輯php.ini:
[xhprof]
extension=xhprof.so
;
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
;
xhprof.output_dir=<directory_for_storing_xhprof_runs>
重啓服務讓修改生效,現在就可以使用XHProf了,不過爲了顯示效果更炫、更直觀,最好繼續安裝Graphviz。
安裝Graphviz:
wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-
tar zxf graphviz-
cd graphviz-
./configure
make
make install
在代碼中,程序頭部如下設置:
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
程序最下面:
$xhprof_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($xhprof_data, 'xhprof');
echo 'http://<xhprof-ui-address >/index.php?run='.$run_id.'&source=xhprof';//source的值就是save_run的第二個參數的值。其中,網址就是上面保存xhprof_html的路徑。
經過上面設置,之後執行剛纔的php頁面,xhprof.output_dir指定的目錄便有文件生成,類似於4e813c15a46ff.xhprof
通過瀏覽器訪問:
但是如果查看[View Full Callgraph]的時候,卻提示如下:Error: either we can not find profile data for run_id 4d7f0bd99a12f or the threshold 0.01 is too small or you do not have ‘dot’ image generation utility installed.,
解釋如下:
xhprof繪製的是png圖,系統(graphviz-
在graphviz目錄下,執行 ./configure
可以看到png: No (missing png.h)
解決辦法:
到libpng官網down分源碼,再次編譯一下
網址 http://sourceforge.net/projects/libpng/files/libpng15/1.5.1/ 選擇合適源碼包
wget http://nchc.dl.sourceforge.net/project/libpng/libpng15/1.5.1/libpng-1.5.1.tar.gz
tar zxf libpng-1.5.1.tar.gz
cd libpng-1.5.1
./configure
make
make install
然後重新編譯安裝graphviz ,解決問題
當現在打開[View Full Callgraph]的時候,直觀的資源佔用統計圖就出現在眼前了
結果分析:
主要的
Inclusive Time (或子樹時間):包括子函數所有執行時間。
Exclusive Time/Self Time:函數執行本身花費的時間,不包括子樹執行時間。
Wall時間:花去了的時間或掛鐘時間。
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% 峯值百分比