EXHPROF-php效能資料自動收集及分析平臺

技術小美發表於2017-11-15

1 EXHPROF是什麼?
Exhprof 是一個php效能資料自動化收集及分析平臺,其客戶端為你提供php程式碼函式級的效能資料的自動化統計和自動化收集,其伺服器端為你提供高效靈活的歷史資料儲存,和資訊聚合分析,通過表格和影像形式展現出來。 

Exhprof的優勢在於: 

• 做到了實時自動化收集php函式級效能資料,客戶端使用靈活且成本低,伺服器端資訊展現形式友好,利於快速準確的定位效能瓶頸 

• 做到了輕量級的效能資料統計,對原有程式效能影響較小。你可以在客戶端輕鬆配置統計的資訊型別、函式層級,並提供了抽樣頻率控制。 

• 基於xhprof的效能資料統計,功能相比其他統計工具更強大。你不僅可以獲取到時間資訊,更可以獲取到cpu、mem等效能資訊 

• 資訊展現web化,方便且友好,同時還提供了歷史版本效能資料diff、多次請求平均效能統計和影像化展示功能,其對效能關鍵路徑標識讓你一目瞭然 

• 可以輕鬆擴充套件更多采集資訊,並進行不同維度的資訊聚合分析,比如按照url進行聚合分析。儲存系統採用了Nosql作為解決方案,這也使得資訊的擴充套件十分容易。



Exhprof架構圖如圖1-1所示。




圖1-1 exhprof架構圖

2 為什麼要使用EXHPROF?
• 你是否為定位效能問題耗費過多的時間而頭疼呢? 

• 你是否還在使用xdebug,而頭疼壓力下無法進行效能統計或效能統計誤差太大呢? 

• 你是否想獲得壓力下真實的系統效能瓶頸,甚至線上環境的實時效能資料呢? 

• 你是否還在糾結其他效能統計工具只能得到請求耗時而無法獲得請求cpu佔用資訊呢? 

——是的,你已經有足夠的理由,使用Exhprof,你將輕鬆解決這些問題,讓你迅速便捷的定位效能瓶頸。 同時,下面的幾個理由或許也吸引你: 

• 通過歷史版本效能資料diff功能,可以清楚的瞭解到效能的改進點 

• 靈活的定製效能統計資訊,提供debug模式更加方便使用者進行資訊檢視 

你可以通過下表進一步瞭解我們的調研資訊,在進行Exhprof的設計調研中,我們重點對xdebug和xhprof的特點進行了對比分析,見下表

表2-1 exhprof vs xhprof vs xdebug



 

3 深入瞭解EXHPROF…
3.1 功能需求說明
1.效能資料的實時採集:包括函式級的效能資料、請求的URL、請求時刻等。 

2.效能資料易擴充套件:可以對使用者透明的做到採集資料的增加和減少,不需要在後端進行大量改動。 

3.效能資料的採集不會給原有服務帶來大量的效能消耗,便於效能測試和生產環境部署 

4.支援分散式多機效能資料採集:以便於支援多測試機,多產品線,多模組的效能採集和儲存。 

5.後端資料可擴充套件為分散式儲存,便於儲存和處理大量的歷史資料。 

6.伺服器端包括基本的展現檢視:單個請求檢視、多個請求平均效能檢視、兩個請求的效能diff檢視,函式效能檢視 

7.搜尋功能:按照函式名精確搜尋 

8.資訊聚合分析功能:按頁面型別進行聚合分析,按時間段進行聚合分析 

9.自動化資料採集,無需人工干涉。 

10.伺服器端以web頁面展現,介面友好,操作方便。 
3.2 系統架構設計
從設計上,Exhprof包括客戶端和伺服器部分,客戶端部分負責效能資料的監控採集,伺服器端負責資料的分析和展現。 

系統有兩種設計方案,區別主要集中在資料分散式採集上。 
3.2.1 方案一
• 客戶端:包括兩部分:客戶端指令碼和客戶端後臺服務。 

