# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
###########################################################################
# StartServers: 指定服務器啓動時建立的子進程數量,prefork默認爲8。
# MinSpareServers: 指定空閒子進程的最小數量,默認爲5。如果當前空閒子進程數少於MinSpareServers ,那麼Apache將以最大每秒一個的速度產生新的子進程。
# MaxSpareServers: 設置了最大的空閒進程數,默認爲20;如果空閒進程數大於這個值,Apache父進程會自動kill掉一些多餘子進程,如果設的值比MinSpareServers小,Apache會自動把其調整爲MinSpareServers+1。如果站點負載較大,可考慮同時加大MinSpareServers和MaxSpareServers。
# MaxConnectionsPerChild: 設置的是每個子進程可處理的請求數。每個子進程在處理了“MaxRequestsPerChild”個請求後將自動銷燬。0意味着無限,即子進程永不銷燬。雖然缺省設爲0可以使每個子進程處理更多的請求,但如果設成非零值也有兩點重要的好處:1. 可防止意外的內存泄漏;2. 在服務器負載下降的時侯會自動減少子進程數。
#MaxClients : 是這些指令中最爲重要的一個,設定的是Apache可以同時處理的請求,是對Apache性能影響最大的參數。其缺省值150是遠遠不夠的,如果請求總數已達到這個值(可通過ps -ef|grep http|wc -l來確認),那麼後面的請求就要排隊,直到某個已處理請求完畢。這就是系統資源還剩下很多而HTTP訪問卻很慢的主要原因。系統管理員可以根據硬件配置和負載情況來動態調整這個值。雖然理論上這個值越大,可以處理的請求就越多,但在Apache1.3默認的最大隻能設置爲256(這是個硬限制)。如果把這個值設爲大於256,那麼Apache將無法起動。事實上,256對於負載稍重的站點也是不夠的。如果要加大這個值,必須在“configure”前手工修改的源代碼樹下的src/include/httpd.h中查找256,就會發現“#define HARD_SERVER_LIMIT 256”這行。把256改爲要增大的值(如4000),然後重新編譯Apache即可。但在Apache 2.0中,新加入了ServerLimit指令,可以突破最大請求數爲256的限制。 使得無須重編譯Apache就可以加大MaxClients。下面是prefor
k配置段:
<IfModule prefork.c>
ServerLimit 2000
StartServers 10
MinSpareServers 10
MaxSpareServers 15
MaxClients 1000
MaxRequestsPerChild 10000
</IfModule>
ServerLimit:上述配置中,ServerLimit的最大值是2000,對於大多數站點已經足夠。如果一定要再加大這個數值,對位於源代碼樹下server/mpm/prefork/prefork.c中以下兩行做相應修改即可:
#define DEFAULT_SERVER_LIMIT 256
#define MAX_SERVER_LIMIT 2000
此時必須 MaxClients ≤ ServerLimit ≤ 2000. 即prefork的默認併發量最大是2000。ServerLimit 生效前提:必須放在其他指令的前面,同時要想改變這個硬限制必須完全停止服務器然後再啓動服務器(直接重啓是不行的)。
prefork 控制進程在最初建立“StartServers”個子進程後,爲了滿足MinSpareServers設置的需要創建一個進程,等待一秒鐘,繼續創建兩 個,再等待一秒鐘,繼續創建四個……如此按指數級增加創建的進程數,最多達到每秒32個,直到滿足MinSpareServers設置的值爲止。這種模式 可以不必在請求到來時再產生新的進程,從而減小了系統開銷以增加性能。當併發量高峯期過去了,併發請求數可能只有一個時,Apache會自動kill掉一些多餘進程,直到進程數到達MaxSpareServers爲止。這個值不要設得過大,但如果設的值比MinSpareServers小,Apache會自動把其調整爲 MinSpareServers+1。如果站點負載較大,可考慮同時加大MinSpareServers和MaxSpareServers。
MaxRequestsPerChild #設置的是每個子進程可處理的請求數。每個子進程在處理了“MaxRequestsPerChild”個請求後將自 動銷燬。0意味着無限,即子進程永不銷燬。雖然缺省設爲0可以使每個子進程處理更多的請求,但如果設成非零值也有兩點重要的好處:1、可防止意外的內存泄 漏。2、在服務器負載下降的時侯會自動減少子進程數。因此,可根據服務器的負載來調整這個值。MaxRequestWorkers指令集同時將服務請求的數量上的限制。任何連接嘗試在MaxRequestWorkerslimit將通常被排隊,最多若干基於上ListenBacklog指令。
# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>
##################################################################
StartServers 服務器啓動時建立的子進程數,默認值是"4"。
ServerLimit:服務器允許配置的進程數上限。這個指令和ThreadLimit結合使用配置了MaxClients最大允許配置的數值。任何在重啓期間對這個指令的改變都將被忽略,但對MaxClients的修改卻會生效。
MaxClients :允許同時伺服的最大接入請求數量(最大線程數量)。任何超過MaxClients限制的請求都將進入等候 隊列。默認值是"400",16 (ServerLimit)乘以25(ThreadsPerChild)的結果。因此要增加MaxClients的時候,您必須同時增加 ServerLimit的值。
MinSpareThreads 最小空閒線程數,默認值300;這個MPM將基於整個服務器監控空閒線程數。假如服務器中總的空閒線程數太少,子進程將產生新的空閒線程。
MaxSpareThreads :配置最大空閒線程數。默認值是"250"。這個MPM將基於整個服務器監控空閒線程數。假如服 務器中總的空閒線程數太多,子進程將殺死多餘的空閒線程。MaxSpareThreads的取值範圍是有限制的。Apache將按照如下限制自動修正您配置的值:worker需要其大於等於MinSpareThreads加上ThreadsPerChild的和MinSpareThreads和MaxSpareThreads這兩個參數對Apache的性能影響並不大,可以按照實際情況相應調節。
ThreadLimit:每個子進程可配置的線程數上限。這個指令配置了每個子進程可配置的線程數ThreadsPerChild上限。任何在重啓期間對這個指令的改變都將被忽略,但對ThreadsPerChild的修改卻會生效。默認值是"64".
ThreadsPerChild:是worker MPM中與性能相關最密切的指令。ThreadsPerChild的最大缺省值是64。如果負載較大,64也是不夠的。這時要顯式使用ThreadLimit指令,它的最大缺省值是20000。上述兩個值位於源碼樹server/mpm/worker/worker.c中的以下兩行:
#define DEFAULT_THREAD_LIMIT 64
#define MAX_THREAD_LIMIT 20000
這兩行對應着ThreadsPerChild和ThreadLimit的限制數。最好在configure之前就把64改成所希望的值。注意,不要把這兩個值設得太高,超過系統的處理能力,從而因Apache不起動使系統很不穩定。
Worker模式下所能同時處理的請求總數是由子進程總數乘以ThreadsPerChild值決定的,應該大於等於MaxClients。如果負載很大,現有的子進程數不能滿足時,控制進程會派生新的子進程。默認最大的子進程總數是16,加大時也需要顯式聲明ServerLimit(最大值是20000)。這兩個值位於源碼樹server/mpm/worker/worker.c中的以下兩行:
#define DEFAULT_SERVER_LIMIT 16
#define MAX_SERVER_LIMIT 20000
需要注意的是,如果顯式聲明瞭ServerLimit,那麼它乘以ThreadsPerChild的值必須大於等於MaxClients,而且MaxClients必須是ThreadsPerChild的整數倍,否則Apache將會自動調節到一個相應值(可能是個非期望值)。下面是worker配置段:
<IfModule worker.c>
StartServers 3
MaxClients 2000
ServerLimit 25
MinSpareThreads 50
MaxSpareThreads 200
ThreadLimit 200
ThreadsPerChild 100
MaxRequestsPerChild 0
</IfModule>
通過上面的敘述,可以瞭解到Apache 2.0中prefork和worker這兩個重要MPM的工作原理,並可根據實際情況來配置Apache相關的核心參數,以獲得最大的性能和穩定性。
ThreadsPerChild 每個子進程建立的常駐的執行線程數。默認值是25。子進程在啓動時建立這些線程後就不再建立新的線程了。
MaxRequestsPerChild 配置每個子進程在其生存期內允許伺服的最大請求數量。到達MaxRequestsPerChild的限制後,子進程將會結束。假如MaxRequestsPerChild爲"0",子進程將永遠不會結束。將MaxRequestsPerChild配置成非零值有兩個好處:1.能夠防止(偶然的)內存泄漏無限進行,從而耗盡內存。2.給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。
MaxClients:允許同時伺服的最大接入請求數量(最大線程數量)。任何超過MaxClients限制的請求都將進入等候 隊列。默認值是"400",16 (ServerLimit)乘以25(ThreadsPerChild)的結果。因此要增加MaxClients的時候,您必須同時增加 ServerLimit的值。
ThreadsPerChild:每個子進程建立的常駐的執行線程數。默認值是25。子進程在啓動時建立這些線程後就不再建立新的線程了。
MaxRequestsPerChild:配置每個子進程在其生存期內允許伺服的最大請求數量。到達MaxRequestsPerChild的限制後,子進程將會結束。假如MaxRequestsPerChild爲"0",子進程將永遠不會結束。將MaxRequestsPerChild配置成非零值有兩個好處:1.能夠防止(偶然的)內存泄漏無限進行,從而耗盡內存。2.給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。
注意
對於KeepAlive鏈接,只有第一個請求會被計數。事實上,他改變了每個子進程限制最大鏈接數量的行爲。