首先我們看看工作模式:
[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
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>