作者:聂勇 欢迎转载,请保留作者信息并说明文章来源!
之前用PHP做互联网SNS应用,会定期进行性能分析,找出消耗时间最多的地方。通过对几款工具进行试验和对比后,采用了XHProf。XHProf是Facebook的开源项目,用于分析PHP应用运行性能的轻量级工具,开销很低,可以用在生产环境中。
一些新加入团队的同学,对XHProf不熟悉,因此业余时间编写了一个简明的教程,包括如何部署XHProf和读懂XHProf报告。
说明
- $PHP_HOME 表示PHP的安装目录。
- $XHPROF_UI_HOME表示xhprof ui的存放目录(自己选择一个目录即可,如:/home/nieyong/xhprof_ui)。
注:命令行和配置文件中如果包含上述两个变量需替换成实际的路径。
XHProf安装
1、下载XHProf源码并解压。
2、编译前预处理。
3、编译三步曲。
4、增加PHP配置。
在php.ini中配置extension 。
5、验证安装结果。
执行命令
输出结果类似如下:
[PHP Modules]
Core
……
xhprof
……
zlib
如果在[PHP Modules]下的扩展列表中出现了xhprof表示安装和配置成功。
Graphviz安装
1、方式一:编译源代码安装。
提示:用编译源代码的方式安装后,要将dot所在目录添加到环境变量PATH中。
2、方式二:二进制文件安装。
1)切换至root用户。
2)执行命令。
提示:在我的Redhat-5.7上用源代码编译安装没有成功,因为要依赖一堆其他组件以及版本兼容问题,安装非常麻烦,用yum方式简单快速。
XHProf UI配置
1、准备XHProf UI运行文件。
将xhprof-0.9.2.tgz解压后目录中的xhprof_html和xhporf_lib复制到$XHPROF_UI_HOME中。
2、在Nginx配置XHProf UI。
编写测试代码生成XHProf分析报告
1、编写测试代码xhprof_test.php。
2、运行测试代码并生成XHProf分析报告。
输出结果类似如下:
<a href=”http://127.0.0.1:9090/index.php?run=4eface3370442&source=hello“ target=”_blank”>Profiler output</a>
3、查看XHProf分析报告。
在浏览器上输入地址:http://127.0.0.1:9090/index.php?run=4eface3370442&source=hello
显示界面类似如下:
点击[View Full Callgraph]链接,显示方法的调用关系树,如下图:
提示:生成方法调用关系图由Graphviz生成。
如何看懂XHProf分析报告
如图1所示,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峰值百分比。 |