在部署一套內(nèi)網(wǎng)測試環(huán)境時,頻繁宕機(jī),開機(jī)后不斷的吃內(nèi)存,重啟apache之后內(nèi)存占用會不停的上漲,直到swap用完,直到死機(jī),由于是內(nèi)網(wǎng)環(huán)境,服務(wù)器并發(fā)和壓力都很小。
查看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某一些腳本存在內(nèi)存泄露的代碼段。而apache處理這些代碼段的進(jìn)程的處理請求數(shù)被設(shè)置為無窮。也就是說這些進(jìn)程只有在apache重啟(stop-start模式)或者服務(wù)器重啟的情況下才會被kill,否則將一直運(yùn)行下去,直到耗盡系統(tǒng)的最后一點(diǎn)資源(主要是內(nèi)存)。
問題分析:
//服務(wù)器允許配置的進(jìn)程數(shù)上限
ServerLimit 1500
//設(shè)置服務(wù)器啟動時建立的子進(jìn)程數(shù)量。因為子進(jìn)程數(shù)量動態(tài)的取決于負(fù)載的輕重,所有一般沒有必要調(diào)整這個參數(shù)。
StartServers 5
//MinSpareServers:設(shè)置空閑子進(jìn)程的最小數(shù)量。所謂空閑子進(jìn)程是指沒有正在處理請求的子進(jìn)程。如果當(dāng)前空閑子進(jìn)程數(shù)少于MinSpareServers,那么Apache將以最大每秒一個的速度產(chǎn)生新的子進(jìn)程。
MinSpareServers 5
//設(shè)置空閑子進(jìn)程的最大數(shù)量。如果當(dāng)前有超過MaxSpareServers數(shù)量的空閑子進(jìn)程,那么父進(jìn)程將殺死多余的子進(jìn)程。
MaxSpareServers 10
//用于客戶端請求的最大接入請求數(shù)量(最大線程數(shù))。
MaxClients 1500
//設(shè)置每個子進(jìn)程在其生存期內(nèi)允許提供的最大請求數(shù)量
MaxRequestsPerChild 50
問題解決:
設(shè)置 MaxRequestsPerChild 50或30
MaxRequestsPerChild不能太大,也不能設(shè)置為0,最好設(shè)置為一個相對不大的數(shù)字,100內(nèi)可能就夠了,防止httpd進(jìn)程有意外的內(nèi)存泄露。