PHP 性能分析(二): 深入研究 XHGui

在 第一篇 中,我们初步介绍了 XHProf,以及如何安装和运行分析器。在本文,我们将介绍 XHGui ——用于审查并比较 XHProf 数据的用户界面(UI)。

使用 XHGui

XHGui 提供了许多协助性能评估的功能,既适用于单次运行,也能满足聚合环境——让你精确至具体问题、发现趋势。

术语

为了提高 XHGui 的使用效率,你需要熟悉许多术语:

  1. 调用次数
    函数调用的次数
  2. [包含] 实际执行时间 (wt)
    函数实际执行时间
  3. [包含] CPU 使用/CPU 用时 (cpu)
    运行该函数 CPU 所用时间
  4. [包含] 内存使用 (mu)
    目前该函数使用的内存量
  5. [包含] 内存使用量峰值 (pmu)
    函数使用的内存高峰
  6. 专一实际执行时间 (ewt)
  7. 专一 CPU 时间 (ecpu)
  8. 专一内存使用量 (emu)
  9. 专一内存使用量峰值 (epmu)

术语 2 至 5 都是包含型的测量指标(尽管不总是明确指出),这些指标会计算函数及其子函数的调用。术语 6 至 9 是专一型的测量指标——它们只计算函数本身的资源调用。所有的测量数值都是调用该函数后的累计值。(例如,如果一个函数调用两次,第一次用时 900 毫秒,第二次,因为缓存的缘故,只耗时 40 毫秒,最终显示的时间就是 940 毫秒)。

准备开始

一旦在 HTTP 服务器上运行 XHGui ,你首先会看到:

在顶部,你会看到一个菜单,它包含:

  • Recent — 近期大部分运行 (分页)
  • Longest wall time — 根据实际执行时间从最慢的运行开始排序
  • Most CPU — 从占用 CPU 时间最多的运行开始排序
  • Most Memory — 从占用内存最多的运行开始排序
  • Custom View — 执行 MongoDB 自定义查询
  • Watch Functions — 应该出现在审查页面顶部的标记函数
  • Waterfall — 从实验性视图查看并发请求的相互影响

在本教程中,我选择分析用 WordPress 搭建的网站性能。互联网上多于18% 的网站都是基于 WordPress 搭建的,这意味着,即便是对 WordPress 很小的性能改进, 亦能产生巨大影响。

查看一次运行的性能数据

分析了几个页面的性能(或导入了文件)之后,你会看到它们罗列在 XHGui :

查看一次运行的性能数据,只需点击日期。

通过单击适当的表头,你可以根据实际执行时间 (wt) , CPU 时间 (CPU) 、内存使用量 (mu) 或 内存使用量峰值 (pmu) 查看这些运行情况。从而轻易找出最慢的页面。

单个性能页面展示了相当多的信息。在左侧可以看到运行的总体情况,以及运行时的环境数据,包括 GET (或 POST) 数据和服务器数据:

在右侧,展示了 watch function 列表:

该表详细列出了函数名称,调用次数 ,专一实际执行时间 (ewt), 专一内存使用量(emu)、和专一内存使用峰值(epmu)。此外,你可能会注意到页面顶部的两个按钮, “View Callgraph(查看调用图)” 和 “Compare this run(对比此次运行)”。

接下来,我们看到两个图。图一展示了专一实际执行时间最长的六个函数,该时间是用在函数本身的时间(不包含任何子函数调用所占的时间)。图二展示内存使用量最大的六个函数。这些图通常能将你指向性能瓶颈。

函数的细节在下方列出。如果将鼠标滑过图中的圆柱,这些信息也将出现在提示框中。

最后,我们看到性能分析器收集到的大宗信息——函数列表:

该表包含一个浮动的标题栏(即便鼠标向下滚动,该栏目也会保持在屏幕顶端),包含函数名,调用次数,和前面提到的专一和包含的测量值。

