xhprof+Graphviz性能分析

:-}

下载扩展

该 xhprof扩展版本是从 https://github.com/longxinH/xhprof 获取的(第三方的一个库,官方版本不支持php7)

git clone https://github.com/longxinH/xhprof

安装扩展

php的扩展安装都是这三步

cd xhprof/extension/
phpize
./configure 
make
make install

修改php.ini配置

其中 xhprof.output_dir 是 xhprof 的输出目录,每次执行 xhprof 的 save_run 方法时都会生成一个 run_id.project_name.xhprof 文件。这个目录在哪里并不重要。注意此路径的权限要可读写!!否则文件无法生成成功

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

重启 php-fpm

sudo service php7.1-fpm restart

性能测试

在需要测试的代码开头和结尾处添加统计代码

<?php
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

// 要检查性能的代码

$xhprof_data = xhprof_disable();
include_once '/var/www/html/xhprof/xhprof_lib/utils/xhprof_lib.php';
include_once '/var/www/html/xhprof/xhprof_lib/utils/xhprof_runs.php';
$xhprof_runs = new \XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, 'your_project');

查看生成报告

需要访问:xhprof/xhprof_html/index.php文件查看:

http://localhost/xhprof/xhprof_html/index.php?run=5b35d3dfa8c29&source=your_project
//run后的参数为$run_id,source参数为your_project配置的名字

安装graphviz插件

安装Graphviz的目的是为了xhprof图形化web工具查看profiling log文件

方式一:

sudo apt-get install graphviz

方式二:

sudo wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.28.0.tar.gz
sudo tar -zxvf graphviz-2.28.0.tar.gz
sudo cd graphviz-2.28.0
sudo ./configure
sudo make
sudo make install

方式三:

brew install graphviz //macbook

安装完成后,会生成/usr/local/bin/dot文件,确保路径在PATH环境变量里,以便XHProf能找到它,graphviz处于/usr/local/lib/graphviz。

sudo vi ~/.bash_profile
sudo source ~/.bash_profile
echo $PATH

看看输出里面是不是已经有了/usr/local/bin/dot这个路径了。

报错处理

 Notice: Undefined variable: pipes in /home/www/phpsite/pt/xhprof_lib/utils/callgraph_utils.php on line 112 Warning:proc_open() has been disabled for security reasons in /home/www/phpsite/pt/xhprof_lib/utils/callgraph_utils.php on line 112 failed to execute cmd " dot -Tpng"


vi /usr/local/php/etc/php.ini
//找到disable_functions,把proc_open()从disable_functions列表中去掉。

看懂XHProf分析报告










































列名



描述



Function Name



方法名称。



Calls



方法被调用的次数。



Calls%



方法调用次数在同级方法总数调用次数中所占的百分比。



Incl.Wall Time


(microsec)



方法执行花费的时间,包括子方法的执行时间。(单位:微秒)



IWall%



方法执行花费的时间百分比。



Excl. Wall Time


(microsec)



方法本身执行花费的时间,不包括子方法的执行时间。(单位:微秒)



EWall%



方法本身执行花费的时间百分比。



Incl. CPU


(microsecs)



方法执行花费的CPU时间,包括子方法的执行时间。(单位:微秒)



ICpu%



方法执行花费的CPU时间百分比。



Excl. CPU


(microsec)



方法本身执行花费的CPU时间,不包括子方法的执行时间。(单位:微秒)



ECPU%



方法本身执行花费的CPU时间百分比。



Incl.MemUse


(bytes)



方法执行占用的内存,包括子方法执行占用的内存。(单位:字节)



IMemUse%



方法执行占用的内存百分比。



Excl.MemUse


(bytes)



方法本身执行占用的内存,不包括子方法执行占用的内存。(单位:字节)



EMemUse%



方法本身执行占用的内存百分比。



Incl.PeakMemUse


(bytes)



Incl.MemUse峰值。(单位:字节)



IPeakMemUse%



Incl.MemUse峰值百分比。



Excl.PeakMemUse


(bytes)



Excl.MemUse峰值。单位:(字节)



EPeakMemUse%



Excl.MemUse峰值百分比。