
今天我看到我的一個網站無法運行,所以我透過 ssh 連接到伺服器並執行 ps -eF。我看到大約 200 個 PHP 進程全部運行了 4 個小時。
Apache 是使用 mpm event 和 mod fcgid 建構的。
我殺死了所有 PHP 進程,現在它運作良好,為什麼會發生這種情況?這是預期的行為嗎?
我不太明白 Apache 是如何追蹤 PHP 進程的數量及其進程 ID 的,所以如果有人能在我讀到這一點時也能提供一些參考,那就太好了。
另外,我使用“ab”命令(Apache Benchmark)來查看這種情況是否一直發生,所以我連續運行了大約4-5 次,有30 個並發請求,並且再次有大約150 個PHP 進程在運行,當我繼續運行“ab”,現在它不會產生更多進程,網站仍在運行。需要明確的是,我執行「ab」的4-5 次並不是同一時間,一旦一個「ab」進程完成,我就執行另一個進程,但每次執行「ab」時,我都會執行30 個並發請求。
請闡明這一點!謝謝 :)
答案1
是的,這是預期的行為。看起來您同時運行了 5 個 ab 副本。這導致您有 150 個 PHP 進程來處理 5 個 ab 進程中每個進程的 30 個請求。
當 Apache 的所有執行緒都可以在記憶體中運行時,它的工作效果最佳。存在需要將線程交換到磁碟的負載。發生這種情況時,反應時間將迅速縮短。像您一樣終止進程將提高效能。在這種情況下,伺服器效能可能會變差。如果最大執行緒數配置得太高,則使用此行為相對容易執行 DOS(拒絕服務)。
導致問題的另一個原因是兩個程序在兩個資源上發生死鎖。如果其他進程需要這些資源中的任何一個,它們可能無法回應。在這種情況下,Apache 將限制已建立的進程數量。終止任何一個死鎖進程應該可以解決問題。根據正常的鎖定順序,可能需要終止特定進程以防止再次死鎖。這對伺服器效能影響很小或沒有影響。
編程錯誤也可能導致執行緒掛起。這可能會導致頭部粘住,如您所見。事後查找發生的情況很困難,但 apache 伺服器日誌的內容可能會有所幫助。檢查錯誤日誌是否有問題。存取日誌可能包含在您終止進程時掛起的請求的條目。
如果一段時間內不使用某些進程,Apache 應該會殺死它們。這是由MaxSpareThreads
參數控制的。檢查你的控製文件,其中應該有一些關於線程、伺服器和客戶端參數的註解。預設值通常很好。
如果程式碼有問題,設定MaxRequestsPerChild
為 5000 到 100 範圍內的某個位置通常會有所幫助。數字越小,需要建立的新執行緒就越頻繁,而且 apache 伺服器需要的工作就越困難。
編輯:Apache 將在啟動時開啟多個執行緒。這取決於幾個參數的相互作用。請參閱MPM配置文檔有關參數的詳細資訊。這與伺服器的任何載入無關,通常是正在運行的伺服器將保持運行的最小執行緒數。