2009年5月23日 星期六

Apache Multi-Processing Modules多行程模組

MPM是Apache中的一個模組,全名為Multi-Processing Module多行程模組,這個模組是介於APR和底層的作業系統(Operation System, OS)的一個模組,其目的是用來最佳化,使得Apache在各式的OS上能有傑出的效能表現。

MPM本身是系統層級(system-level)的模組,意思就是說,開發上和其他模組會不一樣,哪裡不一樣?目前還在研究當中。不過,我們大多數的應用只會按照一般模組的樣子來開發,絕大多數都是這種開發方式(即非系統層級)。

早期Apache發展在UNIX之類的作業系統上,這類系統多為多處理器的伺服器,而作業系統會依照請求(request)分岔(fork)產生其他行程(process)來處理,一般來說,Apache啟動的時候,會產生一個集散區(pool,也有稱為"池")來管理這些行程。之後2.0版本,為了能夠跨平台(cross-platform)的高效率、最佳化運作,所以才設計出MPM這個模組。

實務應用上來說,只有UNIX之類的作業系統有較多的設定可供選擇使用。我目前是以windows開發,真的選項就只有兩個可以設定:MaxRequestsPerChildThreadsPerChild兩個指令。其他指令請參考http://httpd.apache.org/docs/2.2/mod/mpm_common.html

在MPM這個部分當中,因為跟底層OS有密切關係,其實MPM有好幾個類別,有些是給UNIX用的,有些是給Windows(WIN32)用的,有些則給其他OS用的,所以再看這些指令的時候,必須注意它所依賴的模組,否則社定會失敗。另一個問題是,我們可以選擇使用哪個MPM嗎?應該是不行,除非你自己重新complie一次,MPM的設定在編譯Apache時就已經決定了!

以UNIX這群的MPM來說,有Prefork MPM、Worker MPM以及正在試驗的Event MPM。
  • Prefork MPM是非執行緒的架構,和以往1版的類似。
  • Worker MPM是多執行緒的架構,其執行緒和每個請求連線有關。
  • Event MPM是正在試驗當中,將執行緒與請求連線的關係解耦合,可以避免請求連線超出執行緒的問題。
結論:開發Apache的模組、應用程式來說,不需要理會MPM,請忽略MPM這個模組!

我目前以windows開發,所以主要是專注於mpm_winnt,其指令Directives有
  • CoreDumpDirectory
  • Listen
  • ListenBacklog
  • MaxMemFree
  • MaxRequestsPerChild
  • PidFile
  • ReceiveBufferSize
  • ScoreBoardFile
  • SendBufferSize
  • ThreadLimit
  • ThreadsPerChild
  • ThreadStackSize
  • Win32DisableAcceptEx

沒有留言:

張貼留言