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

sibenx發表於2017-06-12

當我們發現生產環境的某個介面執行時間特別長時應該怎麼做?是不是直接登入線上機器單步除錯?或者打大量的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-branch/external/header.php”;

程式碼的含義:在執行主程式前都執行我們指定的PHP指令碼

具體如何安裝這個服務,我在文章的下半部分會詳細說明。現在我們需要知道『非侵入式的監控』就是不用改動一行專案程式碼。

三. 每個請求都生成日誌會不會影響服務本身?

使用者的每次請求都生成執行日誌對服務會有輕微的影響。雖然tideways.so擴充套件提供的監控方式是非侵入式的不會影響線上專案,但對CPU和記憶體的消耗是不可忽略的。為了減少對記憶體和CPU的消耗,我們可以控制生成日誌的頻率,還能編寫生成日誌的規則。預設頻率為1%(每100個請求生成1條日誌,這裡的概率非絕對)。

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

搭建非侵入式監控環境

  1. 安裝PHP mongodb擴充套件;

    >sudo pecl install mongodb
    
  2. 安裝PHP tideaways擴充套件;

    
    tideaways的文件寫的非常詳細,[安裝tideaways擴充套件(官方文件)](https://tideways.io/profiler/docs/setup/installation) 這裡我用Centos舉例。
    
    > 1. echo "[tideways]
  3. = 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擴充套件](https://tideways.io/profiler/docs/setup/installation#redhatfedoracentos)
  1. 修改php.ini檔案;

    我們需要在php.ini檔案中引入擴充套件

    [mongodb]
    extension=mongodb.so
    [tideways]
    extension=tideways.so
    ;不需要自動載入,在程式中控制就行
    tideways.auto_prepend_library=0
    ;頻率設定為100,在程式呼叫時能改
    tideways.sample_rate=100
  2. 安裝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

  3. 安裝xhgui;

    git clone https://github.com/laynefyc/xhgui-branch.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`,
  4. 測試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 } )
  5. 配置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-branch/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;
        }
    }

如果安裝很順利,此時訪問 http://blog110.it2048.cn 能看到效果。詳細的效果圖可以看這裡 https://github.com/laynefyc/xhgui-branch

首頁截圖
首頁截圖

瀑布圖
瀑布圖

函式監控圖
函式監控圖

最後我們來說說頻率如何配置,還是在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-branch 這是我維護的一個xhpui漢化版本,歡迎使用和 提建議

我的部落格地址:Tideways和xhgui打造PHP非侵入式監控平臺


相關文章