摘要:前言這是國外知名博主撰寫的應用性能分析系列的第二篇,第一篇介紹,第三篇則關注于性能調優實踐。單個性能頁面展示了相當多的信息。該頁面顯示兩個重要圖表。
【前言】這是國外知名博主 Davey Shafik 撰寫的 PHP 應用性能分析系列的第二篇,第一篇介紹 Xhprof/Xhgui,第三篇則關注于性能調優實踐。
在第一篇中,我們初步介紹了 xhprof,以及如何安裝和運行分析器。在本文,我們將介紹 Xhgui——用于審查并比較 xhprof 數據的用戶界面(UI)。
使用 XhguiXhgui 提供了許多協助性能評估的功能,既適用于單次運行,也能滿足聚合環境——讓你精確至具體問題、發現趨勢。
術語為了提高 Xhgui 的使用效率,你需要熟悉許多術語:
調用次數:函數調用的次數
[包含] 實際執行時間 (wt):函數實際執行時間
[包含] CPU 使用/CPU 用時 (cpu):運行該函數 CPU 所用時間
[包含] 內存使用 (mu):目前該函數使用的內存量
[包含] 內存使用量峰值 (pmu):函數使用的內存高峰
專一實際執行時間 (ewt)
專一 CPU 時間 (ecpu)
專一內存使用量 (emu)
專一內存使用量峰值 (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 FunctionsWatch 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 類。
Xhprof 的最后一部分是調用圖 ,該圖展示運行的代碼執行路徑。
點擊單一運行頁面頂部的“View Callgraph”按鈕即可查看調用圖。
在調用圖中,拖拽結點可以更好地查看數據。鼠標懸浮在每個點擊上,會顯示其包含實際執行時間,同時允許你進入該函數的詳情頁。
更直觀地查看圖,請點擊:
體驗免費使用OneAPM在線PHP應用性能分析SaaS服務!
在第三部分也即最后一部分,我們會使用 xhprof 數據來優化代碼。我們也會簡單地介紹其他優化代碼的工具。
(本文系應用性能管理領軍企業 OneAPM 工程師編譯整理)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21139.html
摘要:注意本文是我們的性能分析系列的第三篇,點此閱讀性能分析第一篇介紹,或性能分析第二篇深入研究。小的性能提升很可能來自優化,而非緩存。注意此更改已提交到并已獲更新。目前,兩者具備相同的特性,只有一些部分重命名了。 注意:本文是我們的 PHP 性能分析系列的第三篇,點此閱讀?PHP 性能分析第一篇: XHProf & XHGui 介紹?,或??PHP 性能分析第二篇: 深入研究 XHGui...
摘要:注這是我們應用性能分析系列的第一篇,閱讀第二篇可深入了解,第三篇則關注于性能調優實踐。性能分析的行為也會影響應用性能。主動被動性能分析主動分析器在開發過程中使用,由開發人員啟用。它對性能的影響最小,同時收集足夠的信息用于診斷性能問題。 注:這是我們 PHP 應用性能分析系列的第一篇,閱讀第二篇可深入了解 xhgui,第三篇則關注于性能調優實踐。 什么是性能分析? 性能分析是衡量應用程...
摘要:在環境中使用,性能分析擴展因為沒有擴展,所以先要自己修改的文件加入擴展先在上現在,我下載的是,然后在中新建并配置,,內容最后修改文件,我用的是的所有,修改如下注文件夾在中,結構最后在目錄下,重新編譯即可,查看擴展第二步下載下 在laradock環境中使用,xhprof性能分析擴展: 因為laradock沒有xhprof擴展,所以先要自己修改php-fpm的Dockerfile文件,加入...
摘要:上一篇文章里,我們介紹了如何基于擴展來分析性能,并記錄到日志里,最后使用擴展自帶的在里展示出來。本次測試中,實際使用了擴展切換為擴展后里看不到數據,原因未知。雖然來自但已經很久不更新,官方源已經顯示此包已廢棄,不再維護。 上一篇文章里,我們介紹了如何基于xhprof擴展來分析PHP性能,并記錄到日志里,最后使用xhprof擴展自帶的UI在web里展示出來。本篇文章將講述2個知識點: ...
摘要:性能被動分析工具之加的安裝實踐前言最近一直想做個接口性能分析,但是手打實在能把人給累死。怎么辦呢想到之前有寫過一篇我所知道的相關調優匯總,里面有一個的調優方式。但是使用它酷炫的需要付費,擴展則不需要。 PHP性能被動分析工具之xhgui加tideways的安裝實踐 By:0x584A Date:2016-11-23 17:55:42 前言 最近一直想做個接口性能分析,但是手打log實在...
閱讀 2469·2021-11-15 11:38
閱讀 2844·2021-11-02 14:44
閱讀 3821·2021-09-26 10:13
閱讀 3060·2021-08-13 15:02
閱讀 780·2019-08-30 15:56
閱讀 1449·2019-08-30 15:53
閱讀 2363·2019-08-30 13:01
閱讀 3193·2019-08-29 12:57