歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

apache2.2 prefork模式優化

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> 
Copyright © Linux教程網 All Rights Reserved