PHPTrace 0.3發布,做個靠譜的線上調試工具

phobosq 9年前發布 | 8K 次閱讀 qihoo 調試工具 PHP phpTrace

最近兩周,PHPTrace發布了0.3版本,這次新版本發布距離上一次更新將近兩個月。在這段時間里,我們放緩了新功能的開發,重新推敲這個工具能夠為大家帶來的價值,并且在細節和穩定性方面都有了很大的提升。

PHPTrace是什么? PHPTrace是一個低開銷的用于跟蹤、分析PHP運行情況的工具。

它可以跟蹤PHP在運行時的函數調用、請求信息、執行流程,并且提供有過濾器、統計信息 、當前狀態等實用功能。在任何環境下,它都能很好的定位阻塞問題以及在高負載下Debug,尤其是線上產品環境

下面將分為兩部分,首先會簡單介紹下新版本帶來的改動,然后展開講下我們是如何確保PHPTrace在線上運行時穩定、低開銷的。

新版本改動

PECL

相信有心的同學一定發現PHPTrace出現在PECL了。

沒錯,我們將新版本發布到了PHP官方的擴展庫中,伴隨而來的還有:

  • 開源協議變更為Apache 2.0
  • 擴展的名稱變更為trace

關注細節

為了將trace功能本身做到極致,我們對PHP的擴展做了重構,并且著重完善了很多細節:

  • 新增對main函數includerequire閉包匿名函數eval()等特殊調用的支持
  • 新增對PHP緊急退出后未完成的調用信息的持續收集
  • 新增對Trait的Alias名稱支持
  • 新增對PHP 5.1的支持
  • 優化zval的表現形式,完善對數組、對象的支持
  • 優化擴展在非trace期間的性能(通過Zend/bench.php測試與不加載擴展時一致)

這里可以查看全部改動的說明。

如何保證線上運行時穩定、低開銷?

PHPTrace在誕生之初,只是單純的為了解決360 Web服務在線上運行中遇到的一些疑難雜癥,但就是這么一個簡單的小需求,真正做起來卻遇到了很多挑戰。

開源后,在與用戶的交流中,也收集到很多反饋,其中很多是關于“在線上生產環境使用是否靠譜的疑慮”。這里想說的是:這些擔心并不多余,作為負責任的開發者,保證自己的項目無差錯的穩定運行是最基本的品質。

作為PHPTrace的開發者,這種擔心其實更多。因為從實現原理上講,為了追蹤到執行過程,PHPTrace的PHP擴展需要將Zend引擎的執行函數zend_execute_ex()替換掉。這是整個PHP執行過程中最核心的函數,任何開銷大的處理或是可能出錯誤的邏輯都可能導致嚴重后果。

在經歷一些線上問題后,我們總結了對PHPTrace的兩大原則性的要求,分別是:低開銷兼容性。根據這兩條我們制定了一系列的測試、發布流程,來確保正式版的代碼能夠滿足線上運行的要求。

低開銷

額外的性能開銷,是開發調試類擴展的硬傷。因為為了調試方便,必須要有更多的額外處理才能獲取到豐富的運行時信息,所以像xdebug這樣的工具很少能放到線上環境運行。

PHPTrace在設計開發之初的目標就是為了解決線上問題,所以在僅加載擴展,不開啟trace功能時的開銷極低。

同時,對于線上環境我們很難頻繁以修改php.ini配置文件的形式來控制擴展的開關。在這方面,PHPTrace通過共享內存中的標志位來控制是否進行處理,做到了隨用隨開

下面是兩個性能測試,應用測試因為時間關系只使用比較熱門的Laravel框架,通過httpd中的ab命令對Laravel框架的默認index.php請求。其中加載xx擴展特指僅加載擴展,不開啟額外功能

項目 Requests/s Percent
不加載擴展 293 100%
加載trace擴展 288 98.29%
加載xdebug擴展 132 45.05%

可以看到目前加載PHPTrace與不加載時對整體開銷的影響在1%左右,比xdebug要好很多。

為了更深入的驗證對性能的影響,我們還使用了PHP官方的Zend/bench.php腳本進行了測試,結果如下:

bench

關于測試結果,在這里需要解釋一下,上面兩個測試的環境都是比較孤立的,排除了數據庫、網絡、接口等層面的影響,所以對性能影響的比例會被放大一些。在實際線上運行時的影響會比表中的數據低很多。

兼容性

相對于性能來講,穩定性則更為重要。和PHP代碼中的常見錯誤不同,一旦擴展中出現問題,產生的后果可能會大的多。

針對這一點,我們為PHPTrace制定了嚴格的測試流程,主要包含了:

  • 擴展在不同PHP版本下的兼容性、性能開銷
  • 通用模塊的功能測試
  • 主流框架的實際運行測試

同時,因為擴展端需要深入到Zend引擎的執行過程中,我們還會在開啟trace功能的同時跑完所有PHP源碼包里的單元測試,以確保一些較新的問題也能夠測試到。

具體的情況可以看下面這個表格,每一行是一個PHP版本,每一列是一個需要通過測試的大項。

Version shared static
編譯 測試:擴展 編譯 測試:擴展 測試:Zend 功能:Trace
5.0.5 no no no no no no
5.1.1 yes no yes no no yes
5.2.5 yes yes yes yes yes yes
5.2.17 yes yes yes yes yes yes
5.3.10 yes yes yes yes yes yes
5.3.29 yes yes yes yes yes yes
5.4.40 yes yes yes yes yes yes
5.5.10 yes yes yes yes yes yes
5.5.24 yes yes yes yes yes yes
5.6.8 yes yes yes yes yes yes

新功能調查

為了更好的服務PHP開發者,為開源做貢獻。我們歡迎大家參與進來一同為PHPTrace做貢獻,下面是一個新功能的調查問卷,如果有期待的新功能或是一些建議,歡迎在這里提交。

問卷地址:http://www.diaochapai.com/survey/7686734b-7d57-4733-a7ea-30a7042a98df

我們為此特別準備了一些小禮品,請留下您的聯系方式,如果您的建議被采納,我們會主動聯系您。

聯系我們:g-infra-webcore(at)list.qihoo.net

 本文由用戶 phobosq 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!