前幾天有位朋友在公衆号問我, 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
是将 PHP 的
zend_execute
zend_execute_ex
包裹一層。而
Deliverer
是在
opcode
執行環節中,針對特定的
opcode
類型做處理,調用次數要少一些,但是都這都是微乎其微的差别。
同時
Deliverer
隻會在開啟監聽(下載下傳壓縮包之後,執行
./bin/deliverer -t
)之後才會生效,否則是不會采集日志的,是以線上提前安裝也沒有問題,隻要不開啟監聽,不會有任何性能損耗。
最後
場景不一樣而已,xhprof 是一個非常棒的工具,并沒有黑它的意思。
Deliverer
已支援 PHP5 和 PHP7.