使用XHProf查找PHP性能瓶頸

m47g 9年前發布 | 33K 次閱讀 PHP開發 xhprof

原文  http://segmentfault.com/a/1190000003509917

 

XHProf是非死book 開發的一個測試php性能的擴展,本文記錄了在PHP應用中使用XHProf對PHP進行性能優化,查找性能瓶頸的方法。

安裝Xhprof擴展

$ wget http://pecl.php.net/get/xhprof-0.9.4.tgz
$ tar -zxvf xhprof-0.9.4.tgz 
$ cd xhprof-0.9.4
$ cd extension/
$ phpize
$ ./configure
$ make
$ sudo make install

修改php.ini

[xhprof]
extension=xhprof.so
xhprof.output_dir=/tmp

配置中xhprof.output_dir指定了生成的profile文件存儲的位置,我們將其指定為/tmp。

對PHP進行性能分析

在XHProf擴展中,一共提供了四個函數用于對PHP進行性能分析。

xhprof_enable/xhprof_sample_enable函數用于開始XHProf性能分析,區別在于前者功能更加強大,而后者則是是以簡單模式啟動性能分析(簡單記錄了函數的調用棧信息),開銷比較小。

xhprof_disable/xhprof_sample_disable函數用于停止性能分析,并返回分析的數據。

需要特別說明的函數是xhprof_enable,其他函數都是不需要提供參數的,而該函數則可以接受兩個可選的參數,用于改變該工具的行為。

void xhprof_enable ([ int $flags = 0 [, array $options ]] )
  • flags該參數用于為剖析結果添加額外的信息,該參數的值使用以下宏,如果需要提供多個值,使用|進行分隔。

    • XHPROF FLAGS NO_BUILTINS 跳過所有的內置函數

    • XHPROF FLAGS CPU 添加對CPU使用的分析

    • XHPROF FLAGS MEMORY 添加對內存使用的分析

  • options數組形式提供可選參數,在此處提供ignored_functions選項需要忽略的函數

比如下面的例子,同時對內存和CPU進行分析,并且忽略對call_user_func和call_user_func_array函數的分析。

xhprof_enable(
  XHPROF_FLAGS_MEMORY|XHPROF_FLAGS_CPU,
  [
    'ignored_functions' => [
      'call_user_func',
      'call_user_func_array'
    ]
  ]
);
// 這里是PHP代碼,比如業務邏輯實現等要被分析的代碼部分
....
$xhprofData = xhprof_disable();// $xhprofData是數組形式的分析結果
print_r($xhprofData);

注意,如果使用XHPROF_FLAGS_CPU選項對CPU占用也進行分析,在Linux環境下,會造成比較高的系統負載,因此不建議使用,而推薦只使用XHPROF_FLAGS_MEMORY,對內存的分析不會對系統造成太多負載。

形象化的查看分析結果

使用xhprof_disable完成性能分析并且獲取到分析結果之后,我們通常不會直接輸出結果,因為這樣的結果是以數組形式組織的,看起來并不直觀,幸運的是,xhprof提供了基于web的圖形界面對分析結果進行查看。

在使用之前,請先確保服務器安裝了graphviz工具,否則在生成監控圖表的時候回出現以下錯誤:

failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '

這里提示找不到dot命令,所以需要先安裝graphviz

$ sudo yum install graphviz

由于分析結果的查看工具是基于web的,因此,我們需要將xhprof安裝包中的 xhprof html xhproflib 目錄放到服務器的web目錄下,讓xhprof_html目錄中的內容對外可以訪問。

比如我的測試服務器環境是使用vagrant搭建的Cent OS,我見過這兩個目錄放到 /vagrant/xhprof 目錄下:

[vagrant@localhost xhprof]$ pwd
/vagrant/xhprof
[vagrant@localhost xhprof]$ ls
xhprof_html  xhprof_lib

web服務器使用的是Nginx,因此,在Nginx的配置文件nginx.conf中的配置如下:
server {
    listen       80;
    server_name  _;
    root /vagrant;
    ...

web服務器的根目錄是/vagrant,因此訪問地址為http://localhost/xhprof/xhprof_html/index.php.

當然,配置好環境之后,我們還是獲取不到分析結果的,因為我們在代碼中并沒有將分析結果保存到xhprof.output_dir指定的目錄中。

因此,我們需要修改我們的代碼,是其能夠將分析結果存放到xhprof.output_dir指定的目錄中。

....
$xhprofData = xhprof_disable();
require '/vagrant/xhprof/xhprof_lib/utils/xhprof_lib.php';
require '/vagrant/xhprof/xhprof_lib/utils/xhprof_runs.php';

$xhprofRuns = new XHProfRuns_Default();
$runId = $xhprofRuns->save_run($xhprofData, 'xhprof_test');

echo 'http://localhost/xhprof/xhprof_html/index.php?run=' . $runId . '&source=xhprof_test';

變量$runId是本次請求生成分析結果的id,最后我們輸出了一個鏈接地址,使用改地址就可以看到本次請求的分析結果。

使用XHProf查找PHP性能瓶頸

注意到中間的View Full Callgraph鏈接,通過該鏈接我們可以看到圖形化的分析結果。

使用XHProf查找PHP性能瓶頸

圖中紅色的部分為性能比較低,耗時比較長的部分,我們可以根據根據哪些函數被標記為紅色對系統的代碼進行優化

 本文由用戶 m47g 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!