閱讀780 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Tideways和xhgui打造PHP非侵入式監控平台

當我們發現生產環境的某個接口執行時間特別長時應該怎麼做?是不是直接登錄線上機器單步調試?或者打大量的log然後分析? 一般我們可以把分析流程分為如下幾步操作:

雲棲社區的MarkDown渲染做的太差了,編號都錯位,大家還是到我的博客看吧 Tideways和xhgui打造PHP非侵入式監控平台

  1. 分析開發環境下執行是否會慢;

    如果是代碼問題,在開發環境下就能檢測出來;

  2. 分析預發環境執行是否會慢;

    如果是數據庫或者第三方擴展問題,在預發環境就能檢查出來。

  3. 從生產環境摘一台機器,分析代碼執行慢的原因;

    如果是機器的問題,在生產環境就能檢查出來。

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條日誌,這裏的概率非絕對)。

如果有多台服務器,隻需要對一台進行監控,機器比較多的話可以每個機房一台。

搭建非侵入式監控環境

  1. 安裝PHP mongodb擴展;

    sudo pecl install mongodb

  2. 安裝PHP tideaways擴展;

    tideaways的文檔寫的非常詳細,安裝tideaways擴展(官方文檔) 這裏我用Centos舉例。

    1. echo "[tideways]
      name = Tideways
      baseurl = https://s3-eu-west-1.amazonaws.com/qafoo-profiler/rpm" > /etc/yum.repos.d/tideways.repo

    2. rpm --import https://s3-eu-west-1.amazonaws.com/qafoo-profiler/packages/EEB5E8F4.gpg

    3. yum makecache --disablerepo=* --enablerepo=tideways

    4. yum install tideways-php tideways-cli tideways-daemon

    PS: MarkDown的語法轉換可能有部分問題,容易把中劃線轉沒了,這裏建議安裝時從官網COPY命令,安裝tideaways擴展

  3. 修改php.ini文件;

    我們需要在php.ini文件中引入擴展

    [mongodb]
    extension=mongodb.so
    [tideways]
    extension=tideways.so
    ;不需要自動加載,在程序中控製就行
    tideways.auto_prepend_library=0
    ;頻率設置為100,在程序調用時能改
    tideways.sample_rate=100
    
  4. 安裝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

  5. 安裝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',
    
  6. 測試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 } )
    
  7. 配置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

  上一篇:go  Deepgreen與Greenplum TPC-H性能測試對比(使用德哥腳本)
  下一篇:go  Deepgreen(Greenplum)數據表集中Analyze腳本