Apache目前一共有三種穩定的MPM模式(Multi-Processing Module,多進程處理模塊),分別是prefork、worker和event,它們也代表着Apache的演變和發展。在Apache 2.0版本中默認使用的是prefork,2.2版本默認使用的是worker,2.4版本默認使用的是event。
可以使用Apache安裝目錄下的bin目錄中的httpd查看當前使用的MPM模式,使用以下命令:
./httpd -V
返回的信息中Server MPM即為當前Apache使用的MPM模式。
如果要指定Apache的運行模式,可以在configure時使用
--with-mpm=prefork|worker|event
來指定具體使用的MPM模式,也可以使用
--enable-mpms-shared=all
使Apache支持全部三種MPM模式。
在Apache的子配置文件httpd-mpm.conf中可以對這三種MPM模式進行配置。
1、prefork
prefork是一個古老但是非常穩定的MPM模式,實現了一個非線程的、預派生子進程的工作機制。在Apache啟動時,會預先派生出一些子進程,然后等待請求,這種方式可以減少頻繁創建和銷毀進程的開銷;每個子進程只有一個線程,在一個時間點內只能處理一個請求,因此也不用擔心線程安全問題。但是,一個進程占用的資源相對比較多,會消耗大量內存(正常情況下一個子進程占用2-3M內存),在處理高並發的時會存在性能瓶頸。
prefork的配置位於httpd-mpm.conf的如下部分:
<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 250 MaxConnectionsPerChild 0 </IfModule>
- StartServers:Apache在啟動時自動啟動的進程數
- MinSpareServers:最小空閑進程數。保持空閑進程可以不必在請求到來時產生新的進程,以減小系統的開銷
- MaxSpareServers:最大空閑進程數。一旦空閑進程超過這里設置的值,Apache會自動關閉多余的進程;如果該值小於MinSpareServers,Apache會自動調整為MinSpareServers+1
- MaxRequestWorkers:最大同時處理請求的進程數,也就是最大的同時連接數,超過該數目的請求將排隊;該指令默認的最大值為256,如果需要加大要添加Server Limit指令
- MaxConnectionsPerChild:每個子進程可以處理的最大請求數,也就是一個進程所能提供的最大傳輸次數,當一個進程的請求超過此數目后,連接將自動關閉。0為無限,即子進程永不銷毀,推薦設置為20000,基本能滿足中小型網站的需要
2、worker
worker使用了多進程和多線程的混合模式。首先,預先派生出一些子進程,然后每個子進程會創建少量線程,同時包括一個監聽線程,請求由線程提供服務。線程比起進程更輕量級,因為線程共享父進程的內存空間;多進程多線程模式可以最大的保證服務的穩定性。worker模式消耗內存較小,且由於擁有比較多的處理線程,可同時保持大量的連接,在高並場景下表現比prefork優秀;但是線程消耗的是CPU的資源,所以在worker模式下對於CPU的消耗較大。
worker的配置位於httpd-mpm.conf的如下部分:
<IfModule mpm_worker_module> StartServers 3 MinSpareThreads 75 MaxSpareThreads 250 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 0 </IfModule>
- StartServers:Apache啟動時的初始子進程數,默認最大的子進程數為16,加大時需要通過ServerLimit指令指定(最大值20000)
- MinSpareThreads:最小空閑線程數
- MaxSpareThreads:最大空閑線程數
- ThreadsPerChild:每個子進程的工作線程數,該指令在worker模式下與性能密切相關,默認最大值為64,如果需要提高,使用ThreadLimit指令指定(最大值20000);worker模式下同時處理的請求數為子進程數乘以ThreadsPerChild,應該大於等於MaxRequestWorkers
- MaxRequestWorkers:同時處理的最大請求數。如果現有自己成中的線程總數不能滿足請求,控制進程將派生出新的子進程;該指令的值必須是ThreadsPerChild的整數倍,否則Apache會自動調整到一個合適的值;如果顯示聲明了ServerLimit,那么ServerLimit乘以ThreadsPerChild必須大於等於該指令的值
- MaxConnectionsPerChild:子進程自動終止前可處理的最大連接數。子進程在處理完指定的連接次數之后,將會被父進程終止,此時子進程占用的內存也被釋放。0為無限制,即不終止進程
3、event
event是Apache最新的MPM模式,與worker類似,但是event解決了worker下長連接線程的阻塞問題。在event中,會有專門的一些線程用來管理長連接類型的線程,當請求到達時,將請求傳遞給線程進行處理,處理完畢之后允許釋放,這就增強了在高並發場景下的請求處理能力。
event的配置位於httpd-mpm.conf的如下部分:
<IfModule mpm_event_module> StartServers 3 MinSpareThreads 75 MaxSpareThreads 250 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 0 </IfModule>
其中每個指令的含義同worker模式。