測量PHP 應用程序
如果不使用New Relic也有其他的選擇尤其是對PHP有好幾款工具都可以幫助進行性能剖析其中一款叫做xhprof(http://peclphpnet/package/xhprof)這是Facebook開發給內部使用的在 年開源了xhprof 有很多高級特性並且易於安裝和使用它很輕量級可擴展性也很好可以在生產環境大量部署並全天候使用它還能針對函數調用進行剖析並根據耗費的時間進行排序相比xhprof還有一些更底層的工具比如xdebugValgrind 和cachegrind可以從多個角度對代碼進行檢測注有些工具會產生大量輸出並且開銷很大並不適合在生產環境運行但在開發環境卻可以發揮很大的作用
下面要討論的另外一個PHP 性能剖析工具是我們自己寫的基於本書第二版的代碼和原則擴展而來名叫IfP(instrumentationforphp)代碼托管在Goole Code 上(http://codegooglecom/p/instrumentationforphp/)Ifp 並不像xhprof 一樣對PHP 做深入的測量而是更關注數據庫調用所以當無法在數據庫層面進行測量的時候Ifp 可以很好地幫助應用剖析數據庫的利用率Ifp 是一個提供了計數器和計時器的單例類很容易部署到生產環境中因為不需要訪問PHP 配置的權限(對很多開發人員來說都沒有訪問PHP配置的權限所以這一點很重要)
Ifp 不會自動剖析所有的PHP 函數而只是針對重要的函數例如對於某些需要剖析的地方要用到自定義的計數器就需要手工啟動和停止但Ifp 可以自動對整個頁面的執行進行計時這樣對自動測量數據庫和memcached 的調用就比較簡單對於這種情況就無須手工啟動或者停止這也意味著Ifp 可以剖析三種情況應用程序的請求(如page view)數據庫的查詢和緩存的查詢Ifp 還可以將計數器和計時器輸出到Apache通過Apache 可以將結果寫入到日志中這是一種方便且輕量的記錄結果的方式Ifp 不會保存其他數據所以也不需要有系統管理員的權限
使用Ifp只需要簡單地在頁面的開始處調用start_request()理想情況下在程序的一開始就應當調用
require_once(Instrumentationphp)
Instrumentation::get_instance()>start_request()
這段代碼注冊了一個shutdown函數所以在執行結束的地方不需要再做更多的處理
IFP會自動對SQL添加注釋便於從數據庫的查詢日志中更靈活地分析應用的情況通過SHOW PROCESSLIST也可以更清楚地知道性能低的查詢出自何處大多數情況下定位性能低下查詢的來源都不容易尤其是那些通過字符串拼接出來的查詢語句都沒有辦法在源代碼中去搜索那麼IFP的這個功能就可以幫助解決這個問題它可以很快定位到查詢是從何處而來的即時應用和數據庫中間加了代理或者負載均衡層也可以確認是哪個應用的用戶是哪個頁面請求是源代碼中的哪個函數代碼行號甚至是所創建的計數器的鍵值對下面是一個例子
File: indexphp Line: Function: fullCachePage request_id: ABC session_id: XYZ
SELECT * FROM …
如何測量MySQL 的調用取決於連接MySQL 的接口如果使用的是面向對象的mysqli接口則只需要修改一行代碼將構造函數從mysqli 改為可以自動測量的mysqli_x 即可mysqli_x 構造函數是由Ifp 提供的子類可以在後台測量並改寫查詢如果使用的不是面向對象的接口或者是其他的數據庫訪問層則需要修改更多的代碼如果數據庫調用不是分散在代碼各處還好否則建議使用集成開發環境(IDE)如Eclipse這樣修改起來要容易些但不管從哪個方面來看將訪問數據庫的代碼集中到一起都可以說是最佳實踐
Ifp 的結果很容易分析Percona Toolkit 中的ptquerydigest 能夠很方便地從查詢注釋中抽取出鍵值對所以只需要簡單的將查詢記錄到MySQL 的日志文件中再對日志文件進行處理即可Apache 的mod_log_config 模塊可以利用Ifp 輸出的環境變量來定制日志輸出其中的宏%D 還可以以微秒級記錄請求時間
也可以通過LOAD DATA INFILE 將Apache 的日志載入到MySQL 數據庫中然後通過SQL 進行查詢在Ifp 的網站上有一個PDF 的幻燈片詳細給出了使用示例包括查詢和命令行參數都有
或許你會說不想或者沒時間在代碼中加入測量的功能其實這事比想象的要容易得多而且花在優化上的時間將會由於性能的優化而加倍地回報給你對應用的測量是不可替代的當然最好是直接使用New RelicxhprofIfp 或者其他已有的優化工具而不必重新去發明輪子
MySQL 企業監控器的查詢分析功能
MySQL 的企業監控器(Enterprise Monitor)也是值得考慮的工具之一這是Oracle 提供的MySQL 商業服務支持中的一部分它可以捕獲發送給服務器的查詢要麼是通過應用程序連接MySQL 的庫文件實現要麼是在代理層實現(我們並不太建議使用代理層)該工具有設計良好的用戶界面可以直觀地顯示查詢的剖析結果並且可以根據時間段進行縮放例如可以選擇某個異常的性能尖峰時間來查看狀態圖也可以查看EXPLAIN 出來的執行計劃這在故障診斷時非常有用
返回目錄高性能MySQL
編輯推薦
ASP NET開發培訓視頻教程
數據倉庫與數據挖掘培訓視頻教程
Oracle索引技術
From:http://tw.wingwit.com/Article/program/MySQL/201311/29717.html