xhprof实战
前言
性能分析是衡量应用程序在代码级别的相对性能。性能分析将捕捉的事件包括:CPU的使用,内存的使用,函数的调用时长和次数,以及调用图。性能分析的行为也会影响应用性能。
在 PHP 世界里,有两个截然不同的的性能分析器——主动和被动。
主动 VS 被动性能分析
主动分析器在开发过程中使用,由开发人员启用。主动分析器收集的信息比被动分析器多,对性能的影响更大。通常,主动分析器不能用在生产环境中。XDebug 就是一种主动分析器。
因为无法在生产环境中使用主动分析器,Facebook 推出了一个被动分析器——XHProf。XHProf 是为了在生产环境中使用而打造的。它对性能的影响最小,同时收集足够的信息用于诊断性能问题。
XDebug适用于开发环境,XHprof更适用于生产环境。
安装XHprof
安装环境:centos7+lnmp集成环境。
1、wget http://pecl.php.net/get/xhprof-0.9.4.tgz
2、tar -zvxf xhprof-0.9.4.tgz
3、cd extension/
4、phpize
5、./configure --with-php-config=/usr/local/php/bin/php-config
6、make && make install
7、修改php.ini,增加xhprof扩展
xhprof.output_dir指定概要分析文件的存放路径。
8、重启php-fpm,安装完成后,通过phpinfo查看是否安装成功。
ok,安装成功。
配置虚拟站点访问概要分析报告
网上很多教程都是将xhprof的库文件移动到项目的根目录下,但是这种方式,每个项目都需要单独的库文件,如果一台服务器上有多个项目,可以考虑把xhprof的库文件单独放一个项目,所有项目的概要分析报告都放在这个项目上,通过制定不同的命名来区分项目。这样,就可以通过访问类似http://域名:端口号/xhprof_html/index.php?run=5b0668d0bceb8&source=命名来查看概要报告了。下面,开始搭建虚拟站点。
注意:我所有的项目都是放在home/wwwroot下,那么我可以把xhprof项目也放在此目录下。
1、cd /home/wwwroot
2、mkdir xhprof:新建xhprof目录,放xhprof库文件
3、将之前解压的xhprof-0.9.4.tgz中的xhprof_html和xhprof_lib复制到xhprof目录下
cd xhprof;
cp -r 之前解压缩的xhprof-0.9.4目录/xhprof_html ./
cp -r 之前解压缩的xhprof-0.9.4目录/xhprof_lib ./
4、安装虚拟站点
5、为了ip访问,修改下站点的配置文件,指定端口号,如1011,如下图。
ok,虚拟域名配置完毕。
项目集成XHprof
其实网上有关集成XHprof的文章一大堆,也比较简单,主要就是在文件头和底部引入特定的代码即可。我的项目是用thinkphp5开发的,下面就以thinkphp5项目为例,讲解如何集成XHprof。
1、在application/config.php中指定xhprof的相关配置信息,以便更方便的动态管理xhprof
enable:true表示打开概要分析,false则关闭
name:项目profile名称,不同的项目需设定为不同的名称
code:安全码
domain:概要分析结果域名,就是上面配置的那个域名和端口号
2、在application/tags.php配置行为扩展文件
3、application/commo/behavior/XhprofEnable.php
4、3、application/commo/behavior/XhprofDisable.php
至此,集成完毕,下面验证下成果。
直接访问http://你的项目/??DEBUG_PROFILE=1&code=config中配置的code码,如果出现以下画面则说明集成成功了。
你可以点击查看概要结果看到分析报告,如下:
并且,你可以访问http://xhprof项目的虚拟域名/xhprof_html/index.php查看目前生成的所有概要分析报告。
概要报告字段含义
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峰值百分比。
并且页面可以点击对应的头部指定排序方式。
还可以在页面上点击查看调用图,更为直观。
注意,调用图需要在服务器上安装graphviz,否则页面会报错。
//红帽系列 yum install graphviz //Ununtu apt-get install graphviz //OS X brew install graphviz
安装完扩展后,需要修改php.ini,在disable_functions中把proc_open去掉。
参考文档:
PHP性能分析介绍:XHprof&XHGui,http://blog.oneapm.com/apm-tech/235.html
XHprof安装和使用,http://www.lanecn.com/article/main/aid-58
XHprof报告字段含义,https://blog.****.net/wide288/article/details/50427438
XHprof报告性能图报错,https://blog.****.net/jo_andy/article/details/78526487