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

xhprof实战

2、tar -zvxf xhprof-0.9.4.tgz 

3、cd extension/

4、phpize

xhprof实战

5、./configure --with-php-config=/usr/local/php/bin/php-config

xhprof实战

6、make && make install

7、修改php.ini,增加xhprof扩展

xhprof实战

xhprof.output_dir指定概要分析文件的存放路径。

8、重启php-fpm,安装完成后,通过phpinfo查看是否安装成功。

xhprof实战

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、安装虚拟站点

xhprof实战

5、为了ip访问,修改下站点的配置文件,指定端口号,如1011,如下图。

xhprof实战

ok,虚拟域名配置完毕。

项目集成XHprof

其实网上有关集成XHprof的文章一大堆,也比较简单,主要就是在文件头和底部引入特定的代码即可。我的项目是用thinkphp5开发的,下面就以thinkphp5项目为例,讲解如何集成XHprof。

1、在application/config.php中指定xhprof的相关配置信息,以便更方便的动态管理xhprof

xhprof实战

enable:true表示打开概要分析,false则关闭

name:项目profile名称,不同的项目需设定为不同的名称

code:安全码

domain:概要分析结果域名,就是上面配置的那个域名和端口号

2、在application/tags.php配置行为扩展文件

xhprof实战

3、application/commo/behavior/XhprofEnable.php

xhprof实战

4、3、application/commo/behavior/XhprofDisable.php

xhprof实战

至此,集成完毕,下面验证下成果。

直接访问http://你的项目/??DEBUG_PROFILE=1&code=config中配置的code码,如果出现以下画面则说明集成成功了。

xhprof实战

你可以点击查看概要结果看到分析报告,如下:

xhprof实战

并且,你可以访问http://xhprof项目的虚拟域名/xhprof_html/index.php查看目前生成的所有概要分析报告。

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峰值百分比。

并且页面可以点击对应的头部指定排序方式。

还可以在页面上点击xhprof实战查看调用图,更为直观。

注意,调用图需要在服务器上安装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