天天看點

深入了解xhprof性能分析工具前言常見問題性能分析原理

這篇文章不是教你如何安裝使用xhprof進行性能分析。如果想了解如何安裝使用xhprof,網絡上文章很多,你也可以看我之前寫的兩篇文章。

<a href="http://www.bo56.com/%e9%9d%9e%e4%be%b5%e5%85%a5%e5%bc%8f%e7%9b%91%e6%8e%a7php%e5%ba%94%e7%94%a8%e6%80%a7%e8%83%bd/">非侵入式監控php應用性能監控分析</a>

<a href="http://www.bo56.com/xhprof-gui%ef%bc%8c%e8%ae%a9xhprof%e7%95%8c%e9%9d%a2%e6%9b%b4%e6%bc%82%e4%ba%ae%ef%bc%8c%e5%8a%9f%e8%83%bd%e6%9b%b4%e5%bc%ba%e5%a4%a7/">xhprof gui,讓xhprof界面更漂亮,功能更強大</a>

這篇文章主要介紹使用xhprof時的一些常見問題,和xhprof是如何實作性能分析的。

當你在一次請求中多次調用xhprof_enable方法,隻有第一次調用時進行的設定能生效。在調用xhprof_disable()後,你又可以使用xhprof_enable方法進行設定。

輸出内容為:

可見,列印的内容,并沒有cpu和memory的資訊。

ct 表示 調用的次數

wt 表示 函數方法執行的時間耗時。相當于,在調用前記錄一個時間,函數方法調用完畢後,計算時間差。

cpu 表示 函數方法執行消耗的cpu時間。和wt的差别在于,當程序讓出cpu使用權後,将不再計算cpu時間。通過調用系統調用getrusage擷取程序的占用cpu資料。

mu 表示 函數方法所使用的記憶體。相當于,在調用前記錄一個記憶體占用,函數方法調用完畢後,計算記憶體差。調用的是zend_memory_usage擷取記憶體占用情況。

pmu 表示 函數方法所使用的記憶體峰值。調用的是zend_memory_peak_usage擷取記憶體情況。

==&gt;表示一個調用關系。由于帶@,說明是一個遞歸調用。@後面的數字是遞歸調用的深度。

xhprof_enable提供了三個常量,用于設定你是否需要統計php内置函數,都統計那些名額。

三個常量如下:

設定這個常量後,将不統計php内置函數。畢竟php的内置函數性能一般都不錯。沒必要再消耗性能去統計。是以,建議設定。

設定這個常量後,會統計程序占用cpu時間。由于cpu時間是通過調用系統調用getrusage擷取,導緻性能比較差。開啟這個選項後,大概性能下降一半。是以,如果對cpu耗時不是特别敏感的情況下,建議不要啟用這個選項。

設定這個常量後,将會統計記憶體占用情況。由于擷取記憶體情況,使用的是zend_memory_usage和zend_memory_peak_usage,并不是系統調用。是以,對性能影響不大。如果需要對記憶體使用情況進行分析的情況下,可以開啟。

目前xhprof會對,加載php檔案,執行php函數方法,和執行eval方法進行性能資料記錄。正好,這些在php核心中,有對應的函數進行處理。當你調用xhprof_enable方法時,會把預設的方法替換為xhprof的方法。來看看相關代碼吧。

擷取時間時,為了性能,使用了彙編來擷取時間戳計數器。時間秒 = 時間戳計數器值 / cpu主頻。

正是這種實作,導緻目前xhprof還隻适用于x86架構。此外,因為rdtsc的資料不能在cpu間同步,是以,xhprof會将程序綁定在單個cpu上。

如果speedstep技術是打開的,xhprof的基于rdtsc定時器的功能就不能正常工作了。這項技術在某些英特爾處理器上是可用的。[注:蘋果桌上型電腦和筆記本電腦一般都将speedstep技術預設開啟。使用xhprof,您需要禁用speedstep技術。 ]