Apache 爲改善HTTP的"'keep alive"問題,在2.0版本上引入了MPM(Multi -Processing Modules,多道處理模塊)本文主要描述說明MPM(Multi -Processing Modules,多道處理模塊)的基本工做原理和應用上的侷限。 html
運行如下代碼: linux
$ ./configure --help|grep mpm apache
顯示以下: windows
--with-mpm=MPM 安全
Choose the process model for Apache to use. 服務器
MPM={beos|worker|prefork|mpmt_os2| perchild|leader|threadpool} 多線程
BeOSbeos架構
Netwarempm_netware運維
OS/2mpmt_os2ide
Unixprefork
Windowsmpm_winnt
leader和threadpool都是基於worker的變體,還處於實驗性階段,本文主要描述prefork和worker這兩種模式工做原理。 ( 有關的詳細說明,請參見Apache官方文檔:
[url]http://httpd.apache.org/docs/2.2/mod/prefork.html[/url]
[url]http://httpd.apache.org/docs/2.2/mod/worker.html[/url]
)
prefork的工做原理及配置
若是不用“--with-mpm”顯式指定某種MPM,prefork就是Unix平臺上缺省的MPM。它所採用的預派生子進程方式也是 Apache 1.3中採用的模式。prefork自己並無使用到線程,2.0版使用它是爲了與1.3版保持兼容性;另外一方面,prefork用單獨的子進程來處理不一樣的請求,進程之間是彼此獨立的,這也使其成爲最穩定的MPM之一。
若使用prefork,在make編譯和make install安裝後,使用“httpd -l”來肯定當前使用的MPM,應該會看到prefork.c(若是看到worker.c說明使用的是worker MPM,依此類推)。
缺省生成的httpd.conf配置文件,裏面包含以下配置段:
<IfModule prefork.c>;
StartServers 5
MinSpareServers 5
MaxSpareServers 10
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訪問卻很慢的主要緣由。系統管理員能夠根據硬件配置和負載狀況來動態調整這個值。雖然理論上這個值越大,能夠處理的請求就越多,但Apache默認的限制不能大於256。若是把這個值設爲大於256,那麼 Apache將沒法起動。事實上,256對於負載稍重的站點也是不夠的。在Apache 1.3中,這是個硬限制。若是要加大這個值,必須在“configure”前手工修改的源代碼樹下的src/include/httpd.h中查找 256,就會發現“#define HARD_SERVER_LIMIT 256”這行。把256改成要增大的值(如4000),而後從新編譯Apache便可。在Apache 2.0中新加入了ServerLimit指令,使得無須重編譯Apache就能夠加大MaxClients。下面是筆者的prefork配置段:
<IfModule prefork.c>;
StartServers 10
MinSpareServers 10
MaxSpareServers 15
ServerLimit 2000
MaxClients 1000
MaxRequestsPerChild 10000
</IfModule>;
Server limits的描述參閱
[url]http://httpd.apache.org/docs/2.2/mod/mpm_common.html#serverlimit[/url]
在perfork和Worker兩種模式下定義不一樣。
worker的工做原理及配置
相對於prefork,worker是2.0 版中全新的支持多線程和多進程混合模型的MPM。因爲使用線程來處理,因此能夠處理相對海量的請求,而系統資源的開銷要小於基於進程的服務器。可是, worker也使用了多進程,每一個進程又生成多個線程,以得到基於進程服務器的穩定性。這種MPM的工做方式將是Apache 2.0的發展趨勢。
在configure -with-mpm=worker後,進行make編譯、make install安裝。在缺省生成的httpd.conf中有如下配置段:
<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將會自動調節到一個相應值(多是個非指望值)。下面是筆者的 worker配置段:
<IfModule worker.c>;
StartServers 3
MaxClients 2000
ServerLimit 25
MinSpareThreads 50
MaxSpareThreads 200
ThreadLimit 200
ThreadsPerChild 100
MaxRequestsPerChild 0
</IfModule>;
應用上的侷限:
到目前爲止,MPM和mod_ssl模塊是不兼容的。二者不能同時運行。
博主仍從事運維行業,擁有10年+ 一線運維經驗,技術上靠得住(還行吧),生活不容易,純粹補貼家用,時間充裕,與有須要的朋友 互相幫助。
業務範圍:網站、服務器、系統(linux|windows)、架構、部署、調優、排錯、安全方案、低成本解決中小量攻雞、業務上雲(全部公有云)
合做形式:代維、兼職、臨時技術支持
合做理念:誠信第1、信任是基石、不解決問題不收錢、完工才收
職業操守:講誠信和毫不影響用戶數據安全,您信任後再合做
客戶監督:本博文評論一直開放,合做的朋友們可自由發表合做後對個人評價(壞朋友請放過我吧0_0)
聯繫方式:QQ:278566109
自評:個人技術不是很好也不是不好,自信能解決絕大多數問題。截止目前合做過的項目20個左右。相信合做後不會讓您失望。
鑑於運維的敏感性,信任是很重要的,有須要的朋友們能夠聯繫我,謝謝照顧與支持,感恩~~