1.3,2.0版本做了大量的優化來提升處理能力和可伸縮性,并且大多數改進在默認狀態下即可生效.但是在編譯和運行時刻,2.0也有許多可以顯著提高性能的選擇.
MPM(Multi -Processing Modules,多道處理模塊)是Apache2.0中影響性能的最核心特性.
毫不夸張地說,MPM的引入是Apache 2.0最重要的變化.大家知道,Apache是基于模塊化的設計,而Apache
2.0更擴展了模塊化設計到Web服務器的最基本功能.服務器裝載了一種多道處理模塊,負責綁定本機網絡端口、接受請求,并調度子進程來處理請求.擴展模塊化設計有兩個重要好處:
◆ Apache可以更簡潔、有效地支持多種操作系統;
◆ 服務器可以按站點的特殊需要進行自定制.
在用戶級,MPM看起來和其它Apache模塊非常類似.主要區別是在任意時刻只能有一種MPM被裝載到服務器中.
下面以Linux RedHat AS3為平臺,演示一下在Apache 2.0中如何指定MPM.
# wget http://archive.apache.org/dist/httpd/httpd-2.0.52.tar.bz2
# tar jxvf httpd-2.0.52.tar.bz2
# cd httpd-2.0.52
# ./configure ——help|grep mpm
顯示如下: ——with-mpm=MPM Choose the process model for Apache to use.
MPM={beos|worker|prefork|mpmt_os2| perchild|leader|threadpool}
上述操作用來選擇要使用的進程模型,即哪種MPM模塊.Beos、mpmt_os2分別是BeOS和OS/2上缺省的MPM,
perchild主要設計目的是以不同的用戶和組的身份來運行不同的子進程.這在運行多個需要CGI的虛擬主機時特別有用,會比1.3版中的SuExec
機制做得更好.leader和threadpool都是基于worker的變體,還處于實驗性階段,某些情況下并不會按照預期設想的那樣工作,所以
Apache官方也并不推薦使用.因此,我們主要闡述prefork和worker這兩種和性能關系最大的產品級MPM.
prefork的工作原理
如果不用“——with-mpm”顯式指定某種MPM,prefork就是Unix平臺上缺省的MPM.它所采用的預派生子進程方式也是
Apache
1.3中采用的模式.prefork本身并沒有使用到線程,2.0版使用它是為了與1.3版保持兼容性;另一方面,prefork用單獨的子進程來處理不同的請求,進程之間是彼此獨立的,這也使其成為最穩定的MPM之一.
prefork的工作原理是,控制進程在最初建立“StartServers”個子進程后,為了滿足MinSpareServers設置的需要創建一個進程,等待一秒鐘,繼續創建兩個,再等待一秒鐘,繼續創建四個……如此按指數級增加創建的進程數,最多達到每秒32個,直到滿足
MinSpareServers設置的值為止.這就是預派生(prefork)的由來.這種模式可以不必在請求到來時再產生新的進程,從而減小了系統開銷以增加性能.
worker的工作原理
相對于prefork,worker是2.0
版中全新的支持多線程和多進程混合模型的MPM.由于使用線程來處理,所以可以處理相對海量的請求,而系統資源的開銷要小于基于進程的服務器.但是,