使用XHProf查找PHP性能瓶頸

XHProf是facebook 開發的一個測試php性能的擴展,本文記錄了在PHP應用中使用XHProf對PHP進行性能優化,查找性能瓶頸的方法。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.inihtml

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

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

對PHP進行性能分析

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

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

xhprof_disable/xhprof_sample_disable函數用於中止性能分析,並返回分析的數據。數組

須要特別說明的函數是xhprof_enable,其餘函數都是不須要提供參數的,而該函數則能夠接受兩個可選的參數,用於改變該工具的行爲。性能優化

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

    • XHPROFFLAGSNO_BUILTINS 跳過全部的內置函數服務器

    • XHPROFFLAGSCPU 添加對CPU使用的分析markdown

    • XHPROFFLAGSMEMORY 添加對內存使用的分析

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

好比下面的例子,同時對內存和CPU進行分析,而且忽略對call_user_funccall_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安裝包中的xhprofhtmlxhproflib目錄放到服務器的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,最後咱們輸出了一個連接地址,使用改地址就能夠看到本次請求的分析結果。

注意到中間的View Full Callgraph連接,經過該連接咱們能夠看到圖形化的分析結果。

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

相關文章
相關標籤/搜索