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>