XHProf是一个轻量级PHP性能分析工具,类似 xdebug,但比 xdebug 分析的信息更加详细, 包括函数的调用次数,花费的时间(自身花费时间和包含内部函数花费的时间),所占内存/CPU,所占内存的峰值及所占百分比等, 为什么用的是等呢,因为源码包中 xhprof_lib/display/xhprof.php 文件里还有一个 Incl. User (microsecs) 和 Incl. Sys (microsec) 没有在结果中显示,有兴趣的同学可以研究研究。
安装
$ wget https://github.com/facebook/xhprof/tarball/master -O xhprof.tar.gz$ tar zxf xhprof.tar.gz
$ cd facebook-xhprof-b8c76ac/extension/# phpize# ./configure --with-php-config=`/path/to/php-config`# make && make install# make test# vi /etc/php.d/xhprof.ini; 内容为:extension = xhprof.so; 注意:output_dir 必须存在且可写xhprof.output_dir = /tmp/xhprof# service php-fpm restart 或 service httpd restart
当然也可以使用 yum install php-pecl-xhprof 安装, 但是源码包中 xhprof_html 和xhprof_lib 这两个文件夹是需要的,见 使用 web 界面。
简单使用
现在运行下例子看下效果:
$ php -f facebook-xhprof-b8c76ac/examples/sample.php 输出结果略。
输出结果中的含义:
ct 函数调用次数,wt 花费的时间,cpu 花费的 CPU 时间(微秒即百万分之一秒),mu 使用的内存(bytes),pmu 使用的内存峰值(bytes)。xhprof_enable 参数
还可以给 xhprof_enable() 传入:
XHPROF_FLAGS_CPU 分析结果中添加 CPU 数据XHPROF_FLAGS_MEMORY 分析结果中添加内存数据XHPROF_FLAGS_NO_BUILTINS 跳过 PHP 内置函数 三个参数中的一个或多个,类似这样:
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS);xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);使用 web 界面
但这样的输出结果在程序较大时对于我们没有实际意义, 在 xhprof 源码包中提供了xhprof_html 和 xhprof_lib 两个文件夹是使用 PHP 开发,用于显示 xhprof 分析结果的 web 界面, 比上例输出结果更加详细易读。
$ mkdir /var/www/html/xhprof
$ mv xhprof_html/ xhprof_lib/ examples/ /var/www/html/xhprof/$ cd /var/www/html/$ vi xhprof/examples/sample.php将 `` 替换为 `localhost/xhprof/xhprof_html`
/var/www/html 为 DOCUMENT_ROOT 目录。
测试一下,浏览器运行:
http://localhost/xhprof/examples/sample.php 而浏览器输出的内容最后有一个类似这样的链接地址:
http://localhost/xhprof/xhprof_html/index.php?run=50ec187a72aa9&source=xhprof_foo /tmp/xhprof 目录下会多出一个类似于 50ec187a72aa9.xhprof_foo.xhprof 的文件, 此文件用于存储 xhprof 分析结果的数据信息,作为上述 url 地址的数据来源。
打开这个链接即是 xhprof 的 web 分析结果页面。 这个页面提供了:
Calls:函数的调用次数Incl. Wall Time (microsec) :包含内部函数花费的时间,单位微秒Excl. Wall Time (microsec):不包含内部函数花费的时间,单位微秒及所占百分比(%)注:Incl.:为 Including 包含的简写Excl.:为 Excluding 不包含的简写Wall Time:意为挂钟时间即任务花费的时间 根据此结果页简单解释下 Function Name 列:
main():一个虚构的函数,程序根节点bar@2:递归调用 2 次 另外 load::filename 和 run_init::filename 是跟踪 PHP 的 include/require 操作。
在此结果中 strlen 和 xhprof_disable 为 PHP 内置函数,如果我们想跳过内置函数不作分析, 并且统计 CPU 和内存使用信息怎么办呢,上面提到过 xhprof_enable 参数, 修改xhprof/examples/sample.php 文件看一下:
将 xhprof_enable(); 行,替换为xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY); 刷新下页面,再次打开页面最后的 url,这次提供的信息就十分详细了。
Incl. CPU (microsecs):包含内部函数 CPU 花费的时间,单位微秒Excl. CPU (microsec):不包含内部函数 CPU 花费的时间,单位微秒Incl. MemUse (bytes):包含内部函数所占内存,单位字节Excl. MemUse (bytes):不包含内部函数所占内存,单位字节Incl. PeakMemUse (bytes):包含内部函数所占内存峰值,单位字节Excl. PeakMemUse (bytes):不包含内部函数所占内存峰值,单位字节及所占百分比(%)可以认为共三种情况:1. 包括内部函数2. 不包括内部函数或者说函数本身3. 所占总数(时间或内存使用)的百分比 peak 意为峰值,这里的 CPU 花费时间为什么是 0 呢, 再修改下xhprof/examples/sample.php 文件看一下:
将 foo() 函数中的 for 循环条件 $idx < 5 改为 50 再看一下 web 分析页面结果,CPU 时间出来了。
安装 graphviz
分析结果页中有一个挺明显的 View Full Callgraph 链接, 这个链接是查看整个程序的函数调用流程。使用 graphviz 生成。
# yum install graphviz 编译安装请注意先安装 libpng 依赖。
参考
net tuts+:http://net.tutsplus.com/tutorials/php/advanced-codeigniter-profiling-with-xhprof/源码包中的:xhprof_html/docs/index.html
http://www.162cm.com/p/xhprofdoc.html
转载请注明出处。 本文地址:http://blog.aboutc.net/php/17/php-profiler-xhprof
目录
导言
XHProf概况
术语表
特殊函数的命名约定
限制
安装XHProf扩展
使用XHProf来做性能分析
设置XHProf用户界面
在生产环境中使用XHProf的注意 事 项
轻量级采样模式
附加功能
依赖性
鸣谢
作者这样介绍自己:
翻译:徐仁禄
原文地址:
初次翻译,大部分是google translate tookit工具给翻的,稍微修改了下。如遇错误,还请来信指出。谢谢!
内容如下:
目录
导言
XHProf 概况
安装XHProf扩展
使用XHProf进行性 能分析
设 置XHProf用户界面
在生产环境中使用 XHProf注意事项
轻量级采样模式
附加功 能
信赖
鸣 谢
导言
XHProf是一个分层PHP性能分析工具。它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情 况。一个函数的开销,可细分成调用者和被调用者的开销。原始数据收集部分是用纯C实现的,是一个名叫xhprof 的 Zend扩展 。XHProf有一个简单的HTML的用户界面( PHP写成的)。基于浏览器的性能分析用户界面能更容易查看,或是与同行们分享成果。也能绘制调用关系图。
XHProf报告往往可以有助于理解被执行的代码的结构。的等级性质的报告可用来确定,例如,什么链要求导致了所谓的特殊 功能得到。
XHProf可以比较两次运行的结果(又名“差异报告”)或是从多次运行得到的汇总数据。差异和汇总报告,就像单一运行报 告一样,也提供“平板”以及“分层”的性能分析视图。
XHProf是一种轻量级的性能分析工具。在数据收集阶段,它记录调用次数的追踪和包容性的指标弧在动态 callgraph的一个程序。它独有的数据计算的报告/后处理阶段。在数据收集时,XHProfd通过检测循环来处理递归的函数调用,并通过给递归调用 中每个深度的调用一个有用的命名来避开死循环。
XHProf的轻量级性质和汇聚功能,使得它非常适合用于收集“生产环境”的性能统计数据的统计。[见用于生产环境的补充 说明。 ]
例如,XHProfLive (不属于开源的工具包),是Facebook使用的一个全系统的性能监测系统,建立在XHProf的基础之上 。 XHProfLive不断收集函数级别的Profiler资料,这些资料来自生产环境中运行中的示例页面[用xhprof来收集] 。然后XHProfLive汇总指定的时候,页面类型,来取得各个页面的性能数据,可以帮助解决各种问题,如:特定的某个网页的函数级的性能情况怎样?在 所有网页中,或者对某一具体的网页,foo 函数的开销如何?在过去的一小时/天/周中,哪些函数返回的次数最多?某个页面/函数的执行时间的变化趋势如何?等等。
由Facebook最初开发的XHProf在2009年3月开放源代码。
XHProf概况
XHProf提供的功能:
load::lib/common.php - 内核加载和编译文件的工作。[注:如果您使用的了PHP的opcode 缓存比如APC之类的,只有当缓存失效时才会去编译。
run_init::lib/common.php -由于包含操作引起的初始化操作等。
哪些函数调用了指定的函数,各自调了多少次?
一个特定的函数调用了哪些函数?
在被一个特定的函数调用时,某个函数一共耗去了多少时间 。
扁平的性能概要 (截 图 )
提供函数级别的性能信息,例如调用次数,其中包括/独家壁时间,内存使用情况,和CPU时间。
分层剖析(父/ 子{0视图){/0} ( 截 图 )
对每一个函数,它提供了一个断点,个崩溃的要求和时间每母公司(来电)和儿童(被调用) ,如:
差异报告
出于各种原因,您可能需要比较从两个XHProf运行中得到的数据-找出是什么造成了从一个版本到另一个版本的退 步,或是评估您将要做的优化的性能提升。
阿差异报告考虑两分,作为输入,并提供两个平面功能级别差异的信息,和层次信息(细目差异的父母/儿童职能)的每 个功能。
差异报告里的“平板”视图指出了最主要的退步或改进。
点击差异报告平板视图中的函数,进入“层次”(或父/子)视图。我们可以得到的具体的父子函数的差异。
Callgraph视图
性能数据也可以通过callgraph视图来查看 。callgraph 会高亮显示程序的关键路径。
内存剖析
XHProf的内存剖析模式能有助于跟踪那些申请大量内存的函数。
值得澄清的是,XHProfu并不严格跟踪所有分配/释放内存的操作。相反,它使用了一种简化思路。他记录了每个 函数进入和结束后的内存的增减。它还记录每个函数分配内存的峰值的变化。
XHProf记录include, include_once, require and require_once require_once操作,就像他们是函数一样。那些被包含文件的名字被用来产生假的函数 的名字。
术语表
特殊函数的命名约定
限制
真正的层次剖析器会在每一个数据采集点记录完全的调用堆栈。接下来,能够回答这些问题,如:第三次foo()调用 的开销是多少?或是当调用栈是a()->b()->bar()时bar()函数的开销是多少?
XHProf只记录一级的调用上下文,因此只能回答关于一级一级函数调用的问题。事实证明,在实践中这是最主要的 利用情况。
为了使这个更具体,看看下面的例子。
假设你有:
1 call from a() --> c()
1 call from b() --> c()
50 calls from c() --> d()
虽然XHProf可以告诉你, d()被c()调用了50次,却不能告诉你,有多少次分别是由a()和b()引起的。[我们可以推测,也许有25次是因为a(),有25次是由于b(), 但未必如此。 ]
然而在实践中,这没什么大不了。
main() :一个虚构的函数,这是所有调用的根节点。
load:: 和 run_init:::
XHProf 跟踪PHP的include/require操作,和跟踪函数调用一样。
例如, include “lib/common.php"; 操作看起来像调了两个XHProf函数:
foo@ :意味着这是一个foo()函数的递归调用。代表递归深度。递归可能是直接的,(比如由于foo() --> foo() ) ,也可能是间接的(如由于foo()-> goo() ->foo()。
Inclusive Time (或子树执行时间) :[包括子树执行时间的所有执行时间。]
Exclusive Time/Self Time :[函数执行本身的时间花费。]不包括子树执行时间。
Wall时间 :又名经过的时间或挂钟时间。
CPU时间 : CPU时间在用户空间+ CPU时间在内核空间
安装XHProf扩展这个扩展在"extension"子目录里。注:Windows的版本还没有实现。目前我们已经在Linux/FreeBSD 上测试了xhprof。0.9.2及以上版本的XHProf也正计划着移植到Mac OS下。[我们在Mac OS 10.5下测试过。]注: XHProf使用RDTSC指令(时间戳计数器)来实现一个真正的低资源消耗的计数器[针对elapsed time]。因此目前xhprof还 只适用于x86架构。此外,因为RDTSC的数据不能在CPU间同步,在剖析时xhprof会将程序绑定在单个 的CPU。如果SpeedStep技术是打开的,XHProf的基于RDTSC定时器的功能就不能正 常工作了。这项技术在某些英特尔处理器上是可用的。[注:苹果台式机和笔记本电脑一般都将SpeedStep技术预设开启。使用XHProf,您需要禁用 SpeedStep技术。 ]下面的步骤,应该在Linux / Unix环境下进行。% cd /extension/
% phpize
% ./configure --with-php-config=
% make
% make install
% make testphp.ini文件 :您可以更新您的php.ini文件来自动加载您的扩展。将以下内容添加到你的php.ini文件。[xhprof]
extension=xhprof.so
;
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
;
xhprof.output_dir= 使用XHProf来做性能分析用下面的示例程序来试着产生一些原始的性能数据:foo.php
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com