PHP 性能分析第二篇: Xhgui In-Depth
【前言】这是国外知名博主 Davey Shafik 撰写的 PHP 应用性能分析系列的第二篇,第一篇介绍 Xhprof/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 — 执行 mongo DB 自定义查询
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 允许你通过正则表达式识别特定的函数,或函数组,并显示在单个运行页面(见前文)。
因为可以使用正则表达式,我们可以轻易地查看一个模块或扩展中的功能。
For example, to watch all MySQL activity, simply add one of the following:
例如,查看所有 MySQL 活动,只需添加如下列表的任意一项:
- mysql_(.*)for ext/mysql
- mysqli(.*)for ext/mysqli
- pdo(.*)for PDO (适用于所有PDO-based数据库交互)
如果你使用诸如 Propel 的 ORM,你可能使用 (.)Query::(.) 追踪所有 Query 类。
调用图(Callgraphs)
Xhprof 的最后一部分是调用图 ,该图展示运行的代码执行路径。
点击单一运行页面顶部的“View Callgraph”按钮即可查看调用图。
在调用图中,拖拽结点可以更好地查看数据。鼠标悬浮在每个点击上,会显示其包含实际执行时间,同时允许你进入该函数的详情页。
更直观地查看图,请点击:
体验免费使用OneAPM在线PHP应用性能分析SaaS服务!
下一章节
在第三部分也即最后一部分,我们会使用 xhprof 数据来优化代码。我们也会简单地介绍其他优化代码的工具。
(本文系应用性能管理领军企业OneAPM 工程师编译整理)
PHP 性能分析第二篇: Xhgui In-Depth的更多相关文章
- PHP 性能分析第一篇: Xhprof & Xhgui 介绍
[前言]这是国外知名博主 Davey Shafik所撰写的 PHP 应用性能分析系列的第一篇,阅读第二篇可深入了解 xhgui,第三篇则关注于性能调优实践. 什么是性能分析? 性能分析是衡量应用程序在 ...
- PHP 性能分析第一篇: Intro to Xhprof & Xhgui
[前言]这是国外知名博主 Davey Shafik所撰写的 PHP 应用性能分析系列的第一篇,阅读第二篇可深入了解 xhgui,第三篇则关注于性能调优实践. 原文链接如下: https://blog. ...
- MySQL监控、性能分析——工具篇
https://blog.csdn.net/leamonjxl/article/details/6431444 MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性 ...
- 转 WEB前端性能分析--工具篇
在线网站类: WebPageTest 说明: 在线的站点性能评测网站,地址http://www.webpagetest.org/ 补充: 其实这网站也是个开源项目,所以支持自己搭建一个内部的测试站点 ...
- 转 web前端性能分析--原理篇
转自http://blog.csdn.net/five3/article/details/7686715 web前端性能: 即是web用户在访问一个页面时所要花费的时间总和.即一个完全意义上的用户响应 ...
- MySQL监控、性能分析——工具篇(转载)
MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性能分析.监控预警.容量扩展议题越来越多.“工欲善其事,必先利其器”,那么我们如何在进行MySQL性能分析.监控预 ...
- React Fiber源码分析 第二篇(同步模式)
先附上两张流程图 1.scheduleRootUpdate 这个函数主要执行了两个操作 1个是创建更新createUpdate并放到更新队列enqueueUpdate, 1个是执行sheculeW ...
- PHP 性能分析第三篇: 性能调优实战
注意:本文是我们的 PHP 性能分析系列的第三篇,点此阅读 PHP 性能分析第一篇: XHProf & XHGui 介绍 ,或 PHP 性能分析第二篇: 深入研究 XHGui. 在本系列的 ...
- Windows系统CPU内存网络性能统计第一篇 内存
最近翻出以前做过的Windows系统性能统计程序,这个程序可以统计系统中的CPU使用情况,内存使用情况以及网络流量.现在将其整理一下(共有三篇),希望对大家有所帮助. 目录如下: 1.<Wind ...
随机推荐
- (转)TeamCity配置笔记
1.编译sln 2.发布网站 3.重复代码检测 4.代码分析 5.单元测试&覆盖率测试 查看代码覆盖率 7.代码签入时自动触发编译 8.通知 1.在teamcity安装目录中找到TrayNot ...
- wiegand 问题
在向门控器发送信号的时候,播放声音和通过GPIO向wiegand发送信号的时候,由于wiegand的资源优先级别不够和声音的播放可能发生了冲突,有时向GPIO发送信号的时候,发送失败. static ...
- WCF 服务的ABC之地址(五)
地址 Address 在WCF中,每个服务都有一个唯一的地址(Address). 地址包含两个重要的元素:服务位置及传输协议. 服务位置包含目标机器名.站点.通信端口.管道(或队列),以及一个可选的特 ...
- 从java到php
从大一开始就开始接触java这门语言.但是在这之前也接触了vb,c,asp等等开发语言,唯独java让人感觉严谨,清爽,各种数据之间的不拖泥带水.这才花费更多时间去研究他.但是学着学着,发现他体系的庞 ...
- java 语法糖
package syntax.autoCase; import java.util.Arrays; import java.util.List; public class autoCase { pub ...
- Extjs combox的详解
Extjs combox的详解 写了哈extjs当中的combox,第一次写,照着网上的例子抄.在上次的例子中,是实现了,可是有一个重大的错误.也就是自己根本没有理解combox从远程服务器获取数据, ...
- windows创建桌面快捷方式的VBA脚本
Dim wShell, oShortcut 'Dim strDesktop$ ' 为了与VBS兼容, Dim strDesktop ' 这里改写一下,测试通过... Set w ...
- MySQL 简洁连接数据库方式
OS : CentOS 6.3 DB : 5.5.14 MySQL连接数据库的方式很多: 1.[root@db01 bin]# ./mysql -uroot -p 2.[root@db01 ...
- 从零开始学ios开发(十五):Navigation Controllers and Table Views(中)
这篇内容我们继续上一篇的例子接着做下去,为其再添加3个table view的例子,有了之前的基础,学习下面的例子会变得很简单,很多东西都是举一反三,稍稍有些不同的内容,好了,闲话少说,开始这次的学习. ...
- c# this.location和e.X的区别
this.location是窗口当前位置 e.X是具体事件的相对坐标 size是窗口尺寸宽和高