問:為什么服務器在連續運行多天后或訪問峰值后,進程中的一個Apache.exe占用內存幾百兆不減少?
答:用記事本打開apache2\conf\httpd.conf,
我在centos5上裝了kloxo,找了半天 httpd.conf在 /etc/httpd/conf/目錄下。
查找MaxRequestsPerChild,將MaxRequestsPerChild 0改成MaxRequestsPerChild 50即可。
影響apache性能的幾個重要參數(conf/httpd.conf中設置)
KeepAlive 是否允許持續連接
MaxKeepAliveRequests 允許的持續連接的最大數
KeepAliveTimeout 持續連接在沒有請求多少秒后切斷
StartServers 最初啟動時啟動多少個服務器進程
MinSpareServers 空閑服務器進程的最小數
MaxSpareServers 空閑服務器進程的最大數
MaxClients 同時處理的請求數(最重要的參數,要少於ServerLimit)
MaxRequestsPerChild 每個子進程處理的最大請求數
它們之前的關系:
prefork控制進程在最初建立“StartServers”個子進程后,為了滿足MinSpareServers設置的需要創建一個進程,等待一秒鍾,繼續創建兩個,再等待一秒鍾,繼續創建四個……如此按指數級增加創建的進程數,最多達到每秒32個,直到滿足MinSpareServers設置的值為止。這種模式可以不必在請求到來時再產生新的進程,從而減小了系統開銷以增加性能。MaxSpareServers設置了最大的空閑進程數,如果空閑進程數大於這個值,Apache會自動kill掉一些多余進程。這個值不要設得過大,但如果設的值比MinSpareServers小,Apache會自動把其調整為MinSpareServers+1。如果站點負載較大,可考慮同時加大MinSpareServers和 MaxSpareServers。MaxRequestsPerChild設置的是每個子進程可處理的請求數。每個子進程在處理了 “MaxRequestsPerChild”個請求后將自動銷毀。0意味着無限,即子進程永不銷毀。雖然缺省設為0可以使每個子進程處理更多的請求,但如果設成非零值也有兩點重要的好處:1、可防止意外的內存泄漏。2、在服務器負載下降的時侯會自動減少子進程數。
ServerLimit 2000
StartServers 10
MinSpareServers 10
MaxSpareServers 15
MaxClients 1000
MaxRequestsPerChild 2048
調試過程中用到的指令:
# ps -ef|grep http|wc -l //查看請求總數
# cat /proc/loadavg //查看平均負載(loadavg),loadavg高於1,表明任務隊列出現了等待,CPU忙不過來了。超過2以上就會明顯感到性能降低了
# netstat -ant | grep :80 | wc -l //查看TCP連接數
# top //查看系統運行情況
====================================================================
apache的內存使用
apache進程在使用內存時,是“漸長”的。也就是說,直到這個進程死掉,使用內存的數量是一直增長而不會減少的。這樣的話,apache進程使用內存的多少,就決定於你的應用程序最大使用內存量了。
keepalive參數
KeepAliveTimeout 這個參數決定了,在什么都不做之前,一個http進程能夠等待多長時間?設想一下,如果keepalive設置為on,而 keepalivetimeout設置為一個比較大的數字,apache占用內存會很快的增長。這是因為,一個apache進程完成了一個任務(並達到了一定的內存占用,想一下“漸進”模式),並不會馬上退出,而是等待一個keepalivetimeout時間。假設用戶的鏈接請求持續不斷的到來,則積累起來的無用的apache進程就會相當多,直到timeout,這些進程才會被殺死。
但是,keepalive的確對於靜態的文件,比如圖像文件的傳送是很有效的,因此,keepalive要設置為on,(off)但是keepalvietimeout要設置的小些,比如5s 15
MaxRequestsPerChild
這個參數是說,apache進程在處理了多少個請求之后,必須退出,重新開始,以免在處理中的內存問題。
對於php腳本來說,把這個參數設置的小一些是有好處的,可以避免程序使用的內存持續增長對apache帶來的壓力:讓這個參數定期釋放內存,因為php是在腳本執行完畢后,自動釋放只用的資源(內存)的。
比如設置為50?如果太小的話,重新產生一個apache進程也是要消耗資源的,這是一個平衡問題。