搜尋
首頁後端開發php教程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 工程师编译整理)

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
PHP:服務器端腳本語言的簡介PHP:服務器端腳本語言的簡介Apr 16, 2025 am 12:18 AM

PHP是一種服務器端腳本語言,用於動態網頁開發和服務器端應用程序。 1.PHP是一種解釋型語言,無需編譯,適合快速開發。 2.PHP代碼嵌入HTML中,易於網頁開發。 3.PHP處理服務器端邏輯,生成HTML輸出,支持用戶交互和數據處理。 4.PHP可與數據庫交互,處理表單提交,執行服務器端任務。

PHP和網絡:探索其長期影響PHP和網絡:探索其長期影響Apr 16, 2025 am 12:17 AM

PHP在過去幾十年中塑造了網絡,並將繼續在Web開發中扮演重要角色。 1)PHP起源於1994年,因其易用性和與MySQL的無縫集成成為開發者首選。 2)其核心功能包括生成動態內容和與數據庫的集成,使得網站能夠實時更新和個性化展示。 3)PHP的廣泛應用和生態系統推動了其長期影響,但也面臨版本更新和安全性挑戰。 4)近年來的性能改進,如PHP7的發布,使其能與現代語言競爭。 5)未來,PHP需應對容器化、微服務等新挑戰,但其靈活性和活躍社區使其具備適應能力。

為什麼要使用PHP?解釋的優點和好處為什麼要使用PHP?解釋的優點和好處Apr 16, 2025 am 12:16 AM

PHP的核心優勢包括易於學習、強大的web開發支持、豐富的庫和框架、高性能和可擴展性、跨平台兼容性以及成本效益高。 1)易於學習和使用,適合初學者;2)與web服務器集成好,支持多種數據庫;3)擁有如Laravel等強大框架;4)通過優化可實現高性能;5)支持多種操作系統;6)開源,降低開發成本。

揭穿神話:PHP真的是一種死語嗎?揭穿神話:PHP真的是一種死語嗎?Apr 16, 2025 am 12:15 AM

PHP沒有死。 1)PHP社區積極解決性能和安全問題,PHP7.x提升了性能。 2)PHP適合現代Web開發,廣泛用於大型網站。 3)PHP易學且服務器表現出色,但類型系統不如靜態語言嚴格。 4)PHP在內容管理和電商領域仍重要,生態系統不斷進化。 5)通過OPcache和APC等優化性能,使用OOP和設計模式提升代碼質量。

PHP與Python辯論:哪個更好?PHP與Python辯論:哪個更好?Apr 16, 2025 am 12:03 AM

PHP和Python各有優劣,選擇取決於項目需求。 1)PHP適合Web開發,易學,社區資源豐富,但語法不夠現代,性能和安全性需注意。 2)Python適用於數據科學和機器學習,語法簡潔,易學,但執行速度和內存管理有瓶頸。

PHP的目的:構建動態網站PHP的目的:構建動態網站Apr 15, 2025 am 12:18 AM

PHP用於構建動態網站,其核心功能包括:1.生成動態內容,通過與數據庫對接實時生成網頁;2.處理用戶交互和表單提交,驗證輸入並響應操作;3.管理會話和用戶認證,提供個性化體驗;4.優化性能和遵循最佳實踐,提升網站效率和安全性。

PHP:處理數據庫和服務器端邏輯PHP:處理數據庫和服務器端邏輯Apr 15, 2025 am 12:15 AM

PHP在數據庫操作和服務器端邏輯處理中使用MySQLi和PDO擴展進行數據庫交互,並通過會話管理等功能處理服務器端邏輯。 1)使用MySQLi或PDO連接數據庫,執行SQL查詢。 2)通過會話管理等功能處理HTTP請求和用戶狀態。 3)使用事務確保數據庫操作的原子性。 4)防止SQL注入,使用異常處理和關閉連接來調試。 5)通過索引和緩存優化性能,編寫可讀性高的代碼並進行錯誤處理。

您如何防止PHP中的SQL注入? (準備的陳述,PDO)您如何防止PHP中的SQL注入? (準備的陳述,PDO)Apr 15, 2025 am 12:15 AM

在PHP中使用預處理語句和PDO可以有效防範SQL注入攻擊。 1)使用PDO連接數據庫並設置錯誤模式。 2)通過prepare方法創建預處理語句,使用佔位符和execute方法傳遞數據。 3)處理查詢結果並確保代碼的安全性和性能。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)