목차
术语
准备开始
查看一次运行的性能数据
比较性能数据
发现趋势
Watch Functions
调用图(Callgraphs)
下一章节
백엔드 개발 PHP 튜토리얼 PHP 性能分析第二篇: Xhgui In-Depth

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

Jun 23, 2016 pm 01:26 PM

【前言】这是国外知名博主 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 工程师编译整理)

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Laravel의 플래시 세션 데이터로 작업합니다 Laravel의 플래시 세션 데이터로 작업합니다 Mar 12, 2025 pm 05:08 PM

Laravel은 직관적 인 플래시 방법을 사용하여 임시 세션 데이터 처리를 단순화합니다. 응용 프로그램에 간단한 메시지, 경고 또는 알림을 표시하는 데 적합합니다. 데이터는 기본적으로 후속 요청에만 지속됩니다. $ 요청-

PHP의 컬 : REST API에서 PHP Curl Extension 사용 방법 PHP의 컬 : REST API에서 PHP Curl Extension 사용 방법 Mar 14, 2025 am 11:42 AM

PHP 클라이언트 URL (CURL) 확장자는 개발자를위한 강력한 도구이며 원격 서버 및 REST API와의 원활한 상호 작용을 가능하게합니다. PHP CURL은 존경받는 다중 프로모토콜 파일 전송 라이브러리 인 Libcurl을 활용하여 효율적인 execu를 용이하게합니다.

Laravel 테스트에서 단순화 된 HTTP 응답 조롱 Laravel 테스트에서 단순화 된 HTTP 응답 조롱 Mar 12, 2025 pm 05:09 PM

Laravel은 간결한 HTTP 응답 시뮬레이션 구문을 제공하여 HTTP 상호 작용 테스트를 단순화합니다. 이 접근법은 테스트 시뮬레이션을보다 직관적으로 만들면서 코드 중복성을 크게 줄입니다. 기본 구현은 다양한 응답 유형 단축키를 제공합니다. Illuminate \ support \ Facades \ http를 사용하십시오. http :: 가짜 ([ 'google.com'=> ​​'Hello World', 'github.com'=> ​​[ 'foo'=> 'bar'], 'forge.laravel.com'=>

Storage :: 다운로드로 Laravel에서 파일 다운로드를 발견하십시오 Storage :: 다운로드로 Laravel에서 파일 다운로드를 발견하십시오 Mar 06, 2025 am 02:22 AM

Storage :: Laravel Framework의 다운로드 방법은 파일 스토리지의 추상화를 관리하는 동안 파일 다운로드를 안전하게 처리하기위한 간결한 API를 제공합니다. 다음은 예제 컨트롤러에서 Storage :: download ()를 사용하는 예입니다.

Codecanyon에서 12 개의 최고의 PHP 채팅 스크립트 Codecanyon에서 12 개의 최고의 PHP 채팅 스크립트 Mar 13, 2025 pm 12:08 PM

고객의 가장 긴급한 문제에 실시간 인스턴트 솔루션을 제공하고 싶습니까? 라이브 채팅을 통해 고객과 실시간 대화를 나누고 문제를 즉시 해결할 수 있습니다. 그것은 당신이 당신의 관습에 더 빠른 서비스를 제공 할 수 있도록합니다.

PHP에서 늦은 정적 결합의 개념을 설명하십시오. PHP에서 늦은 정적 결합의 개념을 설명하십시오. Mar 21, 2025 pm 01:33 PM

기사는 PHP 5.3에 도입 된 PHP의 LSB (Late STATIC BING)에 대해 논의하여 정적 방법의 런타임 해상도가보다 유연한 상속을 요구할 수있게한다. LSB의 실제 응용 프로그램 및 잠재적 성능

PHP 로깅 : PHP 로그 분석을위한 모범 사례 PHP 로깅 : PHP 로그 분석을위한 모범 사례 Mar 10, 2025 pm 02:32 PM

PHP 로깅은 웹 애플리케이션을 모니터링하고 디버깅하고 중요한 이벤트, 오류 및 런타임 동작을 캡처하는 데 필수적입니다. 시스템 성능에 대한 귀중한 통찰력을 제공하고 문제를 식별하며 더 빠른 문제 해결을 지원합니다.

Laravel 서비스 제공 업체를 등록하고 사용하는 방법 Laravel 서비스 제공 업체를 등록하고 사용하는 방법 Mar 07, 2025 am 01:18 AM

Laravel의 서비스 컨테이너 및 서비스 제공 업체는 아키텍처의 기본입니다. 이 기사는 서비스 컨테이너, 세부 정보 서비스 제공 업체 생성, 등록 및 예제와 함께 실질적인 사용을 보여줍니다. 우리는 ove로 시작합니다

See all articles