在部署一套內網測試環境時,頻繁宕機,開機后不斷的吃內存,重啟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進程有意外的內存泄露。
|
新聞熱點
疑難解答