httpd_mpm


# 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鏈接,只有第一個請求會被計數。事實上,他改變了每個子進程限制最大鏈接數量的行爲。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章