背景
最近在做关于项目的接口性能优化的相关工作,于是想到了Xhprof,决定把它用在现有项目中,观察下接口的调用情况。
xhprof是一个函数级别的分层PHP性能分析工具,xhprof能统计每个函数的调用次数,cpu使用时间内存占用等多项指标,它将函数的开销,细分为调用者和被调用者的开销。展示页面基于浏览器非常人性化,分为两个性能报告页面,一个是报表格式的一个是直观化的图表格式。根据这些分析数据,可以轻松的看到程序的开销情况,找出低效率的程序进行优化。
在安装的过程中,踩了一些坑,总结一下经验。
注:对于应该不应该将XHProf部署到生产环境,还不知晓,但是官方说可以,但是最好是采样模式(1/1000请求)进行尝试,以降低服务器资源开销。
安装PHP的xhprof扩展
从官网下载的安装包(wget http://pecl.php.net/get/xhprof-0.9.2.tgz),安装的过程中,make && make install会有[xhprof.lo] Error 1的报错。
所以这里建议在github下载安装:
|
|
在安装完成之后,可通过 php –ri xhprof 查看是否安装成功。
|
|
此时说明扩展已经安装成功
安装Graphviz
将XHProf的分析报告以程序的函数调用图来展现。
|
|
如加上–prefix编译参数,将安装完的主目录中的bin目录路径加入到环境变量PATH中,另外需要注意的如果通过XHProf提供的PHP UI界面查看函数调用图,需要将PHP的proc_open类的函数打开。
运行Xhprof
在服务器或本地的web目录下,新建xhprof目录,然后将下载的xhprof项目的xhprof_html、xhprof_lib、examples放到新建的xhprof中。
|
|
在根目录下在创建目录,用来存放分析结果:
|
|
然后在Nginx及FPM增加以下配置:
|
|
安装完成后,需要重启nginx及php-fpm:
|
|
在浏览器中输入:
http://xhprof.dev/examples/sample.php,有如下的结果:
|
|
在/usr/local/var/www/xhprof/output下生产下面的文件:
|
|
选择生产的id,在浏览器中可观察运行分析结果:
http://xhprof.dev/xhprof_html/?run=58ec4c6a1876f&symbol=Fw%5CApp%3A%3Arun
项目使用
由于使用的公司项目,但是思路都差不多:
|
|
变量$run_id是本次请求生成分析结果的id,最后我们输出了一个链接地址,使用改地址就可以看到本次请求的分析结果。
结果报告:
关系调用:
图中红色的部分为性能比较低,耗时比较长的部分,我们可以根据根据哪些函数被标记为红色对系统的代码进行优化。
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峰值百分比。
可以根据上述字段查找自己要看的数据,然后进行优化
其他
可使用xhgui/xhprof.io等工具来分析xhprof结果。
参考资料
xhprof地址 https://github.com/facebook/xhprof
xhprof手册 http://php.net/xhprof
xhprof.io https://github.com/gajus/xhprof.io
xhgui https://github.com/perftools/xhgui
oneapm http://www.oneapm.com/