在部署一套內網測試環境時,頻繁宕機,開機後不斷的吃記憶體,重啟apache之後記憶體佔用會不停的上漲,直到swap用完,直到死機,由於是內網環境,伺服器並發和壓力都很小。
查看apache錯誤記錄檔,報大量類似錯誤:
複製代碼 代碼如下:
[Tue Feb 14 14:49:28 2012] [warn] child process 7751 still did not exit, sending a SIGTERM
[Tue Feb 14 14:49:30 2012] [error] child process 7603 still did not exit, sending a SIGKILL
[Tue Feb 14 14:49:30 2012] [error] child process 7614 still did not exit, sending a SIGKILL
後查出來是因為php某一些指令碼存在記憶體泄露的程式碼片段。而apache處理這些程式碼片段的進程的處理請求數被設定為無窮。也就是說這些進程只有在apache重啟(stop-start模式)或者伺服器重啟的情況下才會被kill,否則將一直運行下去,直到耗盡系統的最後一點資源(主要是記憶體)。
問題分析:
複製代碼 代碼如下:
//伺服器允許配置的進程數上限
ServerLimit 1500
//設定伺服器啟動時建立的子進程數量。因為子進程數量動態取決於負載的輕重,所有一般沒有必要調整這個參數。
StartServers 5
//MinSpareServers:設定空閑子進程的最小數量。所謂空閑子進程是指沒有正在處理請求的子進程。如果當前空閑子進程數少於MinSpareServers,那麼Apache將以最大每秒一個的速度產生新的子進程。
MinSpareServers 5
//設定空閑子進程的最大數量。如果當前有超過MaxSpareServers數量的空閑子進程,那麼父進程將殺死多餘的子進程。
MaxSpareServers 10
//用於用戶端請求的最大接入請求數量(最大線程數)。
MaxClients 1500
//設定每個子進程在其生存期內允許提供的最大請求數量
MaxRequestsPerChild 50
問題解決:
設定 MaxRequestsPerChild 50或30
MaxRequestsPerChild不能太大,也不能設定為0,最好設定為一個相對不大的數字,100內可能就夠了,防止httpd進程有意外的記憶體泄露。