默认情况下,该表按专一实际执行时间排序,时间最长者排在首位。通常你不会想改变这一次序,因为这让你快速找出运行最慢的函数,除非你想看内存使用量。

当你想查看一个函数的运行情况时,点击该函数,会跳转到其详细页面。该页面首先会递归展示函数本身的细节。接下来, “Parent Functions(父函数)” 部分列出所有直接调用该函数的函数。最后,“Child Functions(子函数)”列出该函数直接调用的其他函数。

父函数按照专一实际运行时间,列出标准列表数据。

你需要确定:是函数本身运行缓慢,还是调用它的次数太多导致累积的实际执行时间太长。通过检查该函数的调用计数,然后回顾其父函数列表。

如果你觉得函数调用次数没问题,你就要看看子函数运行情况。此处才是函数运行消耗时间的部分。

子函数只显示包含测量值;这是因为你想很快找到耗时最长的代码路径。

你可以点击每个子函数,下钻到相同的细节视图,并进行相同的分析。

比较性能数据

XHGui 最好的特性在于比较两个不同的运行。这使你:

  • 修改系统 (如启用 OpCache, MySQL 查询缓存) 并比较结果
  • 修改代码(代码或 SQL 优化)并比较结果
  • 将异常的运行与“正常”运行比较

比较两个运行时,你必须首先选择一个基础运行。点击其日期就能看到该运行的详细信息页。

接下来,单击右上角的 “Compare this run” 按钮:

接着会跳转到同一 URL 下的运行列表,你可以选择一个进行比较:

点击你想进行比较的运行的 "Compare" 按钮,将跳转到比较页面。

比较视图只显示两个运行之间的差异。在页面顶部显示比较中的两个运行,以及一些辅助修改排序的按钮。

接下来是概览:

尽管这个表的所有信息都有用,但特别值得注意的两个差别是 "函数调用次数" 和 "专一实际运行时间" 。

函数调用次数的差别暗示着两次运行的重要差异:不同的代码路径或缓存。第一个差别可能是有意的优化导致的,但若这并非你的目的,比较这两个运行很可能不会有太大的价值。另一方面,缓存是有益且有效的提高性能的方式。这种比较很容易验证缓存是否发生。

包含实际执行时间的百分比差展示了性能调优的实际成果。理想情况下,我们将看到一个较小的百分比——这是第二运行时间比上第一次运行时间的占比。在截图中,第二次运行只花了第一次运行 79% 的时间,这意味着性能提升了 21%。

最后,我们看到功能细节:

请记住,该视图只展示差别。差别通过绿色的负数和红色的正数表示。(负数表明调用次数更少,实际执行时间更短,CPU 耗时更短或内存消耗更少)如果没有差异,则显示为灰色的 0。

与其他表一样,您可以在任意列进行排序,默认的顺序方式是函数的调用次序。

在这里你可以验证,你做的改变是否确有效果,是否为预期效果。你也可以在性能下降时使用该视图追踪原因。

性能提高的一个好例子是:基于一个条件只调用一个函数——例如,您可能不需要过滤数据,如果之前已经做了。

当你做出这种改变时,你会预期过滤函数的调用次数减少,从而性能提升。

这两件事都可以在此处得到验证,以及其他意想不到的原因——你的条件比过滤本身需要更长的时间?如果真是如此,这将对性能产生负面影响。

在此处,我们可以看到, NOOP_Translations::translate 和 apply_filter 的调用次数都减少了,但是 apply_filter 的专一内存使用量增加了 133560 个字节!

发现趋势

对我来说,XHGui 最强大的功能是查看趋势。因为 XHProf 是被动分析器,可以在所有环境中启用 (dev、qa、阶段性、生产),可以持续地对流量取样分析。

审查给定 URL 的所有数据,只需在运行列表点击它:

这将跳转到该 URL 运行页面。

该页面显示两个重要图表。第一个显示实际运行时间和 CPU 时间,第二个显示内存使用情况和峰值内存使用。这些图表列表中运行的数据,包括每次运行的 URL,时间,实际运行时间、CPU 时间、内存使用和峰值。

