Apache的三種工作模式(prefork/worker/Event)

Apache 2.4  支持插入式並行處理模塊,稱為多進程處理模塊(Multi-Processing Module 簡稱: MPM )它們分別是prefork,worker和event,它們同時也代表這Apache的演變和發展。在編譯Apache時必須選擇其中一個MPM,MPM會影響到Apache的速度和可伸縮性。

查看已安裝Apache的模式,可以使用httpd -V指令。

編譯的時候,可以通過configure的參數來指定:
–with-mpm=prefork|worker|event

也可以編譯為三種都支持,通過修改配置來更換
–enable-mpms-shared=all

prefork MPM模式

prefork是很古老但是非常穩定的Apache模式,預先建立多個子進程(fork),然後等待請求(request )。減少頻繁創建和銷毀進程的開銷。而每個進程在某個確定的時間只單獨處理一個連接,效率高,但內存使用比較大。

優點:成熟穩定,適合於沒有線程安全庫,需要避免線程相容性問題的系統。它是要求將每個請求相互獨立的情況下最好的MPM,這樣若一個請求出現問題就不會影響到其他請求。

缺點:一個進程相對佔用更多的系統資源,消耗更多的內存。而且,它並不擅長處理高併發請求,在這種場景下,它會將請求放進隊列中,一直等到有可用進程,請求才會被處理。

httpd.conf的配置方式:

<IfModule mpm_prefork_module>
StartServers                     5
MinSpareServers               5
MaxSpareServers            10
MaxRequestWorkers      250
MaxConnectionsPerChild    0
</IfModule>

StartServers
# 服務器啟動時創建的子進程數量,prefork默認是5,

MinSpareServers
#空閒子進程的最小數量,默認5;如果當前空閒子進程數少於MinSpareServers ,那麼Apache將以最大每秒一個的速度產生新的子進程。此參數不要設的太大。

MaxSpareServers
#空閒子進程的最大數量,默認10;如果當前有超過MaxSpareServers數量的空閒子進程,那麼父進程會殺死多餘的子進程。次參數也不需要設置太大,如果你將其設置比MinSpareServers 小,Apache會自動將其修改為MinSpareServers +1的數量。

MaxRequestWorkers
#限定服務器同一時間內用戶端最大接入的請求數量,默認是256;任何超過了MaxRequestWorkers限制的請求都要進入等待隊列,一旦一個個連接被釋放,隊列中的請求才將得到服務,如果要增大這個數值,必須先增大ServerLimit。在Apache2.3.1版本之前這參數MaxRequestWorkers被稱為MaxClients。

MaxConnectionsPerChild
#每個子進程在其生命週期內允許最大的請求數量,如果請求總數已經達到這個數值,子進程將會結束,如果設置為0,子進程將永遠不會結束。在Apache2.3.9之前稱之為MaxRequestsPerChild。

worker MPM模式

worker使用了多進程和多線程的混合模式,worker模式也同樣預先建立多個子進程(fork),然後每個子進程創建一些線程,同時包括一個監聽線程,每個請求過來會被分配到一個線程來服務。

優點:線程比起進程會更輕量,因為線程是通過共用父進程的內存空間,因此,內存的佔用會更少,在高併發,高流量的場景下會比prefork有更多可用的線程,表現會更優秀一些。

缺點:如果一個線程出現了問題也會導致同一進程下的線程出現問題,如果是多個線程出現問題,也只是影響Apache的一部分,而不是全部。由於用到多進程多線程,需要考慮到線程的安全了,在使用keep-alive長連接的時候,某個線程會一直被佔用,即使中間沒有請求,需要等待到超時才會被釋放(這個問題在prefork模式下也存在)。

httpd.conf的配置方式:

<IfModule mpm_worker_module>
StartServers             3
ServerLimit 16
MinSpareThreads         75
MaxSpareThreads        250
ThreadsPerChild         25
MaxRequestWorkers      400
MaxConnectionsPerChild   1000
</IfModule>

StartServers
#服務器啟動時創建的子進程數量,在workers模式下默認是3.

ServerLimit
#系統配置的最大進程數量

MinSpareThread
#空閒子進程的最小數量,默認75

MaxSpareThreads
#空閒子進程的最大數量,默認250

ThreadsPerChild
#每個子進程產生的線程數量,默認是64

MaxRequestWorkers /MaxClients
#限定服務器同一時間內用戶端最大接入的請求數量.

MaxConnectionsPerChild
#每個子進程在其生命週期內允許最大的請求數量,如果請求總數已經達到這個數值,子進程將會結束,如果設置為0,子進程將永遠不會結束。在Apache2.3.9之前稱之為MaxRequestsPerChild。

Worker模式下所能同時處理的請求總數是由子進程總數乘以ThreadsPerChild 值決定的,應該大於等於MaxRequestWorkers。如果負載很大,現有的子進程數不能滿足時,控制進程會派生新的子進程。默認最大的子進程總數是16,加大時 也需要顯式聲明ServerLimit(最大值是20000)。需要注意的是,如果顯式聲明瞭ServerLimit,那麼它乘以 ThreadsPerChild的值必須大於等於MaxRequestWorkers,而且MaxRequestWorkers必須是ThreadsPerChild的整數倍,否則 Apache將會自動調節到一個相應值。

event模式

這個是Apache中最新的模式,在現在版本里的已經是很穩定。event和worker模式很像,不同的是在於它解決了keep-alive長連接的時候佔用線程資源被浪費的問題(HTTP的Keepalive方式能減少TCP連接數量和網絡負載),在event工作模式中,會有一些專門的線程用來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務器的線程,執行完畢後,又允許它釋放。這增強了在高併發場景下的請求處理能力。

httpd.conf的配置方式:

<IfModule mpm_event_module>
StartServers                       3
ServerLimit                       16
MinSpareThreads               75
MaxSpareThreads             250
ThreadsPerChild                 25
MaxRequestWorkers          400
MaxConnectionsPerChild       0
</IfModule>

模式運用:如更高伸縮性的站點可以選擇使用線程的 MPM,即 worker 或 event; 需要可靠性或者與舊軟件兼容的站點可以使用 prefork。

Be the first to comment

Leave a Reply

Your email address will not be published.