我们晓得一旦站点慢下来之后有很多原因,假如站点是LNMP结构,我们可以从Nginx,PHP,Mysql三部分去找原因(当然排除负载和外部设备问题),在PHP这块我们有个慢日志,终究可视化度没有那么高,如何快速追踪到瓶颈呢?
xhprof是facebook开源出来的一个php轻量级的性能分析工具,跟Xdebug类似,但性能开销更低,还可以用在生产环境中,也可以由程序开 关来控制是否进行profile。
Graphviz由一种被称为DOT语言的图形描述语言,可以根据提供的节点以及线生成图形。 xhprof 是可以使用graphviz生成图片的,这样分析的php程序运行过程更加直观。 如果你是centos系统,那么graphviz可以直接通过yum安装,否则就需要源码编译,源码编辑会非常困难,依赖的东西太多了。
wget http://pecl.php.net/get/xhprof-0.9.2.tgz
tar zxvf xhprof-0.9.2.tgz
cd xhprof-0.9.2/
cp -r xhprof_html xhprof_lib /data/web/ #/data/web/为你站点的根目录
cd extension/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
cp modules/xhprof.so /usr/local/php/ext/ #这里假设你的php扩展模块目录在/usr/local/ext/下,这个目录,你可以根据这个命令查找:/usr/local/php/bin/php -i |grep '^extension_dir'
vim /usr/local/php/etc/php.ini #加入如下配置:
[xhprof]
extension=xhprof.so
xhprof.output_dir=/data/web/xhprof_data
#其中/data/web/是你的网站根目录,xhprof_data目录需要自己手动创建,并赋予777权限
创建目录,更改权限
mkdir /data/web/xhprof_data
chmod 777 !$
重启apache或者重启php-fpm
更改要分析的php程序,假如你要分析的php程序为 index.php ,则在index.php中加入如下内容:
在顶部加入:
xhprof_enable();
//xhprof_enable(XHPROF_FLAGS_NO_BUILTINS); 不记录内置的函数
//xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); 同时分析CPU和Mem的开销
$xhprof_on = true;
在底部加入:
// stop profiler
$xhprof_data = xhprof_disable();
//
// Saving the XHProf run
// using the default implementation of iXHProfRuns.
//
include_once "./xhprof_lib/utils/xhprof_lib.php";
include_once "./xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
// Save the run under a namespace "xhprof_foo".
//
// **NOTE**:
// By default save_run() will automatically generate a unique
// run id for you. [You can override that behavior by passing
// a run id (optional arg) to the save_run() method instead.]
//
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");
echo "---------------\n".
"Assuming you have set up the http based UI for \n".
"XHProf at some address, you can view run at \n".
"http://yourdomain/xhprof_html/index.php?run=$run_id&source=xhprof_foo\n".
"---------------\n";
yum install -y graphviz
主要的:
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% 峰值百分比
xhprof查看性能测试图一直报错:failed to execute cmd: ” dot -Tpng”多种因素解决方案
最近在新环境进行php代码性能测试,用了xhprof这个工具,搭建好以后,点击[View Full Callgraph]查看性能分析图链接一直报错:failed to execute cmd: ” dot -Tpng”
原因一:未安装graphviz
原因二:php.ini设置了禁用proc_open方法