客戶端指令碼採用php實現,直接嵌入到被監控的php程式碼中,基於xhprof進行基礎的函式級效能採集,然後對收集到的效能資料進行定製、過濾、新增產生最終的效能資料,最後將效能資料dump到本機硬碟儲存。 客戶端後臺服務採用C/C++實現,主要負責資料的分散式採集,採取伺服器端統一定時採集的方式,在客戶端機器執行一個後臺服務,偵聽一個埠,提供效能資料的管理服務。伺服器端定時向客戶端請求獲取效能資料。 

• 伺服器端: 

web展現,主要採用php+js實現,php採用Yii框架,js採用jquery框架。 後端儲存,效能資料欄位不確定的特點非常適合採用nosql實現,具體設計中採用了基於文件的資料庫mongodb,在效能和擴充套件性上都得到了很大的提高。 定期後臺服務,需要定期向客戶端機器請求獲取效能資料,將請求到效能資料儲存到後端mongodb中。
3.2.2 方案二
• 客戶端:只包括客戶端指令碼 

與方案一的不同在於,在資料的分散式採集上,採用客戶端指令碼直接將採集資料傳送到後端mongodb,效能的採集頻率等配置全部在客戶端指令碼中實現,雖然不便於統一的配置管理,但是在開發效率和使用者使用便利性上得到了更大的改善。 在實際實現中,客戶端無需在本地磁碟儲存效能資料,所有效能資料直接寫入到伺服器端mongodb中,寫入方式可以配置同步寫和非同步寫,同時在後端mongodb採用capped collection來實現,寫入效能極高,幾乎等同於直接寫硬碟。 

• 伺服器端: 

伺服器端只是基於mongodb進行資料的分析和展現,而不再向客戶端機型資料的收集。 方案二架構請參見圖1-1
3.3 設計改進考慮
3.3.1 客戶端效能資料監控的效能開銷
函式級的效能監控碰到最大的問題是,給原有程式帶來的效能開銷過大,導致監控資料失真,並且無法應用到效能環境和生產環境,進而無法獲取到壓力下/線上真實的效能資料。 

改進措施的考慮包括以下方面,具體的效能開銷評估報告請參考第4節

• 1. 採用xhprof進行基礎的函式效能資料統計,xhprof為開源的輕量級效能統計工具 

• 2. 對效能採集級別和採集函式進行定製,不同的環境和需求定製不同的監控級別,通過對配置定製監控級別和過濾不必要的函式,使得效能開銷進一步降低 

• 3. 資料採集時可以開啟非同步寫模式,使得資料的寫入速度大大提升 

• 4. 後端放棄mysql,而採用nosql,並且採用mongodb的capped collection進行儲存,大大提高的資料寫入效能。 
3.3.2 資料採集方式
分散式資料採集方式有同步採集和非同步採集兩種,從降低對原有程式影響的角度考慮,採用非同步採集方式更好。非同步方式有兩種實現方案,分別在前面的方案一和方 案二中進行了描述。 其中方案二是我們實現中採用的方式,其非同步主要體現在寫資料庫的非同步寫上,由於採用了mongodb的capped collection實現,即使同步 寫,效能開銷也很搞,幾乎等同於寫硬碟,所以我們預設關閉非同步寫,以免發生資料寫失敗時丟失,在效能環境/生產環境中,建議使用者開啟非同步寫。
3.3.3 資料儲存形式和擴充套件性

4 使用EXHPROF帶來的效能開銷
4.1 測試目標 

• 給出客戶端指令碼在效能資料採集過程中對原有系統帶來的效能開銷 

• 評估方式包括:debug模式(單個請求消耗),抽樣模式(效能環境取樣),非同步模式(客戶端取樣完畢後的資料處理帶來的消耗) 

• 客戶端的效能採集資料包括:預設採集(採集函式級耗時資訊), cpu採集(採集函式級cpu佔用資訊),mem採集(採集函式級mem使用資訊) 

