xhprof:php性能分析的利器

xhprof 工具安装

工欲善其事,必先利其器,xhprof是Facebook开源的轻量级PHP性能分析工具,它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况。一个函数的开销,可细分成调用者和被调用者的开销,XHProf数据收集阶段,它记录调用次数的追踪和包容性的指标弧在动态callgraph的一个程序。

这个工具可以大大提高性能优化, 工程师获取项目问题所在,从而开始优化。

安装过程如下:

下载安装

安装 xhprof

cd /usr/local/src
wget http://pecl.php.net/get/xhprof-0.9.4.tgz
tar -zxvf xhprof-0.9.4.tgz
cd xhprof-0.9.4/extension/
phpize (需要安装 php5-dev: apt-get install php5-dev)
./configure
make
make install
make test

安装 graphviz

apt-get install graphviz

配置 php.ini

echo "extension=xhprof.so" > /etc/php5/mods-available/xhprof.so
echo "xhprof.output_dir = /tmp/xhprof" >> /etc/php5/mods-available/xhprof.so
cd /etc/php5/fpm/conf.d/
ln -s ../../mods-available/xhprof.so 20-xhprof.so
service php5-fpm restart

配置 查看站点

git clone https://github.com/nosun/xhprof /data/www/xhprof.app

nginx 添加站点
    server {
        listen       80;
        server_name  xhprof.app;
        index index.php index.html;
        root  /data/www/xhprof.app/public;

        error_log /data/logs/nginx/xhprof_nginx_error.log info;

        # This is only needed when using URL paths
        try_files $uri $uri/ /index.php;

        location ~ \.php$ {
            fastcgi_pass   unix:/var/run/php5-fpm.sock;
            include        fastcgi_params;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        }
    }
填写配置文件

将目录下的 config.inc.example.php 修改为 config.inc.php。
里面的闭包函数,可以根据您的测试条件修改为您需要的。

埋点

修改auto_prepend_file配置

auto_prepend_file = /data/www/xhprof.app/inc/inject.php

这样所有的php-fpm请求的php文件前都会自动注入 /data/www/xhprof.app/inc/inject.php 文件

如果使用Nginx的话,还可以通过Nginx的配置文件设置,这样侵入性更小,并且可以实现基于站点的注入。

fastcgi_param PHP_VALUE "auto_prepend_file=/data/www/xhprof.app/inc/inject.php";

测试

在您的站点的nginx 配置中,或者php.ini中增加auto_prepend_file埋点,重启站点,nginx 和 fpm.
访问您需要测试的站点。
访问 http://xhprof.app,查看结果。

xhprof 主要参数

Inclusive Time (或子树时间):包括子函数所有执行时间。
Exclusive Time/Self Time:函数执行本身花费的时间,不包括子树执行时间。
Wall时间:花去了的时间或挂钟时间。
CPU时间:用户耗的时间+内核耗的时间

xhprof 参数解释

Inclusive Time (或子树时间):包括子函数所有执行时间。
Exclusive Time/Self Time:函数执行本身花费的时间,不包括子树执行时间。
Wall时间:花去了的时间或挂钟时间。
CPU时间:用户耗的时间+内核耗的时间
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% 峰值百分比