青蛙學Linux—Apache的MPM模式和httpd-mpm.conf


Apache目前一共有三種穩定的MPM模式(Multi-Processing Module,多進程處理模塊),分別是prefork、worker和event,它們也代表着Apache的演變和發展。在Apache 2.0版本中默認使用的是prefork,2.2版本默認使用的是worker,2.4版本默認使用的是event。

可以使用Apache安裝目錄下的bin目錄中的httpd查看當前使用的MPM模式,使用以下命令:

./httpd -V

返回的信息中Server MPM即為當前Apache使用的MPM模式。

如果要指定Apache的運行模式,可以在configure時使用

--with-mpm=prefork|worker|event

來指定具體使用的MPM模式,也可以使用

--enable-mpms-shared=all

使Apache支持全部三種MPM模式。

在Apache的子配置文件httpd-mpm.conf中可以對這三種MPM模式進行配置。

1、prefork

prefork是一個古老但是非常穩定的MPM模式,實現了一個非線程的、預派生子進程的工作機制。在Apache啟動時,會預先派生出一些子進程,然后等待請求,這種方式可以減少頻繁創建和銷毀進程的開銷;每個子進程只有一個線程,在一個時間點內只能處理一個請求,因此也不用擔心線程安全問題。但是,一個進程占用的資源相對比較多,會消耗大量內存(正常情況下一個子進程占用2-3M內存),在處理高並發的時會存在性能瓶頸。

1

prefork的配置位於httpd-mpm.conf的如下部分:

<IfModule mpm_prefork_module>
    StartServers             5
    MinSpareServers          5
    MaxSpareServers         10
    MaxRequestWorkers      250
    MaxConnectionsPerChild   0
</IfModule>
  • StartServers:Apache在啟動時自動啟動的進程數
  • MinSpareServers:最小空閑進程數。保持空閑進程可以不必在請求到來時產生新的進程,以減小系統的開銷
  • MaxSpareServers:最大空閑進程數。一旦空閑進程超過這里設置的值,Apache會自動關閉多余的進程;如果該值小於MinSpareServers,Apache會自動調整為MinSpareServers+1
  • MaxRequestWorkers:最大同時處理請求的進程數,也就是最大的同時連接數,超過該數目的請求將排隊;該指令默認的最大值為256,如果需要加大要添加Server Limit指令 
  • MaxConnectionsPerChild:每個子進程可以處理的最大請求數,也就是一個進程所能提供的最大傳輸次數,當一個進程的請求超過此數目后,連接將自動關閉。0為無限,即子進程永不銷毀,推薦設置為20000,基本能滿足中小型網站的需要

2、worker

worker使用了多進程和多線程的混合模式。首先,預先派生出一些子進程,然后每個子進程會創建少量線程,同時包括一個監聽線程,請求由線程提供服務。線程比起進程更輕量級,因為線程共享父進程的內存空間;多進程多線程模式可以最大的保證服務的穩定性。worker模式消耗內存較小,且由於擁有比較多的處理線程,可同時保持大量的連接,在高並場景下表現比prefork優秀;但是線程消耗的是CPU的資源,所以在worker模式下對於CPU的消耗較大。

2

worker的配置位於httpd-mpm.conf的如下部分:

<IfModule mpm_worker_module>
    StartServers             3
    MinSpareThreads         75
    MaxSpareThreads        250 
    ThreadsPerChild         25
    MaxRequestWorkers      400
    MaxConnectionsPerChild   0
</IfModule>
  • StartServers:Apache啟動時的初始子進程數,默認最大的子進程數為16,加大時需要通過ServerLimit指令指定(最大值20000)
  • MinSpareThreads:最小空閑線程數
  • MaxSpareThreads:最大空閑線程數
  • ThreadsPerChild:每個子進程的工作線程數,該指令在worker模式下與性能密切相關,默認最大值為64,如果需要提高,使用ThreadLimit指令指定(最大值20000);worker模式下同時處理的請求數為子進程數乘以ThreadsPerChild,應該大於等於MaxRequestWorkers
  • MaxRequestWorkers:同時處理的最大請求數。如果現有自己成中的線程總數不能滿足請求,控制進程將派生出新的子進程;該指令的值必須是ThreadsPerChild的整數倍,否則Apache會自動調整到一個合適的值;如果顯示聲明了ServerLimit,那么ServerLimit乘以ThreadsPerChild必須大於等於該指令的值
  • MaxConnectionsPerChild:子進程自動終止前可處理的最大連接數。子進程在處理完指定的連接次數之后,將會被父進程終止,此時子進程占用的內存也被釋放。0為無限制,即不終止進程

3、event

event是Apache最新的MPM模式,與worker類似,但是event解決了worker下長連接線程的阻塞問題。在event中,會有專門的一些線程用來管理長連接類型的線程,當請求到達時,將請求傳遞給線程進行處理,處理完畢之后允許釋放,這就增強了在高並發場景下的請求處理能力。

3

event的配置位於httpd-mpm.conf的如下部分:

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

其中每個指令的含義同worker模式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM