Tideways和xhgui打造PHP非侵入式監控平台
當我們發現生產環境的某個接口執行時間特別長時應該怎麼做?是不是直接登錄線上機器單步調試?或者打大量的log然後分析? 一般我們可以把分析流程分為如下幾步操作:
雲棲社區的MarkDown渲染做的太差了,編號都錯位,大家還是到我的博客看吧 Tideways和xhgui打造PHP非侵入式監控平台
-
分析開發環境下執行是否會慢;
如果是代碼問題,在開發環境下就能檢測出來;
-
分析預發環境執行是否會慢;
如果是數據庫或者第三方擴展問題,在預發環境就能檢查出來。
-
從生產環境摘一台機器,分析代碼執行慢的原因;
如果是機器的問題,在生產環境就能檢查出來。
1,2,3步驟都需要去分析代碼,看哪部分執行時間長。如果人工一句一句代碼去排查,很容易導致用戶流失。大多時候我們會使用第三方的分析工具tideways或者xhprof來快速發現問題。選擇哪一個工具比較好呢?xhprof雖然來自facebook但已經很久不更新,官方源已經顯示This package is abandoned and no longer maintained(此包已廢棄,不再維護)。tideways恰好相反,一直有商業公司在維護,並且積極的支持了PHP7。兩個擴展都是開源的,綜上所述我建議大家選擇tideways來分析代碼。
tideways擴展能把每條請求生成詳細的執行日誌,我們通過對日誌做簡單的分析就能看到程序哪部分耗時最長,這裏可以使用xhprof的UI程序(xhprof生成的日誌和tideways生成的日誌格式通用),交互雖然不大友好但是夠用了。如果想有更好的視覺效果,建議下載xhgui,一款基於Bootstrap的xhprof UI程序。
在開始搭建PHP非侵入式監控平台之前,我需要解釋幾個問題。
一. Tideways這家公司如何盈利?
Tideways這家公司與Sentry的營銷模式一樣,都是賣存儲服務+數據分析服務。
tideways.so擴展是開源的,可以免費使用。但是tideways.so擴展隻能生成日誌文件,我們獲得日誌文件後還需要花很長時間去整理和分析。如果你購買了Tideways的服務,就能無縫的將日誌存儲到他們的服務器,登錄他們提供的後台就能看到項目代碼和服務器的運行狀況。加上各種可視化的圖表展示,體驗非常的好,有很多大公司願意付費。
二. 安裝擴展後代碼改動會不會很大?
tideways.so擴展提供的監控方式是非侵入式的監控,不會對當前項目有任何的影響。我們隻需要在Nginx配置文件中加上一行配置即可:
fastcgi_param PHP_VALUE "auto_prepend_file=/home/admin/xhgui/external/header.php";
代碼的含義:在執行主程序前都運行我們指定的PHP腳本
具體如何安裝這個服務,我在文章的下半部分會詳細說明。現在我們需要知道『非侵入式的監控』就是不用改動一行項目代碼。
三. 每個請求都生成日誌會不會影響服務本身?
用戶的每次請求都生成執行日誌對服務會有輕微的影響。雖然tideways.so擴展提供的監控方式是非侵入式的不會影響線上項目,但對CPU和內存的消耗是不可忽略的。為了減少對內存和CPU的消耗,我們可以控製生成日誌的頻率,還能編寫生成日誌的規則。默認頻率為1%(每100個請求生成1條日誌,這裏的概率非絕對)。
如果有多台服務器,隻需要對一台進行監控,機器比較多的話可以每個機房一台。
搭建非侵入式監控環境
-
安裝PHP mongodb擴展;
sudo pecl install mongodb
-
安裝PHP tideaways擴展;
tideaways的文檔寫的非常詳細,安裝tideaways擴展(官方文檔) 這裏我用Centos舉例。
echo "[tideways]
name = Tideways
baseurl = https://s3-eu-west-1.amazonaws.com/qafoo-profiler/rpm" > /etc/yum.repos.d/tideways.reporpm --import https://s3-eu-west-1.amazonaws.com/qafoo-profiler/packages/EEB5E8F4.gpg
yum makecache --disablerepo=* --enablerepo=tideways
yum install tideways-php tideways-cli tideways-daemon
PS: MarkDown的語法轉換可能有部分問題,容易把中劃線轉沒了,這裏建議安裝時從官網COPY命令,安裝tideaways擴展
-
修改php.ini文件;
我們需要在php.ini文件中引入擴展
[mongodb] extension=mongodb.so [tideways] extension=tideways.so ;不需要自動加載,在程序中控製就行 tideways.auto_prepend_library=0 ;頻率設置為100,在程序調用時能改 tideways.sample_rate=100
-
安裝mongodb-server(可選擇安裝mongodb客戶端);
我們需要在係統中安裝mongodb-server,用來存儲tideways擴展生成的日誌。多台服務器也隻需要安裝一個mongodb-server,用來做日誌歸攏。如果有單獨的mongodb機器,可以跳過這一步。
Centos下安裝MongoDB服務:
sudo yum install mongodb-server
啟動服務:
sudo service mongod start
Centos下安裝MongoDB客戶端:
sudo yum install mongodb
-
安裝xhgui;
git clone https://github.com/laynefyc/xhgui.git cd xhgui php install.php
PS: xhgui官方版本已經很久不更新,很多符號和單位都不適合中國用戶。為了方便自己,我單獨維護了一個版本,不斷的在更新中。安裝這個版本,將有更好的體驗。需要安裝原版的請執行下麵的命令
git clone https://github.com/perftools/xhgui cd xhgui php install.php
如果你的MongoDB安裝在當前機器,可以不用修改xhgui的配置文件,如果不是你需要在配置文件中修改MongoDB的連接ip和域名,xhgui/config/config.default.php。當然你也可以選擇直接存為文件。
// Can be either mongodb or file. /* 'save.handler' => 'file', 'save.handler.filename' => dirname(__DIR__) . '/cache/' . 'xhgui.data.' . microtime(true) . '_' . substr(md5($url), 0, 6), */ 'save.handler' => 'mongodb', // Needed for file save handler. Beware of file locking. You can adujst this file path // to reduce locking problems (eg uniqid, time ...) //'save.handler.filename' => __DIR__.'/../data/xhgui_'.date('Ymd').'.dat', 'db.host' => 'mongodb://127.0.0.1:27017', 'db.db' => 'xhprof',
-
測試MongoDB連接情況並優化索引;
你在當前機器安裝過mongo客戶端才能調用mongo命令。
$ mongo > use xhprof > db.results.ensureIndex( { 'meta.SERVER.REQUEST_TIME' : -1 } ) > db.results.ensureIndex( { 'profile.main().wt' : -1 } ) > db.results.ensureIndex( { 'profile.main().mu' : -1 } ) > db.results.ensureIndex( { 'profile.main().cpu' : -1 } ) > db.results.ensureIndex( { 'meta.url' : 1 } )
-
配置Nginx;
Nginx需要加入兩處配置,一個是PHP_VALUE:
server { listen 80; server_name site.localhost; root /Users/markstory/Sites/awesome-thing/app/webroot/; fastcgi_param PHP_VALUE "auto_prepend_file=/Users/markstory/Sites/xhgui/external/header.php"; }
另一個是需要配置一個路徑指向5中安裝的xhgui的webroot目錄,如下配置為單獨申請了一個域名:
server { listen 80; server_name blog110.it2048.cn; root /home/admin/xhgui/webroot; location / { index index.php; if (!-e $request_filename) { rewrite . /index.php last; } } location ~ \.php$ { fastcgi_pass 127.0.0.1:9001; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
如果安裝很順利,此時訪問 https://blog110.it2048.cn 能看到效果。詳細的效果圖可以看這裏 https://github.com/laynefyc/xhgui
最後我們來說說頻率如何配置,還是在xhgui的config/config.default.php文件中
'profiler.enable' => function() {
// 如果域名為我們新建的域名則不捕獲
if($_SERVER['SERVER_NAME'] == 'blog110.it2048.cn'){
return False;
}else{
// 100%采樣,默認為1%
return True;//rand(1, 100) === 42;
}
}
數據存儲到MongoDB之後,UI如何展示需要我們自己探究。比如將英文換成中文,添加曲線圖和餅圖等等。至此已經能實時監控我們項目的CPU、內存的消耗情況。哪些接口執行慢也能一目了然。https://github.com/laynefyc/xhgui 這是我維護的一個xhpui漢化版本,歡迎使用和 提建議
我的博客地址:Tideways和xhgui打造PHP非侵入式監控平台
最後更新:2017-06-12 00:31:58