这些图是查看趋势和异常值的关键所在。但是该如何处理这些信息呢?

对于数据异常者,首先你可以将鼠标悬浮在它上面验明正身,接着,你可以看一下它的单次运行。或用其他正常运行与其比较,从而发现不同。

对于趋势,最好的选择是审查趋势开始的时间——你在此时添加缓存了吗?随着缓存变得更加完整,整体趋势应该向下。或者你的缓存失效,你将看到一个上升趋势,此时缓存正在重建。

默认情况下,这些图表显示最近 100 次运行,你可以点击下一页去查看更久远时间的运行。

另外,你可以点击搜索按钮来定制显示的界面:

单击该按钮将显示搜索表单:

你可以搜索具体日期之间的运行。也可以查看最近 30分钟、1小时、2小时、12小时、24小时、1周、2周或 30天内 的运行——更小的时间间隔适合评估性能调优的结果。

最后,你可以使用 PHPs DateTimeIntervalInterval 规范格式指定自定义时间区间——例如,最近 2天 可使用 P2D,最近 15分钟 可使用 PT15M。

Watch Functions

Watch functions 允许你通过正则表达式识别特定的函数,或函数组,并显示在单个运行页面(见前文)。

因为可以使用正则表达式,我们可以轻易地查看一个模块或扩展中的功能。

例如,查看所有 MySQL 活动,只需添加如下列表的任意一项:

  • mysql_(.*)for ext/mysql
  • mysqli(.*)for ext/mysqli
  • pdo(.*)for PDO (适用于所有 PDO-based 数据库交互)

如果你使用诸如 Propel 的 ORM,你可能使用 (.*)Query::(.*) 追踪所有 Query 类。

调用图(Callgraphs)

XHProf 的最后一部分是调用图 ,该图展示运行的代码执行路径。

点击单一运行页面顶部的“View Callgraph”按钮即可查看调用图。

在调用图中,拖拽结点可以更好地查看数据。鼠标悬浮在每个点击上,会显示其包含实际执行时间,同时允许你进入该函数的详情页。

时间: 2025-01-31 06:02:42

PHP 性能分析(二): 深入研究 XHGui的相关文章

百度工程师讲PHP函数的实现原理及性能分析(二)

  这篇文章主要介绍了百度工程师讲PHP函数的实现原理及性能分析(二),本文讲解了类方法.性能对比.内置函数和用户函数性能对比等内容,需要的朋友可以参考下 类方法 类方法其执行原理和用户函数是相同的,也是翻译成opcodes顺次调用.类的实现,zend用一个数据结构zend_class_entry来实现,里面保存了类相关的一些基本信息.这个entry是在php编译的时候就已经处理完成. 在 zend_function的common中,有一个成员叫做scope,其指向的就是当前方法对应类的zend

PHP 性能分析(一): XHProf & XHGui 介绍

什么是性能分析? 性能分析是衡量应用程序在代码级别的相对性能.性能分析将捕捉的事件包括:CPU的使用,内存的使用,函数的调用时长和次数,以及调用图.性能分析的行为也会影响应用性能. 影响的程度取决于基准测试.基准测试在外部执行,用于衡量应用真实性能.所谓真实性能,即终端用户所体验的应用表现. 什么时候应该进行性能分析? 在考虑是否进行性能分析时,你首先要想:应用是否存在性能问题?如果有,你要进一步考虑:这个问题有多大? 如果你不这样做,将会陷入一个陷阱--过早优化,这可能会浪费你的时间. 为了评

背景建模技术(二):BgsLibrary的框架、背景建模的37种算法性能分析、背景建模技术的挑战

背景建模技术(二):BgsLibrary的框架.背景建模的37种算法性能分析.背景建模技术的挑战 1.基于MFC的BgsLibrary软件下载 下载地址:http://download.csdn.net/detail/frd2009041510/8691475 该软件平台中包含了37种背景建模算法,可以显示输入视频/图像.基于背景建模得到的前景和背景建模得到的背景图像,还可以显示出每种算法的计算复杂度等等.并且,测试的可以是视频.图片序列以及摄像头输入视频.其界面如下图所示: 2.BgsLibr

