解決Apache長時間佔用記憶體大的問題,Apache 記憶體優化方法

weixin_34054866發表於2018-01-18

問:為什麼伺服器在連續執行多天後或訪問峰值後,程式中的一個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程式也是要消耗資源的,這是一個平衡問題。

相關文章