2012-09-11 50 views
4

生產環境:運行Apache 2.2的工作站羣集前的負載平衡器/ HTTP反向代理,mod_php 5.3在64位Linux上。所有的工作機器都運行完全自定義的PHP代碼,並與單個後端PostgreSQL數據庫對話。 PHP代碼經過優化,可以將CPU花在與數據庫交談上。數據庫機器已被驗證仍有大量空閒。PHP:如何在生產中運行採樣分析器?

我正在尋找:採樣分析器,它可以通過PID附加到PHP程序和定期停止過程(與SIGSTOP EG),通過內存檢查收集PHP棧和持續的過程(例如使用SIGCONT) 。停止時間應該可以調整,但我認爲停止時間應該在1-10毫秒左右。

單個工作機器PHP進程有望在小於100毫秒內運行單個請求。我最感興趣的是收集超過100毫秒的進程的配置文件數據。最好的情況將是一個採樣分析器,它將在請求開始時得到通知,並且處理請求的PHP進程在100 ms後仍然運行,以1 ms爲間隔開始採樣。通過這種方式,任何正常運行的進程都可以在沒有中斷的情況下運行到最後,並且仍然可以獲取有問題的配置文件。

這種PHP採樣分析器是否存在?意圖是不使用instrumenting分析器,因爲開銷太高,儀器混淆了統計信息(在那裏,這樣做)。

我已經意識到了XHProf和Xdebug,但據我所知,這兩者都是探測分析器並影響PHP程序的實際操作碼。我非常喜歡運行普通PHP操作碼的東西。

我所知道的最接近的工作是用HipHop運行PHP代碼,並使用C/C++代碼採樣分析器,但我還沒有準備好將軟件移植到HipHop。在這種情況下,分析結果將僅代表HipHop,而不代表mod_php。

+0

請注意:可以將http://inventorsparadox.blogspot.fi/2012/02/how-to-dump-php-stack-from-gdb.html和http://poormansprofiler.org /爲此創建工具... –

+3

似乎XHprof支持採樣但文檔非常差,並且採樣率固定爲100毫秒,這有點粗糙:http://php.net/manual/en/function。 xhprof-sample-disable.php –

+0

你有沒有找到一個體面的解決方案呢?我發現自己也有類似的需求(巧合的說,與您所描述的設置幾乎完全相同) – Basic

回答

0

我不會在生產環境中運行任何分析器工具。測試服務器用於運行分析器和負載測試。

+3

恰恰相反,這正是Facebook構建的[XhProfLive for:profiling production](http://www.facebook.com/note.php?note_id=62667953919)。不是每個人都需要這個,對於非常小的項目,我會同意你的看法。但對於大型項目來說,剖析生產是有價值的。 –

2

雖然XHProf 確實如果已啓用(通過調用的函數,而不僅僅是啓用了擴展),則會爲請求增加開銷,這取決於您使用的標誌。我最近一次測量的這個發現,只有XHPROF_FLAGS_MEMORY是最小的開銷是最好的選擇:

http://rpubs.com/msonnabaum/xhprof_overhead

我只是一個小數量的請求運行XHProf的,像這樣:

<?php 
function xhprof_enabled() { 
    if (mt_rand(1, 300) == 1) { 
    xhprof_enable(XHPROF_FLAGS_MEMORY); 
    } 
} 

但不像Xdebug的,只需啓用擴展程序似乎不會增加任何開銷。

+0

Afaik XHProf甚至沒有給你一個完整的堆棧(只有「我們目前在這個功能,不知道爲什麼」),因此不符合要求。 – AndreKR

相關問題