apache2.2 prefork模式最佳化 apache2.2最佳化配置核心關鍵: (一)prefork模式下(其他模式下不適用),apache需要最佳化的主要參數: ServerLimit 3000 StartServers 750 MinSpareServers 5 MaxSpareServers 100 MaxClients 3000 MaxRequestsPerChild 10000 首先來看看apache各個參數的意義(引號裡引用的是官方文檔的描述): www.2cto.com (1)ServerLimit和MaxClients 伺服器最大同時響應請求數 這個就是你當前配置的apache最大的並發響應數,對應的是apache的進程數,兩個參數同時修改,MaxClients不得大於ServerLimit參數。 ServerLimit的大小,取決於你系統的資源,每個apache進程預設佔用2M記憶體,基本可以按照這個公式來計算:最大記憶體*80%/2M=ServerLimit www.2cto.com (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了,但對於絕大多數情況來說仍是足夠的。沒有把它預設值設的更小的原因在於代碼裡還有點問題:有時發送一個包之後,計時器沒有複位。” 影響Apache的效能配置參數: 影響Apache的效能配置參數: Timeout 300 指定網站響應的時間秒數。若超過這段時間仍未收到或送出資料,就中斷連線。意思是該參數指定Apache在接收請求或發送所請求內容之前的最長等待時間(秒),若超過該時間Apache則放棄處理該請求,並釋放串連。該參數預設值為120,推薦設定為60,對於訪問量較大的網站可以設定為30。 KeepAlive On|Off 啟用此項,表示允許保持持久串連,讓每次串連能提出多個請求。避免每請求一個檔案就跟伺服器建立一次串連。也就是控制Apache是否允許在一個串連中有多個請求,預設開啟。但對於大多數論壇類型網站來說,通常設定為off以關閉該支援。 MaxKeepAliveRequests 100 每次串連可提出請求的數量,設定為0表示數量不限,預設值為100。. KeepAliveTimeout 15 連續兩個請求之間的時間如果超過15秒還未到達,則視為串連中斷。這種做法可以最大限度地利用有限的資源,這也是Apache效能如此優越的原因之一。 MinSpareServers 5 MaxSpareServers 20 Apache在運行時會根據負載的輕重自動調整空閑子進程的數目。 提供瀏覽服務的httpd進程的數目需要隨串連數目的多少而變化,因此需要隨時保持幾個閑置的httpd進程等候新的串連請求。若閑置的進程數少於5個(預設值),則表示閑置進程太少,需要將其增加到5個; 若多於20個(預設值)則表示閑置進程太多,需將其減少到20個。 MaxClients 150 同時接入的數目太多時會降低系統訪問效能,設定此參數可限制同時串連的最大數值,預設值為150,它設定的就是Apache可以同時處理的請求,這是對Apache效能影響最大的參數 MaxClients和MaxRequestPerchild;MaxClients指定Apache在同一時間內最多允許有多少用戶端能夠與其串連,如果超過MaxClients個串連,用戶端將會得到一個“伺服器繁忙”的錯誤頁面。我們看到預設情況下MaxClients設定為15,這對一些中型網站和大型網站顯然是遠遠不夠的!也許您需要同時允許512個用戶端串連才能滿足應用需求,好吧,那麼就讓我們把MaxClients修改為512,儲存httpd.conf並退出,重啟Apache,很遺憾,在重啟過程當中您看到了一些錯誤提示,Apache重啟失敗。錯誤提示中告訴您 MaxClients最大隻能設定為256,相信您一定很失望。不過不要沮喪,Apache作為世界一流的Web Server一定不會如此單薄的!在預設情況下,MaxClients的確只能設定為不超過256的整數,但是,如果您有需要完全可以隨意定製,此時就需要使用ServerLimit參數來配合使用,簡單的說ServerLimit就像是水桶,而MaxClients就像是水,您可以通過更換更大的水桶(將ServerLimit設定為一個較大值)來容納更多的水(MaxClients),但要注意,MaxClients的設定數值是不能大於 ServerLimit的設定數值的!下面讓我們瞭解一下MaxRequestPerChild參數,該參數指定一個串連進程中可以有多少個線程同時工作。也許這樣解釋過於專業,那麼您只要想想“網路螞蟻”、“網際快車FlashGet”中的“多點同時下載”即可,該參數實際上就是限制最多可以用幾個“點”。預設設定為0,即為:不限制。但需要注意,如果將該值設定的過小會引起訪問問題,如果沒有特殊需要或者訪問量壓力並非很大可以保持預設值,如果訪問量很大則推薦設定為2048 最佳化建議: # 升級 Apache 到最新版本,新版本往往包含效能提升和安全更新。 # 在 httpd.conf 中設定 "HostNameLookups off" 能避免針對每個訪問者的 DNS 網域名稱的反向查詢。 # 對於繁忙的網站,在 httpd.conf 中設定 "MaxClients 230" 或者更高。這項設定讓更多的 httpd 進程同時響應請求,並避免了處理器排隊的情況發生。 # 採用另外一台伺服器處理圖片檔案。 # 缺保您的 Web 頁面和 CGI 頁面採用了瀏覽器緩衝技術。具體的文章可以參考本站:採用 mod_gzip 加速 Zope 和 Apache # 保持您的 Apache 苗條,編譯那些僅僅需要的模組,在編譯之前,修改 src/Configuration 檔案,在那些不需要的模組之前用 # 號注釋掉。 # 如果不需要流量日誌,那麼把 httpd.conf 中的 TransferLog 指向到 /dev/null/ # 除非你確定使用 .htaccess 檔案來控制一些目錄的許可權,否則設定 "AllowOverride None" ,這樣就免去 Apache 在每個目錄搜尋 .htaccess 檔案的勞役之苦。 # 不要讓不需要的後台進程運行。 # 千萬不要把頁面或者記錄檔寫到網路磁碟上,例如 NFS。 # 不要讓 Apache (httpd) 運行於 inetd 模式。 # 不要讓 X Windows 運行在你的 Web 服務器上,用 Ctrl-Alt-Backspace 關閉 X 。 # 避免使用 SSI tag。 # 在 CGI 指令碼中: * 檔案 I/O:開啟的檔案數目越少越好。 * Shell 命令:採用全路徑來調用 shell 命令。 * 如果你的網站主要以 CGI 來驅動,那麼請使用 mod_perl。 * 在你的 Web 頁面目錄中,不要讓檔案數超過 1000 個,檔案越多花費在定位上的時間也越多。 # 在 Web 服務器上的圖片越少越好,保證每個圖片都經由圖片壓縮器運行。 # 對你的網站做壓力測試,建議採用 Apache 內建的 ab 命令來測試。 # 為了最好的效能,最好把網線拔掉,這樣你的 Web 服務器就十分安全,而且負載馬上降為 0, Apache的最大串連數,預設為256個。 修改apache的最大串連數,方法如下: 步驟一:先修改./apache/conf/httpd.conf檔案。 # vi httpd.conf 將“#Include conf/extra/httpd-mpm.conf”前面的 # 去掉。 儲存。 步驟二:再修改./apache/conf/extra/httpd-mpm.conf檔案。 # vi httpd-mpm.conf 找到 <IfModule mpm_prefork_module> 這一行 原: <IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0 </IfModule> 修改後 <IfModule mpm_prefork_module> Apache的最大串連數,預設為256個。 修改apache的最大串連數,方法如下: 步驟一:先修改./apache/conf/httpd.conf檔案。 # vi httpd.conf 將“#Include conf/extra/httpd-mpm.conf”前面的 # 去掉。 儲存。 步驟二:再修改./apache/conf/extra/httpd-mpm.conf檔案。 # vi httpd-mpm.conf 找到<IfModule mpm_prefork_module> 這一行 原: <IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxClients 150 MaxRequestsPerChild 0 </IfModule> 修改後 <IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 ServerLimit 1500 MaxClients 1000 MaxRequestsPerChild 0 注意:1、一定要加ServerLimit,並且要在MaxClients前面,且數值要比MaxClient的值大; 2、重啟apache,僅僅/bin/apachectl restart無效, 需要先apachectl stop 然後再apachectl start 對apache中並發控制參數prefork理解和調優 一個apache有linux下的並發不是很高的,大約到3K的樣子,普通的伺服器都會不同程度的出現問題.apache有關並發控制主要是 prefork和worker二個其中一個來控制.我們可以使用httpd -l來確定當前使用的MPM是prefork.c,還是Worker.c.下面是apache中有關prefork的配置.下面是我最佳化過的參數. <IfModule prefork.c> #有這個參數就不必像apache1一樣修改源碼才能修改256客戶數的限制,聽講要放到最前面才會生效,2000是這個參數的最大值 ServerLimit 2000 #指定伺服器啟動時建立的子進程數量,prefork預設為5。 StartServers 25 #指定空閑子進程的最小數量,預設為5。如果當前空閑子進程數少於MinSpareServers ,那麼Apache將以最大每秒一個的速度產生新的子進程。此參數不要設的太大。 MinSpareServers 25 #設定空閑子進程的最大數量,預設為10。如果當前有超過MaxSpareServers數量的空閑子進程,那麼父進程將殺死多餘的子進程。此 參數不要設的太大。如果你將該指令的值設定為比MinSpareServers小,Apache將會自動將其修改 成”MinSpareServers+1”。 MaxSpareServers 50 #限定同一時間用戶端最大接入請求的數量(單個進程並發線程數),預設為256。任何超過MaxClients限制的請求都將進入等候隊列,一旦一個連結被釋放,隊列中的請求將得到服務。要增大這個值,你必須同時增大ServerLimit 。 MaxClients 2000 #每個子進程在其生存期內允許伺服的最大請求數量,預設為10000.到達MaxRequestsPerChild的限制後,子進程將會結束。如果MaxRequestsPerChild為”0”,子進程將永遠不會結束。 MaxRequestsPerChild 10000 </IfModule> 將MaxRequestsPerChild設定成非零值有兩個好處: 1.可以防止(偶然的)記憶體流失無限進行,從而耗盡記憶體。 2.給進程一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動進程的數量。 工作方式: 一個單獨的控制進程(父進程)負責產生子進程,這些子進程用於監聽請求並作出應答。Apache總是試圖保持一些備用的 (spare)或者是閒置子進程用於迎接即將到來的請求。這樣用戶端就不需要在得到服務前等候子進程的產生。在Unix系統中,父進程通常以root身 份運行以便邦定80連接埠,而 Apache產生的子進程通常以一個低特權的使用者運行。User和Group指令用於設定子進程的低特權使用者。運行子進程的使用者必須要對它所服務的內容有 讀取的許可權,但是對服務內容之外的其他資源必須擁有儘可能少的許可權。 我們調優常常要查看httpd進程數(即prefork模式下Apache能夠處理的並發請求數): #ps -ef | grep httpd | wc -l 出現的結果,就是當前Apache能夠處理的多少個並發請求,這個值Apache根據負載情況自動調. 查看Apache的並發請求數及其TCP串連狀態: 狀態:描述 CLOSED:無串連是活動的或進行中 LISTEN:伺服器在等待進入呼叫 SYN_RECV:一個串連請求已經到達,等待確認 SYN_SENT:應用已經開始,開啟一個串連 ESTABLISHED:正常資料轉送狀態 FIN_WAIT1:應用說它已經完成 FIN_WAIT2:另一邊已同意釋放 ITMED_WAIT:等待所有分組死掉 CLOSING:兩邊同時嘗試關閉 TIME_WAIT:另一邊已初始化一個釋放 處理完畢,等待逾時結束 LAST_ACK:等待所有分組死掉 最佳化樣本配置: <IfModule mpm_prefork_module> ServerLimit 20000 StartServers 10 MinSpareServers 10 MaxSpareServers 20 ServerLimit 2000 MaxClients 1000 MaxRequestsPerChild 10000 </IfModule> <IfModule mpm_worker_module> StartServers 3 MaxClients 2000 ServerLimit 25 MinSpareThreads 50 MaxSpareThreads 200 ThreadLimit 200 ThreadsPerChild 100 MaxRequestsPerChild 0 </IfModule>