Apache-工作模式(prefork/ worker/Event)那種適合你?

時間: 2018-05-28 08:31:34             作者:殘夢

Apache 2.X 支持插入式并行處理模塊,稱為多進程處理模塊(MPM)。在編譯apache時必須選擇也只能選擇一個MPM,對類UNIX系統,有幾個不同的MPM可供選擇,它們會影響到apache的速度和可伸縮性,prefork是一個非線程型的、預派生的MPM,使用多個進程,每個進程在某個確定的時間只單獨處理一個連接,效率高,但內存使用比較大


Apache 2.X  支持插入式并行處理模塊,稱為多進程處理模塊(MPM)。在編譯apache時必須選擇也只能選擇一個MPM,對類UNIX系統,有幾個不同的MPM可供選擇,它們會影響到apache的速度和可伸縮性。
首先我們看看工作模式:
 

[root@www ~]# httpd -l

Compiled in modules:

  core.c

  mod_so.c

  http_core.c

  prefork.c

那么如何設置apache的MPM呢?

需要的apache 配置安裝的時候需要指定模式:

  [root@localhost httpd-2.4.33]# ./configure --prefix=/usr/local/apache2worker --enable-so --with-mpm=prefork
  [root@localhost httpd-2.4.33]# make
  [root@localhost httpd-2.4.33]# make install

啟用上面模塊靠這句實現 --with-mpm=worker、prefork 如果要event請使用 --enable-nonportable-atomics=yes

prefork模式

prefork是一個非線程型的、預派生的MPM,使用多個進程,每個進程在某個確定的時間只單獨處理一個連接,效率高,但內存使用比較大。

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

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


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。

建議設置為非零,原因:

(1).能夠防止(偶然的)內存泄漏無限進行,從而耗盡內存。

(2).給進程一個有限壽命,從而有助于當服務器負載減輕的時候減少活動進程的數量(重生的機會)。





worker模式

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

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

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




Event模式

Apache最新的工作模式,它和worker模式很像

優點:不同的是在于它解決了keep-alive長連接的時候占用線程資源被浪費的問題(HTTP的Keepalive方式能減少TCP連接數量和網絡負載),在event工作模式中,會有一些專門的線程用來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務器的線程,執行完畢后,又允許它釋放。這增強了在高并發場景下的請求處理



上面的幾種模式不是說你感覺哪種適合你,而是根據硬件和系統來取決。
經過測試。在紅帽企業版6.2中,Event模式表現很不好。prefork模式不錯;二份參考:
 

prefork

 

<IfModule mpm_prefork_module>

ServerLimit 5120

StartServers 100

MinSpareServers 100

MaxSpareServers 300

MaxClients 5120

MaxRequestsPerChild 500

</IfModule>


event

     

<IfModule mpm_event_module>

    StartServers          2

    MaxClients          150

    MinSpareThreads      25

    MaxSpareThreads      75

    ThreadLimit          64

    ThreadsPerChild      25

    MaxRequestsPerChild   100

</IfModule>

 

 


 
相關信息
伊人久久久综在合线久久在播|亚洲国产精品一区二区久久|手机看片久久国产免费|色成年激情久久综合株洲浩扬网络科技有限责任公司