使用xhprof进行性能分析

XHProf 简介

XHProf 是一个轻量级的分层性能测量分析器。 可以追踪一个请求程序内部各函数的调用次数,消耗时间以及资源占用等信息,是我们进行性能分析的利器。[^1]

[^1]: 具体介绍见 PHP官方文档

XHProf 安装

首先要安装个extension xhprof.so 并且配置启用,由于我用的环境默认带了,这里不具体描述

装完so之后还要down下xhprof的php lib 文件,可以直接

1
git clone https://github.com/phacility/xhprof.git

把这个目录丢到webroot里面(便于之后访问分析结果文件)或者其他地方都行

XHProf 使用

主要是在需要进行性能分析的地方 include xhprof的代码,enable 然后disable下,记录下调用情况;AP程序可以残暴点 直接写在index.php 里面,具体示例代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
//your code
//$objResponse = $objApplication->bootstrap()->run();
$data = xhprof_disable(); //返回运行数据

// xhprof_lib在下载的包里存在这个目录,记得将目录包含到运行的php代码中
$XHPROF_ROOT = __DIR__ . '/../vendor/facebook/xhprof/'; //设置成自己的地址
include_once $XHPROF_ROOT . '/xhprof_lib/utils/xhprof_lib.php';
include_once $XHPROF_ROOT . '/xhprof_lib/utils/xhprof_runs.php';
$objXhprofRun = new XHProfRuns_Default();
// 第一个参数j是xhprof_disable()函数返回的运行信息
// 第二个参数是自定义的命名空间字符串(任意字符串),
// 返回运行ID,用这个ID查看相关的运行结果
$run_id = $objXhprofRun->save_run($data, "xhprof");
//var_dump($run_id);
echo "http://localhost/xhprof/xhprof_html/index.php?run={$run_id}&source=xhprof_testing\n"

XHProf结果分析

直接在浏览器里面打开xhprof_html的页面,如果不是用web服务器配置的话,可以简单点直接在xhprof 同层目录里面 php -S 0.0.0.0:8888 然后访问 http://hostname:8888/xhprof/xhprof_html/

下面是页面中各字段解释:
我主要用于速度调忧,所以看的比较多的是前几个,调用次数 消耗时间等另外可以看看生成的graph 函数的调用逻辑以及消耗时间,帮助定位问题

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