Apache-三種工做模式(prefork/ worker/Event)

Apache-兩種工做模式(prefork/ worker/Eventphp

 

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

prefork模式apache

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

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

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

相關配置:網絡

httpd.conf的配置方式:多線程

<IfModule mpm_prefork_module>
    StartServers             5
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers      250
    MaxConnectionsPerChild   1000
</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。

建議設置爲非零,緣由:

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

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

 

worker模式

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

優勢:線程比起進程會更輕量,由於線程是經過共享父進程的內存空間,所以,內存的佔用會減小一些,在高併發,高流量的場景下會比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

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

MinSpareThreads

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

MaxSpareThreads

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

ThreadsPerChild  

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

MaxRequestWorkers /MaxClients

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

MaxConnectionsPerChild

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

建議設置爲非零,緣由:

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

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

 

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

 

Event模式

Apache最新的工做模式,它和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   1000
</IfModule>

模式運用:如更高伸縮性的站點能夠選擇使用線程的 MPM,即 worker 或 event; 須要可靠性或者與舊軟件兼容的站點可使用 prefork。
:不少php模塊不能工做在worker模式下,例如redhat linux自帶的php也不能支持線程安全。

相關操做:

(一)查看操做模式

httpd -l

(二)修改操做模式

安裝時:

編譯時加入參數:--with-pem=(prefork|worker)

make

make install

安裝後:

 mv httpd httpd.prefork

mv httpd.worker httpd

service httpd restart

(三)配置修改:

httpd.conf

相關文章
相關標籤/搜索