PHPTrace 0.3發布,做個靠譜的線上調試工具
最近兩周,PHPTrace發布了0.3版本,這次新版本發布距離上一次更新將近兩個月。在這段時間里,我們放緩了新功能的開發,重新推敲這個工具能夠為大家帶來的價值,并且在細節和穩定性方面都有了很大的提升。
PHPTrace是什么? PHPTrace是一個低開銷的用于跟蹤、分析PHP運行情況的工具。
它可以跟蹤PHP在運行時的函數調用、請求信息、執行流程,并且提供有過濾器、統計信息 、當前狀態等實用功能。在任何環境下,它都能很好的定位阻塞問題以及在高負載下Debug,尤其是線上產品環境。
下面將分為兩部分,首先會簡單介紹下新版本帶來的改動,然后展開講下我們是如何確保PHPTrace在線上運行時穩定、低開銷的。
新版本改動
PECL
相信有心的同學一定發現PHPTrace出現在PECL了。
沒錯,我們將新版本發布到了PHP官方的擴展庫中,伴隨而來的還有:
-
開源協議變更為
Apache 2.0
-
擴展的名稱變更為
trace
關注細節
為了將trace功能本身做到極致,我們對PHP的擴展做了重構,并且著重完善了很多細節:
-
新增對
main函數
、include
、require
、閉包
、匿名函數
、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
腳本進行了測試,結果如下:
關于測試結果,在這里需要解釋一下,上面兩個測試的環境都是比較孤立的,排除了數據庫、網絡、接口等層面的影響,所以對性能影響的比例會被放大一些。在實際線上運行時的影響會比表中的數據低很多。
兼容性
相對于性能來講,穩定性則更為重要。和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