Apache之三種工作模式和配置性能優(yōu)化

1 Apache的3種模式和版本

 Apache目前一共有三種穩(wěn)定的MPM(Multi-Processing Module,多進程處理模塊)模式,它們分別是prefork,worker和event。
我們可以使用httpd -V 命令查看apache的版本和模式,如果你服務端允許了apache,你先用httpd -V試下,如果提示如下

-bash: httpd: command not found

那就先找到運行的httpd進程,ps -ef | grep httpd,然后直接用這個進程的全路徑進行-V操作

    /**/**/apache_portal/bin/httpd -V
    AH00318: WARNING: MaxRequestWorkers of 20000 would require 100 servers and
     would exceed ServerLimit of 60, decreasing to 12000.
     To increase, please see the ServerLimit directive.
    Server version: Server/2.4.18 (Unix)
    Server built:   Jul 21 2017 08:43:23
    Server's Module Magic Number: 20120211:52
    Server loaded:  APR 1.5.2, APR-UTIL 1.5.4
    Compiled using: APR 1.5.2, APR-UTIL 1.5.4
    Architecture:   64-bit
    Server MPM:     worker

這里我們可以知道apache的模式是worker模式,然后版本是2.4.18

1)prefork模式

Prefork MPM優(yōu)點:先預派生一些子進程,然后等待連接;可以減少頻繁創(chuàng)建和銷毀進程的開銷,每個子進程只有一個線程,在一個時間點內(nèi),只能處理一個請求不需要擔心線程安全問題

缺點:一個進程相對占用資源,消耗大量內(nèi)存,不擅長處理高并發(fā)

 

2)worker模式

worker使用了多進程和多線程的混合模式,worker模式也同樣會先預派生一些子進程,然后每個子進程創(chuàng)建一些線程,同時包括一個監(jiān)聽線程,每個請求過來會被分配到一個線程來服務。線程比起進程會更輕量,因為線程是通過共享父進程的內(nèi)存空間,因此,內(nèi)存的占用會減少一些,在高并發(fā)的場景下會比prefork有更多可用的線程,表現(xiàn)會更優(yōu)秀一些;另外,如果一個線程出現(xiàn)了問題也會導致同一進程下的線程出現(xiàn)問題,如果是多個線程出現(xiàn)問題,也只是影響Apache的一部分,而不是全部。由于用到多進程多線程,需要考慮到線程的安全,在使用keep-alive長連接的時候,某個線程會一直被占用,即使中間沒有請求,需要等待到超時才會被釋放(該問題在prefork模式下也存在)

 

3)event模式

它和worker模式很像,不同的是在于它解決了keep-alive長連接的時候占用線程資源被浪費的問題,在event工作模式中,會有一些專門的線程用來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務器的線程,執(zhí)行完畢后,又允許它釋放。這增強了在高并發(fā)場景下的請求處理。

 

4)我們看下httpd平均占用內(nèi)存的大小

    ps aux|grep -v grep|awk '/httpd/{sum+=$6;n++};END{print sum/n}'
    11792.7

差不多11M

 

 
2  Apache的配置和性能優(yōu)化

Apache的配置文件httpd.conf的配置方式如下,不同的模式標簽不一樣,但是里面的參數(shù)類似

prefork模式部分配置如下

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

worker模式部分配置如下

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

event模式部分配置如下

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

1)StartServers

服務器啟動時建立的子進程數(shù)量

 

2)ServerLimit

系統(tǒng)配置的最大進程數(shù)量

 

3)MinSpareServers

空閑子進程的最小數(shù)量,比如默認5;如果當前空閑子進程數(shù)少于MinSpareServers ,那么Apache將以最大每秒一個的速度產(chǎn)生新的子進程,此參數(shù)不要設的太大.

 

4)MaxSpareServers

空閑子進程的最大數(shù)量,默認10;如果當前有超過MaxSpareServers數(shù)量的空閑子進程,那么父進程會殺死多余的子進程。這參數(shù)也不需要設置太大,如果你將其設置比MinSpareServers 小,Apache會自動將其修改為MinSpareServers +1的數(shù)量。

 

5)MinSpareThreads

空閑線程數(shù)最小數(shù),這里默認是75

 

6)MaxSpareThreads

空閑線程數(shù)最大數(shù),這里默認是250

 

7) ThreadsPerChild

每個子進程固定產(chǎn)生的線程數(shù)量。

 

8)MaxRequestWorkers/MaxClients

限定服務器同一時間內(nèi)客戶端最大接入的請求數(shù)量,MaxRequestWorkers/MaxClients設置了所有子進程中的線程總數(shù)。如果現(xiàn)有子進程中的線程總數(shù)不能滿足負載,控制進程將派生新的子進程。

Apache2.3.1版本之前這參數(shù)MaxRequestWorkers被稱為MaxClients,

 

9)MaxConnectionsPerChild/MaxRequestsPerChild

每個子進程在其生命周期內(nèi)允許最大的請求數(shù)量,如果請求總數(shù)已經(jīng)達到這個數(shù)值,子進程將會結束,如果設置為0,子進程將永遠不會結束。

MaxConnectionsPerChild在Apache2.3.9之前稱之為MaxRequestsPerChild,我們可以看如下解釋

 

 

worker的工作原理是,由主控制進程生成“StartServers”個子進程,每個子進程中包含固定的ThreadsPerChild線程數(shù),各個線程獨立地處理請求。同樣,為了不在請求到來時再生成線程,MinSpareThreads和MaxSpareThreads設置了最少和最多的空閑線程數(shù);而MaxClients設置了所有子進程中的線程總數(shù)。如果現(xiàn)有子進程中的線程總數(shù)不能滿足負載,控制進程將派生新的子進程。

MinSpareThreads和MaxSpareThreads的最大缺省值分別是75和250。這兩個參數(shù)對Apache的性能影響并不大,可以按照實際情況相應調(diào)節(jié)
 

 



 

 

作者:chen.yu
深信服三年半工作經(jīng)驗,目前就職游戲廠商,希望能和大家交流和學習,
微信公眾號:編程入門到禿頭 或掃描下面二維碼
零基礎入門進階人工智能(鏈接)