入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

Xhprof----facebook开源的,轻量级的PHP性能分析工具

创建时间:2015-09-02 投稿人: 浏览次数:939

PHP性能监控测试---XHProf介绍

您的评价:        收藏该经验    

阅读目录

  • 术语表
  • 特殊函数的命名约定
  • 限制

Xhprof----facebook开源的,轻量级的PHP性能分析工具: 包括函数的调用次数,花费的时间(自身花费时间和包含内部函数花费的时间),所占内存/CPU,所占内存的峰值及所占百分比

这个真的是灰常的好用可以非常快的知道性能瓶颈在哪个文件的哪个函数,然后针对性的做优化:给个截图具体说明20140314111821062.jpg

 

这是业务管理的部分,从路线图中黄色和红的检测的过程中发现,这个函数竟然掉了99次数据库,查看源代码,竟然有连表查询,然后查询放到了foreach中,导致了很多次小的查询。接下来就剩下针对性的优化了。

  1. 导言

    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月开放源代码。

  2. 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 2 3 4 5 假设你有:    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(), 但未必如此。 ]

      然而在实践中,这没什么大不了。

    1. main():一个虚构的函数,这是所有调用的根节点。

    2. load::<filename> 和 run_init::<filename>:

      XHProf 跟踪PHP的include/require操作,和跟踪函数调用一样。

      例如, include “lib/common.php"; 操作看起来像调了两个XHProf函数:

    3. foo@<n> :意味着这是一个foo()函数的递归调用。<n>代表递归深度。递归可能是直接的,(比如由于foo() --> foo() ) ,也可能是间接的(如由于foo()-> goo() ->foo()。

    4. Inclusive Time (或子树执行时间) :[包括子树执行时间的所有执行时间。]

    5. Exclusive Time/Self Time :[函数执行本身的时间花费。]不包括子树执行时间。

    6. Wall时间 :又名经过的时间或挂钟时间。

    7. CPU时间 : CPU时间在用户空间+ CPU时间在内核空间

  3. 安装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环境下进行。

    ?
    1 2 3 4 5 6 % cd <xhprof_source_directory>/extension/ % phpize % ./configure --with-php-config=<path to php-config > % make % make install % make test

    php.ini文件 :您可以更新您的php.ini文件来自动加载您的扩展。将以下内容添加到你的php.ini文件。

    ?
    1 2 3 4 5 6 7 8 [xhprof] extension=xhprof.so ; ; directory used by default implementation of the iXHProfRuns interface (namely, the XHProfRuns_Default classfor storing ; XHProf runs. ; xhprof.output_dir=<directory_for_storing_xhprof_runs >
  4.   使用XHProf来做性能分析

    用下面的示例程序来试着产生一些原始的性能数据:

    foo.php

    ?
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 <?php   function bar($x) {   if ($x > 0) {     bar($x - 1);   } }   function foo() {   for ($idx = 0; $idx 
    声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。