Apache 的prefork MPM和worker MPM


Apache使用哪種MPM在在安裝的時候可以用
--with-mpm={beos|worker|prefork|mpmt_os2|perchild|leader|threadpool}
安裝之後可以用httpd -l命令看到。

MPM的進程模塊有有很多種( 見Apache官方文檔:http://httpd.apache.org/docs-2.0/mod/)。
今天我主要是比較一下prefork MPM和worker MPM

httpd.conf的prefork的配置參數:

# 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
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers        35
MinSpareServers     80
MaxSpareServers     100
ServerLimit         1000
MaxClients          150
MaxRequestsPerChild  0
</IfModule>

prefork的工作原理是,控制進程在最初建立“StartServers”個子進程後,爲了滿足MinSpareServers設置的需要創建一個進程,
等待一秒鐘,繼續創建兩個,再等待一秒鐘,繼續創建四個……如此按指數級增加創建的進程數,最多達到每秒32個,
直到滿足MinSpareServers設置的值爲止。這就是預派生(prefork)的由來。這種模式可以不必在請求到來時再產生新的進程,
從而減小了系統開銷以增加性能。
MaxSpareServers設置了最大的空閒進程數,如果空閒進程數大於這個值,Apache會自動kill掉一些多餘進程。這個值不要設得過大,
但如果設的值比MinSpareServers小,Apache會自動把其調整爲MinSpareServers+1。如果站點負載較大,
可考慮同時加大MinSpareServers和MaxSpareServers。

MaxRequestsPerChild設置的是每個子進程可處理的請求數。每個子進程在處理了“MaxRequestsPerChild”個請求後將自動銷燬。
  0意味着無限,即子進程永不銷燬。雖然缺省設爲0可以使每個子進程處理更多的請求,但如果設成非零值也有兩點重要的好處:
◆ 可防止意外的內存泄漏;
◆ 在服務器負載下降的時侯會自動減少子進程數。
因此,可根據服務器的負載來調整這個值。大家可以測試一下合適的值。

MaxClients是這些指令中最爲重要的一個,設定的是Apache可以同時處理的請求,是對Apache性能影響最大的參數。
其缺省值150是遠遠不夠的,如果請求總數已達到這個值(可通過ps -ef|grep http|wc -l察看),那麼後面的請求就要排隊,
直到某個已處理請求完畢。這就是系統資源還剩下很多而HTTP訪問卻很慢的主要原因。系統管理員可以根據硬件配置和負載情況來動態調整這個值。
雖然理論上這個值越大,可以處理的請求就越多。但是也不是越大越好,太大資源消耗完了也是影響性功能。

ServerLimit的最大值是20000,對於大多數站點已經足夠。如果一定要再加大這個數值,對位於源代碼樹下server/mpm/prefork/prefork.c中以下兩行做相應修改即可:

define DEFAULT_SERVER_LIMIT 256
define MAX_SERVER_LIMIT 20000


httpd.conf的worker的配置參數:

# 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         2
MaxClients         150
MinSpareThreads     25
MaxSpareThreads     75
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>

worker的工作原理是,由主控制進程生成“StartServers”個子進程,每個子進程中包含固定的ThreadsPerChild線程數,各個線程獨立地處理請求。
同樣,爲了不在請求到來時再生成線程,MinSpareThreads和MaxSpareThreads設置了最少和最多的空閒線程數;而MaxClients設置了所有子進程中的線程總數。
如果現有子進程中的線程總數不能滿足負載,控制進程將派生新的子進程。
MinSpareThreads和MaxSpareThreads的最大缺省值分別是75和250。這兩個參數對Apache的性能影響並不大,可以按照實際情況相應調節。
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將會自動調節到一個相應值(可能是個非期望值)。

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