WAMP Stack/Silverstripe,高 TTFB 但快速 PHP 執行?我在哪裡可以找到答案?
我的生產伺服器是 Windows Server 2012 R2、Apache 2.4、PHP 5.6 和 MariaDB(不確定版本,可能不相關)。我有一個在 Silverstripe 3.5 上執行的自定義站點。
最近,我收到了一些帶有某些操作的荒謬 TTFB,最明顯的是登錄(超過 30 秒),或者有時在瀏覽後端時是隨機的。奇怪的是,這不會發生在我們配置類似的開發伺服器上,我們的 IT 部門將傾訴
httpd.conf
並php.ini
查看是否存在任何可能成為問題的差異。我啟用了 Zend OpCache 擴展,希望它會有所幫助,但我沒有看到任何重大改進。
我在登錄時安裝了 XDebug 並觸發了分析(通過通過 DOM 檢查器添加一個名為 XDEBUG_PROFILE 的隱藏表單欄位),但是在 WinCachegrind 中查看時的輸出顯示 PHP 的執行累積時間不超過 5 秒 - 即總累積時間
main.php
為4.x 秒。框架邏輯或數據庫訪問似乎沒有明顯的瓶頸。
httpd.exe
在請求期間佔用了我 14% 的 CPU。使用 Powershell 觀察日誌gci -Wait
表明,在發送access.log
響應之前,請求沒有登錄(不確定是否正常行為),並且沒有彈出錯誤。我很困惑為什麼 Apache 需要這麼長時間來處理 PHP 聲稱只需要 4 秒來執行邏輯的請求。雖然可能會讚賞潛在的解決方案,但我真的很想知道在診斷方面我還能在哪裡查看導致 Apache 像這樣變慢的原因,例如文件訪問、跟踪執行等?我什至不知道從哪裡開始尋找。
數據庫不是瓶頸。具有諷刺意味的是,它是記憶體——這是一個已知問題,
Zend_Cache_Backend_File
如果站點有大量數據、模板和圖像要記憶體,基於記憶體的速度會慢得令人作嘔。果然,我在伺服器上的 silverstripe-cache 文件夾中有超過 5,000 個文件。添加以下行以
./mysite/_config.php
禁用記憶體會立即產生壓倒性的改進(登錄時的 35 秒 TTFB 降至不到 0.5 秒!):
SS_Cache::set_cache_lifetime('default', -1, 100);
但是,這是一個臨時修復。我們將研究實現一個更持久、更實用的記憶體處理解決方案,例如將 ramdisk 與文件系統後端結合使用,或利用使用 XCache 或 Memcached 等記憶體池的後端,以及努力轉向Silverstripe 4.x 轉儲
Zend_Cache
支持symfony/cache
.但是,鑑於我的辦公室喜歡讓官僚主義妨礙一切……可能還需要一點時間。