php7中使用 xhprof 分析

開篇語

這是篇純文檔,若是之後有須要能夠隨時查找, 使用 xhprof 進行分析, 方便代碼測試、對比分析(支持php7).php

前置構建 docker 虛擬測試環境

docker run -it -p 80:80 -v /Users/xxx/Desktop/xhprof:/data phalcon /bin/bash
複製代碼

1. 安裝xhprof

支持php7的xhprof還挺多的, 咱們這裏使用 github.com/longxinH/xh… 這個項目。html

1.1 拉取項目

git clone https://github.com/longxinH/xhprof.git
複製代碼

1.2 安裝項目

cd xhprof/extension/
/usr/server/php7/bin/phpize
./configure --with-php-config=/usr/server/php7/bin/php-config
make && make install
複製代碼

1.3 添加 xhprof.so 拓展

執行完最後,咱們須要將此 so 文件引入到php.ini配置下git

查看 php.ini 文件路徑github

/usr/server/php7/bin/php --ini

Configuration File (php.ini) Path: /usr/server/php7/etc
Loaded Configuration File:         /usr/server/php7/etc/php.ini
Scan for additional .ini files in: /usr/server/php7/etc/php
Additional .ini files parsed:      (none)
複製代碼

編輯 /usr/server/php7/etc/php.iniweb

[Xhprof]
extension=xhprof.so
xhprof.output_dir=/data/logs
複製代碼

重啓 php-fpm 便可。docker

2. 使用 xhprof

搭建案例過程略bash

咱們在要監控的邏輯前面嵌入下面代碼markdown

\xhprof_enable();
......
$order = new OrderAdepter();
$result = $order->getUserOrderByOrderNo(123);
......
$xhprof_data = \xhprof_disable();
print_r($xhprof_data);
複製代碼

output:php7

咱們發現調用了xhprof拓展中的兩個函數, 輸出值含義composer

ct 表示 當前這個函數調用的次數,此案例都是1次
wt 表示 函數執行時間的耗時,單位爲微秒
複製代碼

看到這裏發現, 咱們獲取的信息並非不少, 好比咱們常常還要關心佔用的內存、cpu等指標.

\xhprof_enable(
    XHPROF_FLAGS_MEMORY  
    +XHPROF_FLAGS_CPU
    +XHPROF_FLAGS_NO_BUILTINS
);
複製代碼

output:

  1. XHPROF_FLAGS_MEMORY 統計內存佔用

  2. XHPROF_FLAGS_CPU 統計cpu佔用

  3. XHPROF_FLAGS_NO_BUILTINS 不統計內置函數, 這次輸出能夠看到已經忽略了咱們拓展中的函數

咱們發現統計內存佔用的字段, 有兩個輸出 mu 和 pmu , mu 表示使用的內存(bytes), pmu 表示使用的內存峯值(bytes)

3. 圖表xhprof

固然,咱們仍是更但願圖表的形式能夠更直觀的觀察性能瓶頸, 下面咱們看下怎麼使用.

3.1 這時候須要咱們用到 xhprof_lib 庫

在咱們下載 xhprof 源碼時候,目錄中已經包含了

\xhprof_enable(XHPROF_FLAGS_MEMORY + XHPROF_FLAGS_CPU+XHPROF_FLAGS_NO_BUILTINS);

......
$order = new OrderAdepter();
$result = $order->getUserOrderByOrderNo(123);
......

$xhprof_data = \xhprof_disable();

include_once  '/data/xhprof-master/xhprof_lib/utils/xhprof_lib.php';
include_once  '/data/xhprof-master/xhprof_lib/utils/xhprof_runs.php';
$xhprof_runs = new \XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, 'your_project');
echo $run_id; //output 5cbf25e21fe9b
複製代碼

執行打印出來一個字符串, 這個咱們能夠理解爲文件標識符. 咱們發現執行了 save_run 方法,那保存到哪裏了呢.

您還記得咱們在引入 xhprof.so 拓展時候的另外一個配置嗎?

沒錯, 在 xhprof.output_dir 配置的路徑下(須要本身手動建立下目錄)

感興趣能夠打開看看, 裏面存了咱們分析的一些序列化對象信息.

3.2 配置一個單獨的服務來訪問咱們的分析結果

咱們指向咱們xhprof項目中的 xhprof_html 目錄

相信你到此明白了 咱們的 run_id 和 save_run中的project 的做用了

咱們最上面部分是請求的接口指標總覽, 下面是具體的每一個調用函數的執行狀況。

字段名 含義
Calls 調用次數
Incl. Wall Time 調用的包括子函數全部花費時間,以微秒算
Excl. Wall Time 函數執行自己花費的時間,不包括子樹執行時間,以微秒算
Incl. CPU 調用的包括子函數全部花費的cpu時間
Excl. CPU 函數執行自己花費的cpu時間,不包括子樹執行時間,以微秒算
Incl.MemUse 包括子函數執行使用的內存, 以字節算
Excl.MemUse 函數執行自己內存,以字節算
Incl.PeakMemUse Incl.MemUse的峯值
Excl.PeakMemUse Excl.MemUse的峯值

其他後面的 % 結尾均爲對應的佔比

3.3 [View Full Callgraph]

若是查看調用流程須要安裝 graphviz 圖形庫. 這裏咱們推薦手動安裝 graphviz 2.24.0 這個版本(親自踩坑,2.40不支持)

yum -y install libtool-ltdl-devel

cd /data/graphviz-2.24.0

./configure
make
make install
複製代碼

紅色部分和黃色部分重點關心下,若是感受只想分析某個流程, 能夠點擊到某個方法裏面再點擊【View Full Callgraph】查看圖表

4. 問題點

咱們在上面使用xhprof的時候發現了強依賴, 在代碼中引入了 xhprof 安裝包裏的幾個類.

include_once  '/data/xhprof-master/xhprof_lib/utils/xhprof_lib.php';
include_once  '/data/xhprof-master/xhprof_lib/utils/xhprof_runs.php';
複製代碼

這裏咱們可使用composer包引用來實現相同功能, 這裏推薦引入 pbweb/xhprof 包。

5. 結束

但願你們工做開心

更多精彩關注公衆號【呆呆熊一點通】

相關文章
相關標籤/搜索