PHP 性能分析第二篇: Xhgui In-Depth

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

使用 XHGui

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

术语

为了提升 XHGui 的使用效率,你须要熟悉许多术语:mysql

1.调用次数正则表达式

函数调用的次数sql

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 ,你首先会看到: PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第1张

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

Recent — 近期大部分运行 (分页)

Longest wall time — 根据实际执行时间从最慢的运行开始排序

Most CPU — 从占用 CPU 时间最多的运行开始排序

Most Memory — 从占用内存最多的运行开始排序

Custom View — 执行 MongoDB 自定义查询

Watch Functions — 应该出如今审查页面顶部的标记函数

Waterfall — 从实验性视图查看并发请求的相互影响

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

查看一次运行的性能数据

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

PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第2张

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

PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第3张

经过单击适当的表头,你能够根据实际执行时间 (wt) , CPU 时间 (CPU) 、内存使用量 (mu) 或 内存使用量峰值 (pmu) 查看这些运行状况。从而轻易找出最慢的页面。 PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第4张

单个性能页面展现了至关多的信息。在左侧能够看到运行的整体状况,以及运行时的环境数据,包括 GET (或 POST) 数据和服务器数据: PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第5张

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

PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第6张

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

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

PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第7张

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

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

PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第8张

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

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

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

PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第9张

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

你须要肯定:是函数自己运行缓慢,仍是调用它的次数太多致使累积的实际执行时间太长。经过检查该函数的调用计数,而后回顾其父函数列表。

若是你以为函数调用次数没问题,你就要看看子函数运行状况。此处才是函数运行消耗时间的部分。

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

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

比较性能数据

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

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

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

接下来,单击右上角的 “Compare this run” 按钮: PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第10张

接着会跳转到同一 URL 下的运行列表,你能够选择一个进行比较: PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第11张

点击你想进行比较的运行的 "Compare" 按钮,将跳转到比较页面。 PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第12张

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

PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第13张

接下来是概览: PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第14张

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

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

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

最后,咱们看到功能细节: PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第15张

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

与其余表同样,您能够在任意列进行排序,默认的顺序方式是函数的调用次序。

在这里你能够验证,你作的改变是否确有效果,是否为预期效果。你也能够在性能降低时使用该视图追踪缘由。

性能提升的一个好例子是:基于一个条件只调用一个函数——例如,您可能不须要过滤数据,若是以前已经作了。

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

这两件事均可以在此处获得验证,以及其余意想不到的缘由——你的条件比过滤自己须要更长的时间?若是真是如此,这将对性能产生负面影响。

PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第16张

在此处,咱们能够看到, NOOP_Translations::translate 和 apply_filter 的调用次数都减小了,可是 apply_filter 的专注内存使用量增长了 133560 个字节!

发现趋势

对我来讲,XHGui 最强大的功能是查看趋势。由于 XHProf 是被动分析器,能够在全部环境中启用 (dev、qa、阶段性、生产),能够持续地对流量取样分析。

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

PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第17张

这将跳转到该 URL 运行页面。 PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第18张

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

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

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

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

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

另外,你能够点击搜索按钮来定制显示的界面: PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第19张

单击该按钮将显示搜索表单: PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第20张

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

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

Watch Functions

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

PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第21张

由于可使用正则表达式,咱们能够轻易地查看一个模块或扩展中的功能。

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

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

若是你使用诸如 Propel 的 ORM,你可能使用 (.*)Query::(.*) 追踪全部 Query 类。 PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第22张

调用图(Callgraphs)

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

点击单一运行页面顶部的“View Callgraph”按钮便可查看调用图。 PHP 性能分析第二篇: Xhgui In-Depth 技术分享 第23张

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

更直观地查看图,请点击: 体验无偿使用 OneAPM 在线 PHP 应用性能分析 SaaS 服务!

下一章节

在 第三篇 也即最后一篇,咱们会使用 XHProf 数据来优化代码。咱们也会简单地介绍其余优化代码的工具。 (本文系应用性能管理领军企业 OneAPM 工程师编译整理)

相关文章
相关标签/搜索