• 給出部署和配置建議 
4.2 DEBUG模式——功能環境
【說明】

• 無採集——不進行效能採集的請求耗時

• 預設採集——對所有函式進行函式級耗時資訊採集

• cpu採集——對所有函式進行函式級耗時資訊+cpu佔用資訊採集

• cpu+mem採集——對所有函式進行函式級耗時資訊+cpu佔用資訊+mem佔用資訊採集

表4-1 debug模式效能評估表



【結論】

DEBUG模式為全功能模式,對請求時延的消耗為84ms,佔比為(277-193)/193=44%,考慮到全功能的優勢,線上下功能環境建議開啟DEBUG模式
4.3 抽樣模式——效能環境/生產環境
【場景說明】

• 壓力大小:20次/s

• 抽樣頻率:1/100

• 壓力時間:10分鐘

表4-2 抽樣模式效能評估表

 

【結論】

抽樣模式通過抽樣來保證效能資料採集不會對服務造成影響,對於命中抽樣的請求,建議關閉cpu採集,只進行預設採集即可。

4.4 非同步收集模式——資料儲存的消耗
表4-3 非同步收集模式效能評估表

 


4.5 部署和配置建議
4.5.1 功能環境
功能環境使用DEBUG模式即可,DEBUG模式具體配置及特點如下: 

• 1.開啟所有函式的效能資料收集,不設定過濾函式,對php內建函式也進行收集 

• 2.開啟請求時間、cpu、mem的資料收集,並且可以檢測死迴圈 

• 3.在請求的頁面頂部,會輸出除錯資訊,包括到exhprof的入口連結 
4.5.2 效能環境/生產環境
效能環境中務必使用抽樣模式,同時建議只開始預設採集,抽樣的頻率的配置原則建議為30s取樣一次,及抽樣頻率=壓力大小*30。
5 如何開始使用EXHPROF
5.1 安裝xhprof和mongodb擴充套件
5.1.1 安裝xhprof.so
$ wget http://pecl.php.net/get/xhprof-0.9.2.tgz

$ tar xzvf xhprof-0.9.2.tgz

$ cd <xhprof_source_directory>/extension/

$ phpize

$ ./configure –with-php-config=<path to php-config>

$ make

$ make install

$ make test
5.1.2 安裝mongo.so
https://github.com/mongodb/mongo-php-driver下載driver到測試機

$ tar zxvf mongodb-mongodb-php-driver-<commit_id>.tar.gz

$ cd mongodb-mongodb-php-driver-<commit_id>

$ phpize

$ ./configure

$ make

$ make install
5.1.3 更新php.ini
extension_dir =”/home/work/php/ext”

[xhprof]

extension=xhprof.so

[mongo]

extension=mongo.so
5.2 部署客戶端指令碼
從中控機下載客戶端指令碼Exhprof-client.tar.gz到測試機,並解壓;然後在你想要監控的程式碼前後require客戶端指令碼,一般來說,要對整個請求進行監控,在php框架的入口檔案index.php的開頭和末尾分別載入以上客戶端指令碼即可。

require_once `/home/work/lib/Exhprof-client/xhprof_start.php`;

#Here your code is!!

require_once `/home/work/lib/Exhprof-client/xhprof_stop.php`;
5.3 申請空間
你可以通過頁面中的”設定->申請空間“來申請後端儲存空間。 

建議你填寫的空間名為你的產品線名或測試機名,申請成功之後,可以在客戶端指令碼配置中使用該空間名。 

注意:如果你使用未經過申請的空間名,系統會自動為你分配後端的空間,自動分配的空間效能相對差一些,但是空間的大小不限,會造成後端資料大小不可控,所以建議通過web端進行固定大小的空間申請。 
5.4 配置客戶端指令碼
至此,你已經部署完畢,可以在url中新增參加prof來即時開啟效能監控,監控的概要資訊會在監控頁面中輸出。 

