iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 26
2
Modern Web

成為 Modern PHPer系列 第 26

Day 26:Profiling 概述

前言

通常來說,程式常常會有兩種問題:邏輯問題與性能問題。至於 Syntax Error 這種低級問題根本還算不上程式的問題

為了確定 PHP 程式中的性能瓶頸所在,我們通常會依靠 Profiler,找出是什麼時候、什麼函式、傳入了什麼參數以及花費了多少時間,甚至還能看到整個應用程式的生命周期間用了多少的記憶體、CPU、磁碟 IO 或網路 IO。

種類

Xdebug

PHP 老牌的 Debugger 其實也具備 Profiler 的功能,然而因為對於性能有極大的影響所以只能在開發環境中使用。

在安裝 xdebug 之後,可在 php.ini 中加入以下設定以啟用 xdebug profiler:

xdebug.profiler_enable = 0
xdebug.profiler_enable_trigger = 1
xdebug.profiler_output_dir = /tmp/xdeubg/profiler

xdebug.profiler_enalbe = 0:不讓 Xdebug Profiler 自動啟動,否則在執行其它 PHP 程式時也會自動啟動(例如 composer 或 phpunit)
xdebug.profiler_enable_trigger = 1:在 HTTP REQUEST 或在 COOKIE 裡加入 XDEBUG_PROFILER=1,即可在單個請求中啟動 Xdebug Profiler
xdebug.profiler_output_dir:指定 profiling 的結果會放到哪個資料夾,profiling 的資料通常不小,記得指定一個具備足夠空間的磁碟

Xdebug Profiler 生成的結果是 CacheGrind 格式,我個人是偏好使用 KCacheGrind。

XHProf

XHProf 原本是 Facebook 開源的 Profiling 工具,然而它並沒有跟著 PHP 7 一起釋出新版。

目前由 Tideways Fork 出來的版本成為主流(Tideways 原本就是做 Profiling/Tracing as a Service 服務),雖然 Tideways 屬於商業導向的公司,但其 XHProf 仍是開源使用,只要不使用他們的服務其實是不會收費的。

詳細的安裝及使用方式可以參閱 tideways/php-xhprof-extension

XHProf 所產生的結果是自有的結構,通常會依靠 XHGUI 來做分析

與 Xdebug 相比,它收集的資料較少,但是因為效率比較高,所以可以在正式環境中使用。

Blackfire

Blackfire 由 Symfony 主導,它可以收集的資料量約在 Xdebug 與 XHProf 之間,但是它的免費使用僅有開發版本(最便宜的每月 29 美金,需年付)

Blackfire 因為經過多次版本更迭,不確定我的記憶是否與目前有所出入,如有出入以官方為主。

Blackfire 會在作業系統中安裝兩個東西:profiler php extension 與 agent。利用 profiler extension 收集相關資訊後再使用 agent 將資料傳回 blackfire 做可視化,同時有提供 chrome extension 可以即時操作。

Swoole Tracker

這個是我昨天在看 Swoole 4.3 的新版資料時偶然發現的,該系統由 Swoole 開發團隊所建置,定位上有點類似於 Blackfire,在沒有要求 clickhouse 支援的情況下可以免費使用(要求 clickhouse 支援的話一年是 5 萬人民幣)

Swoole Tracker 以 XHProf 為基礎並經過一些魔改以適應 swoole(上面寫的所有 profiler 都無法用於 swoole)。

詳細的介紹可以直接參閱官方的 Demo 影片:https://www.swoole-cloud.com/tracker.html

後記

在 Modern PHP 一書中對於 Profiler 還有提到 New Relic,不過因為我沒使用過所以略過不提。

事實上,當時 Facebook 在 PHP7 釋出之後遲未更新 XHProf 我還以為這個 profiler 就被放棄了。所幸有 tideways 接下維護的工作,至於如果有一天 tideways 倒閉,是否還有其它人願意接手就不得而知了。

Blackfire 因為後面由 Symfony 撐腰,而且已經活躍了五、六年了應該算是比較穩定的選擇;Swoole Tracer 算是後起之秀的新型服務,我很期待它未來的發展。


上一篇
Day 25:Swoole 帶來的變革
下一篇
Day 27:另一個佈署時期的選擇 Roadrunner
系列文
成為 Modern PHPer30

尚未有邦友留言

立即登入留言