SQL2005性能分析一些细节功能你是否有用到?(二)

原文:SQL2005性能分析一些细节功能你是否有用到?(二)        上一篇:SQL2005性能分析一些细节功能你是否有用到? 我简单的提到了些关于SQL性能分析最基本的一些方法,下面的文章我会陆续补充.前面提到了根据SQL的执行IO和执行计划来分析,还有一个特别重要的参数,就是SET STATISTICS TIME.        第一: SET STATISTICS TIME                定义:SET STATISTICS TIME (Transact-SQL)  显

从零开始学习OpenCL开发(二)一个最简单的示例与简单性能分析

欢迎关注 转载请注明 http://blog.csdn.net/leonwei/article/details/8893796   1 Hello OpenCL      这里编写一个最简单的示例程序,演示OpenCl的基本使用方法:     1.首先可以从Nvdia或者Amd或者Intel或者所有OpenCl成员的开发者网站上下载一份他们实现的OpenCL的SDK.虽然不同公司支持了不同版本的OpenCL和扩展ext,但是在相同版本上对于标准的OpenCL接口,每个SDK实现的结果都是一样的,

PHP 性能分析(三): 性能调优实战

在本系列的 第一篇 中,我们介绍了 XHProf .而在 第二篇 中,我们深入研究了 XHGui UI, 现在最后一篇,让我们把 XHProf /XHGui 的知识用到工作中! 性能调优 不用运行的代码才是绝好的代码.其他只是好的代码.所以,性能调优时,最好的选择是首先确保运行尽可能少的代码. OpCode 缓存 首先,最快且最简单的选择是启用 OpCode 缓存.OpCode 缓存的更多信息可以在 这里 找到. 在上图,我们看到启用 Zend OpCache 后发生的情况.最后一行是我们的基准

Nodejs下的ES6兼容性与性能分析

ES6标准发布后,前端人员也开发渐渐了解到了es6,但是由于兼容性的问题,仍然没有得到广泛的推广,不过业界也用了一些折中性的方案来解决兼容性和开发体系问题,但大家仍很疑惑,使用ES6会有哪些兼容性问题. 一.Nodejs下ES6兼容性现状   之前写了es6通过Babel编译后的在浏览器端的兼容性问题<Babel下的ES6兼容性和规范>,随着范围的扩展,ES6在Nodejs上兼容性也有必要重新梳理下.   随着iojs的引入,新版的Nodejs开始原生支持部分ES6的特性,既然ES6在浏览器端

页面装载js及性能分析方法介绍

 这篇文章主要介绍了页面装载js及性能分析方法,需要的朋友可以参考下 一.装载    先装载静态页面的引用js文件,然后查找引用文件中是否包含onload函数,比如main.js中包含onload函数,在main.js中查找是否有对其他js文件的引用,优先装载引用js文件,被引用中文件的装载顺序和main.js的顺序一致.  装载完毕后,开始执行onload函数.由于js执行顺序是顺序执行的,为提高页面相应速度,一般做法是在onload中只画页面,一些事件的绑定函数,ajax方法等可延后书写. 

PHP 性能分析与实验:性能的微观分析

在上一篇文章中,我们从 PHP 是解释性语言.动态语言和底层实现等三个方面,探讨了 PHP 性能的问题.本文就深入到 PHP 的微观层面,我们来了解 PHP 在使用和编写代码过程中,性能方面,可能需要注意和提升的地方. 在开始分析之前,我们得掌握一些与性能分析相关的函数.这些函数让我们对程序性能有更好的分析和评测. 一.性能分析相关的函数与命令 1.1.时间度量函数 平时我们常用 time() 函数,但是返回的是秒数,对于某段代码的内部性能分析,到秒的精度是不够的.于是要用 microtime