開源PHP監控擴展:witness簡介
1. 問題的由來
PHP作為流行的服務器端腳本語言,廣泛地用于各種服務器前端及應用的開發。雖然PHP作為腳本語言,天然具有良好的入門簡單、容錯性強、性能較高(在腳 本語言中)的特點,但是,由于其多進程的執行模式,和前端Web系統通常采用多機器并行的運行模式,導致在線上出現的某些和特定用戶相關的問題時,很難收 集全面的信息。
- 多進程+多機器+用戶請求隨機分發,導致不知道某個用戶的請求會在哪臺機器的哪個進程執行;
- 如果在所有機器和進程都加入調試語句,會導致大量的無關日志輸出,或可能影響無關的用戶;
- 由于同一用戶的兩個請求是被隨機分散的,導致難以獲取具體某個用戶出錯時的點擊流;
- 在大型系統中,由于組件多,關聯復雜,不容易直接定位問題源頭出自哪個模塊以增加輸出信息;
- 通過輸出日志等方式,往往需要多次嘗試后才能逐步逼近問題的源頭,對提高查錯速度不利;
- 這種即時在線上增加調試或者寫日志的代碼,可能引入意外的bug,帶來額外風險。
另外,作為一種輕便的快速開發腳本,加上現在流 行的敏捷等快速開發模式,不管它們吹噓得如何天花亂墜,對于測試的完備性、代碼的健壯性,其實質效果是大大降低的。所以,在上線后發現問題再快速打補丁或 者快速迭代,是業內一種常見的模式。而在這個環節中,快速定位問題是打補丁或者后續迭代的前提。
于是,針對這種情況,我們開發了witness系統(witness--證人,它的證詞可以幫助我們還原“犯罪”現場)。該系統能讓我們在處理上述問題時,更簡便,更有效率,更全面的得到所有相關數據,從而加快分析問題和處理問題的過程。
witness系統的主要特點如下:
- 非嵌入式監控,無需修改運行的PHP代碼
- 可以通過cookie監控特定的請求
- 輕量級,靈活度高
- 高性能
項目已開源:https://github.com/ucweb/witness
2. 系統架構
PHP分析調試系統主要分為三部分:witness擴展、數據傳輸,數據展示。
總體架構如下圖:
2.1. witness擴展
witness擴展主要的功能是嵌入PHP引擎底層,監控和收集一切可用的信息,并通過數據傳輸系統,反饋到后端,以便于分析處理這些數據。
witness擴展目前可以有兩種監控模式,如下表:
方式 |
功能 |
備注 |
trace |
記錄從開始到結束期間,所有函數調用的次序,以及這些調用參數、返回值等。同時也會記錄當前一些關鍵的環境參數和請求參數。 |
適用于監控整個邏輯處理流程 |
dump |
記錄當前的調用棧的靜態信息,包括每層函數執行的當前行號、每層調用的參數、局部變量,全局變量、靜態變量等 |
適用于監控當前某個點的整體狀態 |
簡單的對這兩種模式做個對比:trace模式就好比拍視頻,dump模式就相當于拍照片--視頻能展現連續變化,而照片則會保留更多細節,清晰度也更高。
2.2. 數據傳輸
主要功能有三點:
- 收集本地各進程的witness擴展傳出的信息,并整理成獨立的數據文件;
- 收集位于各臺機器上的數據文件,匯總到MQ中;
- 從MQ上獲取相關的數據導入到后端的展示系統中。
2.3. 數據展示
由于witness后端的數據采用SQLite存儲文件,所以它并不適合直接閱讀和分析(可以通過SQLite的cli接口可以直接閱讀這些db文件,但是很不直觀)。因此,一般情況下都建議使用腳本,將其中信息提取加工后,進行可視化展示。
目前我們附帶有基于本地源代碼展開的示例腳本,位于:
scripts/genhtml.php |
如果現有項目有自己的控制平臺,可以根據實際情況,將其根據實際情況和需求,做具體的適配。
3. 使用witness
3.1. 系統依賴
以下是witness擴展的一些依賴和限制,包括目前已經測試通過并上線運行的配置:
項目 |
依賴 |
已測試 |
操作系統 |
僅支持linux兼容系統,不支持Windows系統 |
RHEL 5.4 |
內核 |
2.6或以上 |
2.6.18-164.el5 |
位寬 |
x86/x86_64/amd64 一般而言不推薦x86,因為可能會遇到內存瓶頸 |
x86_64 |
gcc |
gcc 4.1.2或以上 |
gcc version 4.1.2 20080704 Red Hat 4.1.2-48 |
PHP |
5.3.X或以上(參見注意事項) |
5.3.4/5.3.8 |
SQLite |
3.3.6或以上 |
SQLite version 3.3.6 |