為什麼我的伺服器上打開了大量的 PHP 程序?
今天我看到我的一個網站無法執行,所以我 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 個並發請求。
請對此有所了解!謝謝 :)
是的,這是預期的行為。看起來您同時執行了 5 個 ab 副本。這導致您的 150 個 PHP 程序為 5 個 ab 程序中的每一個處理 30 個請求。
當所有執行緒都可以在記憶體中執行時,Apache 工作得最好。將有一個負載需要將執行緒交換到磁碟。發生這種情況時,響應時間將迅速縮短。像你一樣殺死程序將提高性能。在這種情況下,伺服器性能可能會變差。如果最大執行緒配置得太高,則使用此行為執行 DOS(拒絕服務)相對容易。
您最終可能會遇到問題的另一個原因是兩個程序是否在兩個資源上死鎖。如果其他程序需要這些資源中的任何一個,它們可能無法響應。Apache 將限制在這種情況下創建的程序數。殺死任何一個死鎖的程序應該可以解決問題。根據正常的鎖定順序,可能需要終止特定程序以防止再次出現死鎖。這對伺服器性能幾乎沒有影響。
程式錯誤也可能導致執行緒掛起。這可能會導致如您所見的那樣粘連。事後很難找到發生的事情,但是 apache 伺服器日誌的內容可能會有所幫助。檢查錯誤日誌以查找問題。訪問日誌可能包含在您終止程序時掛起的請求的條目。
如果一段時間不使用,Apache 應該殺死一些程序。這由
MaxSpareThreads
參數控制。檢查您的控製文件,該文件應該對執行緒、伺服器和客戶端的參數有一些註釋。預設值通常很好。如果程式碼有問題,設置
MaxRequestsPerChild
在 5000 到 100 範圍內的某個值通常會有所幫助。數字越小,需要創建的新執行緒就越頻繁,apache 伺服器需要工作的難度就越大。編輯:Apache 將在啟動時打開多個執行緒。這取決於幾個參數的相互作用。有關參數的詳細資訊,請參閱MPM 配置文件。這與伺服器的任何負載無關,通常是正在執行的伺服器將保持執行的最小執行緒數。