天天看點

聊一聊 Deliverer 與 Xhprof 的差別适用場景性能最後

前幾天有位朋友在公衆号問我,

Deliverer

Xhprof

有什麼差別嗎?一句話:

Xhprof

是一個排查性能問題的工具,為系統性能做保障;

Deliverer

是一個排查 Bug 的工具,為系統可用性服務。

适用場景

Xhprof

Xhprof

是一個排查性能問題的工具,為系統整體性能做保障。比如

發現某個接口比較慢,為了能夠更清楚的找到性能瓶頸,則可以這樣配置

php.ini

配置

extension=xhprof.so
xhprof.output_dir=/tmp/xhprof
auto_prepend_file=/var/www/mengkang.test/header.php
auto_append_file=/var/www/mengkang.test/footer.php           

/var/www/mengkang.test/footer.php

的具體代碼可以是

$xhprof_data = xhprof_disable();

$total_time = $xhprof_data["main()"]["wt"];
$total_time = round($total_time/1000,2);

$XHPROF_ROOT = __DIR__;
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";

$xhprof_runs = new XHProfRuns_Default('/tmp/xhprof');
$run_id = $xhprof_runs->save_run($xhprof_data, "test");

$trace_id = isset($GLOBALS['rpc_trace_id']) ? $GLOBALS['rpc_trace_id'] : "";

$XHPROF_URL='http://mengkang.test/xhprof_html/index.php?time='.$total_time.'&run='.$run_id.'&source=test&trace_id='.$trace_id;

file_put_contents("/tmp/xhprof".date('Ymd').".log",$XHPROF_URL."\n",FILE_APPEND);           

其中

rpc_trace_id

是各個系統自己透傳的,友善定位上下遊的鍊路。同時接口的傳回值中都會帶上這個

requestId

(rpc_trace_id),如此之後則再通路

http://mengkang.test/xhprof_html/index.php?time=xxx&run=

{run_id}&source=test&trace_id=xxx 來跳轉到

run_id

對應的 xhprof 的分析報告上。

還有類似的場景就是針對線上,指定門檻值的慢請求(比如響應時間超過 3s)才進行

$xhprof_runs->save_run

,如果怕有性能損耗,可以抽樣或者排重,看業務容忍度。

另一方面,如果業務邏輯中存在 bug 或者寫了 exit 代碼,最後導緻這個性能采集失效,當然可以嘗試下通過監聽系統信号量的方式來主動調用

footer.php

的代碼。

而且 xhprof 的調用鍊的檢視方式依賴層層點選,不太利于分析。這不是它的缺點,隻是說明下這不是它想解決的問題場景

Deliverer

Deliverer

是一個排查 Bug 的工具,為系統可用性服務。在不使用

Deliverer

的情況下,隻能使用

strace

來根據系統調用的情況來排查問題,一方面系統調用日志繁雜、特别多;另一方面,看到的都是系統調用的函數,需要反推出在 php 裡面的函數或者方法,需要有經驗的猜。

因為

php-fpm

子程序也是常駐的,用

strace

跟的時候,每個請求的日志也是不分割的,檢視起來比較麻煩,并且不知道請求的上下文,針對使用

strace

遇到的這些小問題,以上就是

Deliverer

的設計初衷。

https://github.com/zhoumengkang/deliverer https://gitee.com/zhoumengkang/deliverer 如何安裝使用見該項目的 readme

既然是了排查 bug 而生,

Deliverer

不僅僅局限于

php-fpm

模式下的環境,不管是什麼入口,隻需要監聽過濾指定的檔案、方法、類名、函數即可。會在日志最前面一行列印 pid、ts、sapi、http 資訊、cli 參數,友善我們追蹤定位問題的源頭。

聊一聊 Deliverer 與 Xhprof 的差別适用場景性能最後

性能

在資料日志的采集上略有不同,

Deliverer

性能損耗更小,因為

Xhprof

是将 PHP 的

zend_execute

zend_execute_ex

包裹一層。而

Deliverer

是在

opcode

執行環節中,針對特定的

opcode

類型做處理,調用次數要少一些,但是都這都是微乎其微的差别。

同時

Deliverer

隻會在開啟監聽(下載下傳壓縮包之後,執行

./bin/deliverer -t

)之後才會生效,否則是不會采集日志的,是以線上提前安裝也沒有問題,隻要不開啟監聽,不會有任何性能損耗。

最後

場景不一樣而已,xhprof 是一個非常棒的工具,并沒有黑它的意思。

Deliverer

已支援 PHP5 和 PHP7.