如果不想採用預設配置,可以修改客戶端指令碼的配置檔案,進一步對效能函式統計等資訊進行配置和定製,配置檔案如下: 

#後端配置,無需修改

//exhprof webserver.

$XHPROF_SERVER=”[WEBURL] “;

//mongodb.

$HOST=”[IP:PORT]”;

#環境配置,後端使用”ENV_TAG+ENV_TYPE”來進行唯一標識

##0–功能 1–效能

$ENV_TYPE=0;————功能環境的後端儲存空間為2G,而效能環境儲存空間為25G或更大,一般來說功能滿足日常測試需求,如果需要在效能環境或線上環境進行長期資料採集,則需要申請效能環境。

$ENV_TAG=”XXX “;————通過web端EXHPROF申請得到的空間TAG

## normal : 不影響原有服務,通過在url中新增引數來開啟監控,並在請求頁面中輸出概要資訊供除錯

## debug : 每個請求都會進行監控,並且在頁面中輸出概要資訊

## press : 對所有請求進行抽樣監控,不在頁面中輸出除錯資訊,適用於效能環境

$MODE=`normal`;

#模式的詳細配置資訊

#by_url_param : true-通過url中攜帶引數來開啟監控, false-通過抽樣頻率來開啟監控

#is_print_abstart: true-在請求頁面中列印概要資訊, fase-不列印

#param_name : url引數名,在by_url_param模式中使用

#sample_num : 抽樣頻率,建議: 30*壓力大小,即30s取樣一次.

#no_builtins : 是否監控php內部函式效能資料

#cpu_monitor : 是否監控cpu耗時,預設只監控函式處理耗時,此選項可用於統計cpu佔用資訊

#mem_monitor : 是否監控記憶體佔用資訊

#ignored_functions: 忽略不監控的函式名陣列,如下:


5.5 使用伺服器端WEB UI
OK,到這裡你已經成功完成部署,使用WEB UI的方式有如下兩種: 

1.直接訪問伺服器端首頁url,基於web進行操作 

2.在你的產品頁面頂部,通過EXHPROF的連結地址來訪問。如下: 

 



6 FAQ
Q: 為什麼我要申請空間? 

A: 申請空間的目的是為了更好的管理伺服器端資料儲存。 

如果不申請空間,而直接在客戶端指令碼中使用TAG名,伺服器端會自動為你分配好空間,且不限制大小,但是客戶端的資料存取帶來的消耗會更大一些。 

如果你申請空間,對於功能環境,你將可以獲得2G的空間,已經足夠滿足日常測試的效能資料儲存需求,並且客戶端的資料存取帶來的消耗相對小一些。如果資料超過2G,將會自動覆蓋最老的資料。



Q: 我如何獲得一個函式的全域性呼叫堆疊? 

A: Exhprof在底層使用了xhprof進行效能資料收集,xhprof只記錄一級的呼叫上下文,因此只能回答關於一級一級函式呼叫的問題。而事實證明,在實踐中這是最主要的利用情況。 

如果你想了解全域性的呼叫堆疊,可以通過子/父函式級檢視進行逐級分析,來獲得全域性呼叫堆疊。當然Exhprof也可以為你實現全域性呼叫堆疊的資訊的查詢(暫未實現)。



Q: 我如何直接檢視某個函式的效能檢視? 

A:你可以在WEB頁面右上角的搜尋框裡面輸入你想檢視的函式名,點選選擇你想函式名即可



Q: 我在效能環境可以使用麼? 

A:當然可以。在效能和生產環境使用是本平臺的特點,不過你需要注意在客戶端指令碼進行相關的配置,推薦使用$mode=”press”,具體的效能消耗請參考第4節

(作者:wangkaihua)

 

本文轉自百度技術51CTO部落格,原文連結:http://blog.51cto.com/baidutech/744492,如需轉載請自行聯絡原作者


相關文章