優化 fastcgi + php5
執行帶有 lighttpd、php5、xcache 和 fastcgi 的 debian 系統。2GB 記憶體,2 個核心,在 5 分鐘內平均峰值時間不到 10% 的 CPU 負載,使用的記憶體不到 1GB。
該系統執行一個自定義建構的 Web 應用程序,它會抓取航班搜尋站點,不允許記憶體(結果),因此它是實時生成的,並且執行它的程式碼使用 libcurl,並且每次搜尋可能會執行幾秒鐘。還有一個 OpenX 廣告系統。
最近該站點似乎間歇性地超時,我創建了一個簡單的測試腳本,它只列印一個單詞以確保它與 MySQL 數據庫無關。
據我了解,當我們執行一個操作碼記憶體器時,我們不應該執行很多 fastcgi“max-procs”(因為我假設每個程序都會使用它自己的記憶體),而是增加子程序。
childs 從 20(有 2 個 max-procs)增加到 32,沒有明顯差異。據我了解,同時執行的腳本數量是 max-procs * children。查看status.statistics-url的輸出,而腳本需要很長時間才能執行似乎並不表明所有孩子都很忙。
保持增加fastcgi的孩子的正確方法是什麼,或者還有什麼要做的?是否可以查看哪些腳本在執行時,它們執行了多長時間等等等等?
fastcgi.active-requests:39
fastcgi.backend.0.0.connected:2259
fastcgi.backend.0.0.died:0
fastcgi.backend.0.0.disabled:0
fastcgi.backend.0.0.load:19
fastcgi.backend.0.0.overloaded :0
fastcgi.backend.0.1.connected:4646
fastcgi.backend.0.1.die:0
fastcgi.backend.0.1.disabled:0
fastcgi.backend.0.1.load:20
fastcgi.backend.0.1.overloaded:0
fastcgi.backend .0.load:39
fastcgi.requests:6905
10-fastcgi.conf:
“max-procs” => 2,
“idle-timeout” => 20,
“bin-environment” => (
“PHP_FCGI_CHILDREN” => “32”,
“PHP_FCGI_MAX_REQUESTS” => “500”
lighttpd 錯誤日誌,這些負載:
2011-05-30 09:45:48: (server.c.1258) 注意:/index.php?//search/poll 的請求在寫入 15180 字節後超時。我們等了 360 秒。如果這是一個問題增加 server.max-write-idle
2011-05-30 09:49:08: (server.c.1258) 注意:/index.php?// 的請求在寫入 12420 字節後超時。我們等了 360 秒。如果這個問題增加 server.max-write-idle
將您的 PHP 二進製文件更改為FPM而不是舊的 fastcgi。
FPM(FastCGI 程序管理器)是一種替代的 PHP FastCGI 實現,具有一些(大部分)對重負載站點有用的附加功能。
工作更穩定,你不應該有超時問題。
就像 vartec 所說,PHP-FPM 在這裡可能是一個好主意。請注意,PHP 5.2 版本不支持動態程序生成(儘管它是一個可配置的選項),因此您必須確保有足夠的工作人員來處理所有流量高峰。
如果您切換到 PHP-FPM,一個好處是在所有 PHP 程序之間共享操作碼記憶體(這可以通過 lighttpd 方法實現,但有點煩人)。
你看到什麼樣的請求/秒?我通常嘗試為伺服器看到的每個請求/秒執行一個 PHP 程序。在記憶體相對較低的系統上,這可能不是最好的主意,但我還沒有遇到任何問題。
您是使用 unix 套接字還是 TCPIP 來連接 lighttpd 和 php?如果您使用 TCPIP,則絕對應該切換到 unix 套接字。在使用 TCPIP 時,我見過各種斷斷續續的、難以診斷的問題。您可能正在使用 TCPIP 達到防火牆限製或連接限制。
你在用 Munin 之類的東西監控嗎?擁有流量負載、伺服器負載、mysql 負載等圖表可能會很方便。雖然這不會僅僅通過擁有它們來解決您的問題,但它們對您來說非常方便。