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

1 Apache的3種模式和版本

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

-bash: httpd: command not found

那就先找到運(yùn)行的httpd進(jìn)程,ps -ef | grep httpd,然后直接用這個(gè)進(jìn)程的全路徑進(jìn)行-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)點(diǎn):先預(yù)派生一些子進(jìn)程,然后等待連接;可以減少頻繁創(chuàng)建和銷毀進(jìn)程的開銷,每個(gè)子進(jìn)程只有一個(gè)線程,在一個(gè)時(shí)間點(diǎn)內(nèi),只能處理一個(gè)請(qǐng)求不需要擔(dān)心線程安全問題

缺點(diǎn):一個(gè)進(jìn)程相對(duì)占用資源,消耗大量?jī)?nèi)存,不擅長(zhǎng)處理高并發(fā)

 

2)worker模式

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

 

3)event模式

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

 

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的配置方式如下,不同的模式標(biāo)簽不一樣,但是里面的參數(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

服務(wù)器啟動(dòng)時(shí)建立的子進(jìn)程數(shù)量

 

2)ServerLimit

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

 

3)MinSpareServers

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

 

4)MaxSpareServers

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

 

5)MinSpareThreads

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

 

6)MaxSpareThreads

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

 

7) ThreadsPerChild

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

 

8)MaxRequestWorkers/MaxClients

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

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

 

9)MaxConnectionsPerChild/MaxRequestsPerChild

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

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

 

 

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

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

 



 

 

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