標籤:apache 最佳化
(一)prefork模式下(其他模式下不適用),
apache需要最佳化的主要參數:
ServerLimit 3000
StartServers 750
MinSpareServers 5
MaxSpareServers 100
MaxClients 3000
MaxRequestsPerChild 10000
首先來看看apache各個參數的意義(引號裡引用的是官方文檔的描述):
(1)ServerLimit和MaxClients 伺服器最大同時響應請求數
這個就是你當前配置的apache最大的並發響應數,對應的是apache的進程數,兩個參數同時修改,MaxClients不得大於ServerLimit參數。
ServerLimit的大小,取決於你系統的資源,每個apache進程預設佔用2M記憶體,基本可以按照這個公式來計算:最大記憶體*80%/2M=ServerLimit
(2)StartServers 750 啟動時預設啟動的進程數
這個參數預設是5,因為apache會通過自動啟動新進程來增加響應服務的進程數,這個值不做調整的也是可以的,會由預設的5增加到滿足服務的進程數,但是會出現開始啟動時的卡住。
小啟動參數有一個好處:就是可以讓傳遞後後端tomcat的壓力緩慢增加上來,而不是一下子增加壓力。可以把這個調整到當前服務最大的並發數,當前服務最大並發串連數,可以通過監控apache進程個數:ps -ef | grep httpd | wc -l 來獲得。不用調得太大,否則是無謂增加apache通過jk去跟tomcat建立的串連。
注意:
apache進程跟tomcat建立串連後,不會釋放此串連,會一直保持串連,直到timeout,如果沒有timeout時間,就會永久串連。timeout的設定,會在後面jk配置裡說明。
所以不要一次啟動太多的apache進程,只啟動足夠用的進程即可。其他增加的流量,apache會自動調整進程數,直到MaxClients參數限定的範圍。
(3)MinSpareServers 5 最小空閑進程
MinSpareServers指令設定空閑子進程的最小數量。所謂空閑子進程是指沒有正在處理請求的子進程。如果當前空閑子進程數少於MinSpareServers ,那麼Apache將以第一秒一個,第二秒兩個,第三秒四個,按指數遞增個數的速度產生新的子進程。
(4)MaxSpareServers 10 最大空閑進程
MaxSpareServers指令設定空閑子進程的最大數量。所謂空閑子進程是指沒有正在處理請求的子進程。如果當前有超過MaxSpareServers數量的空閑子進程,那麼父進程將殺死多餘的子進程。
可以調整這兩個參數,但是這兩個參數的值不能設得太大,否則apache進程太多,會導致對應開啟的tomcat進程也會很多。
官網上關於這兩個參數都有這麼句話:“將此參數設的太大通常是一個壞主意。”
在一台壓力大(並發訪問2800)的伺服器上,MaxSpareServers這個值設定的是200。
設定了這個值的好處是不會有太多的閒置進程在消耗資源,同時減少apache和tomcat的串連連接埠。
關閉空閑apache進程的同時,會釋放jk串連,同時釋放tomcat串連數,進而減少系統資源消耗。
(5)MaxRequestsPerChild 10000
"MaxRequestsPerChild指令設定每個子進程在其生存期內允許伺服的最大請求數量。到達MaxRequestsPerChild的限制後,子進程將會結束。如果MaxRequestsPerChild為"0",子進程將永遠不會結束。
將MaxRequestsPerChild設定成非零值有兩個好處:
* 可以防止(偶然的)記憶體流失無限進行,從而耗盡記憶體。
* 給進程一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動進程的數量。
注意
對於KeepAlive連結,只有第一個請求會被計數。事實上,它改變了每個子進程限制最大連結數量的行為。"
也就是說實際上這個時候子進程最大串連數等於MaxRequestsPerChild*MaxKeepAliveRequests
所以在開啟KeepAlive後,需要同時設定MaxRequestsPerChild和MaxRequestsPerChild,確保每個apache進程在服務一定請求數後會關閉,重新開啟新的子進程,避免apache進程異常導致的記憶體泄露和資源佔用。
(6)Keep-Alive
預設:ON
發送的請求,在MaxRequestsPerChild裡面只算一個,不管這個串連發送了多少個請求。
(7)MaxKeepAliveRequests
預設:100
"一個建立好的Keep-Alive串連,允許發送的請求的個數。一旦建立串連,要麼就是個數達到了斷開,要麼就是等KeepAliveTimeout時間到了中斷連線。
MaxKeepAliveRequests指令限制了當啟用KeepAlive時,每個串連允許的請求數量。如果將此值設為"0",將不限制請求的數目。我們建議最好將此值設為一個比較大的值,以確保最優的伺服器效能。"
這個數位設定,必須考慮在一個時間段內,同一個使用者訪問你的服務會發多少請求。要結合KeepAliveTimeout參數來考慮。
舉個例子,使用者需要間隔時間不大於KeepAliveTimeout的時間內,連續請求10個檔案,那麼這個參數就應該設定成10,如果使用者在連續時間裡不斷請求訪問,則這個數值得設定得更多。否則就重建立立串連下載。一旦使用者連續進行了10個請求後,並且這個使用者肯定在完成這些請求後的5秒內不會再請求,甚至要在之後的很長時間後請求,那麼這個KeepAliveTimeout時間就可以設定得很短,以便儘早斷開這種使用者,把資源讓個其他使用者。
(8)KeepAliveTimeout
預設:5
"在一個建立好的Keep-Alive串連上,在MaxKeepAliveRequests個數未滿的情況下,等待下一個請求的時間。"
如果有請求到達,那麼apache等待IO響應的timeout時間時間開始生效,timeout時間沒等到響應,串連被斷開;如果KeepAliveTimeout時間內,沒有請求到達,串連就被斷開。
具體設定可以參考配合MaxKeepAliveRequests參數。同時這個參數又受TimeOut參數影響,在一次成功串連中,TimeOut時間內沒有等到響應,也會中斷連線。
(9)TimeOut
預設:300
"TimeOut指令用於設定Apache等待以下三種事件的時間長度:
1. 接受一個GET請求耗費的總時間。
2. POST或PUT請求時,接受兩個TCP包之間的時間。
3. 應答時TCP包傳輸中兩個ACK包之間的時間。
我們計劃在發展裡程中,逐步把它們分別變得更易配置。計時器在1.2版本之前的預設值為1200,而現在已經設定為300了,但對於絕大多數情況來說仍是足夠的。沒有把它預設值設的更小的原因在於代碼裡還有點問題:有時發送一個包之後,計時器沒有複位。”