Apache多工模組(MPMs)介紹_Linux

來源:互聯網
上載者:User

當整個世界都慢慢傾向於nginx的時候,如果你還在使用apache,那麼你可能會用盡一切辦法來保證速度。你也許會調整要載入的模組,使用Keepalive、擺弄內容協商模組(mod_negotiation,譯註:從幾個文檔中選擇一個最匹配用戶端要求的文檔)、FollowSymLinks指令(譯註:允許在此目錄中使用軟連結)以及重寫功能;你甚至可能還會投入更多硬體,並假裝自己沒有。然而,如果你運營的網站非常繁忙而不想因為記憶體的原因而導致網站崩潰,那麼你就應該關注你所使用的MPM。

MPM,也叫多道處理模組(Multi Processing Module),關係到真箇HTTP會話。從網路上的監聽、請求進入到最重要的--如何處理子請求,這裡我們討論的是子進程及子線程。對於unix系統的機器來說Apache提供了3種MPM以供選擇:; Prefork, Worker, and Event。同時,只對其他系統Apache也提供了許多其他種類的MPM,但是我們這裡主要關注最常見的,可能也是你最想看到的(也是我最擅長的)。這些MPM處理Apache伺服器用來接受、處理以及伺服器HTTP請求過程中的進程和潛線上程。

從不嚴格的角度來看,進程是一個程式的執行個體。每個進程是完全自包含的,並且在地址空間、變數、記憶體等方面和其他進程是完全獨立、隔離開來執行的。為了理解本文目的和內容,你可以思考一下下面這句話:5個Apache進程表示運行著5個不同的Apache執行個體。雖然這是相當值得警告的做法,但是這足以安全的記住本文的目的。

換句話說,一個線程被一個進程建立並擁有。一個進程可以有多個線程,這些線程並不是完全獨立的。它們共用進程為它們分配的同一個狀態以及地址空間。

總之,進程是程式的一個執行個體,它被用來告訴整個系統它的存在以及需要資源並且可以執行他自己的資源;線程只有被進程建立以後才能真正執行一些東西。因此,線程不需要發布自己而是由整個應用如進程來做,而且線程本質上使用更少的系統資源如記憶體。
 
Apache Prefork MPM

Prefork多處理模組是非線程的。它完全不使用線程,使用整個進程用來處理每個HTTP請求。當一個HTTP請求傳入,假設是用來請求你加貓咪的圖片,那麼整個進程都會去該請求捆綁而且為這個人的請求負責。如果在同一時間有其他人來瀏覽你家貓咪的圖片,那麼另一個完全不同的進程會被使用。

Prefork在快速和穩定性方面很好。Prefork只有輕微的邊緣回應時間,這是因為它不需要處理在它進程中的不同線程;同時在一個特定的請求發生錯誤的情況下它也是穩定的,因為整個進程只是由一個請求決定,而其他請求是由另外的進程來處理,所以其他請求不受影響。

Prefork也適用於如果你所使用的apache模組不能處理線程的情況。最常見的是mod_php模組(儘管它的最新努力方向是ZTS)。你可能在使用PHP以及/或者一些不能被Apache所處理的指令碼時會遇到這個問題,但是有一些指令碼除外如php-fpm。
但是,如果你需要處理大量的並發請求,這種方式會瘋狂"吃掉"系統資源。請注意,每個進程都會作為一個完整的Apache執行個體來發布自己。這意味著它會載入所有模組,而且對每個請求來說都是一個完整的web伺服器。如果請求數非常大,而由於協調器需要發布與請求數相同的進程來處理這些請求,這會很快迫使記憶體使用量率達到極限。

Apache Worker MPM

Work多工模組會使用線程,它在高並發時在記憶體使用量方面處理的很好。在多工模組中,需要的進程數較少,因為它不想Prefork那樣需要為每個請求建立一個進程,Worker模式會在進程中建立線程,請求進入的串連通過一個進程中的不同線程來處理。Worker模式中,新的串連只需要等待閒置線程即可,而不是像Prefork中那樣需要等待空閑進程。

Apache Event MPM

Event模式是非常新的。事實上,它只在Apache2.4版本中被作為穩定版發布。Event模式和Worker模式工作原理相同,它也是使用進程和線程。它們最大的區別在與Event模式會為每個請求建立一個線程,而不是為一個HTTP串連建立一個線程。
有一種情況那就是當你喜歡使用線程但是有一個應用程式,這個應用程式使用了較長的keepalive逾時時間時這種模式很適用。在Worker MPM中,線程是和串連綁定的,並且無論http請求是否被處理都保持被佔用狀態。

在Event MPM中,如果處理串連的線程只是用來處理當前請求並且會在請求處理完成後立即釋放,不管被父進程處理的HTTP串連的情況。同時,當線程在請求被處理完成立即釋放後可以被用來處理其他請求。這意味著需要更少的線程!
 
我怎麼處理這些資訊?

既然如此,你該使用哪一種?在我看來,以我最忠誠的忠告,每個人都應該使用Worker MPM,因為它在並發方面相當出色而且對RAM記憶體的使用較少,雖然如果在相容性上有問題,你可能需要切換回Prefork。

如果你使用的是最新版本的Apache,你可以嘗試使用Event MPM。

如果是用的是PHP,那麼使用Worker MPM或者Event MPM時必須使用php-fpm。如果你在Worker模式下使用了mod_php那麼你的應用可能會在這樣或那樣的表單中出錯。實際上,這時你也許應該使用的php-fpm,不論apache在何種MPM模式下。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.