Apache 工做的三種模式:Prefork、Worker、Event

Apache 的三種工做模式(Prefork、Worker、Event)html

Web服務器Apache目前一共有三種穩定的MPM(Multi-Processing Module,多進程處理模塊)模式。web

它們分別是prefork,worker、event,它們同時也表明這Apache的演變和發展。apache

本文原文轉自米撲博客:Apache 工做的三種模式:Prefork、Worker、Event安全

如何查看咱們的Apache的工做模式呢?可使用httpd -V 命令查看,如我安裝的Apache 2.4版本。bash

# httpd -V
Server version: Apache/2.4.34 (Unix)
Server built:   Aug  2 2018 19:44:29
Server's Module Magic Number: 20120211:79
Server loaded:  APR 1.6.3, APR-UTIL 1.6.1
Compiled using: APR 1.6.3, APR-UTIL 1.6.1
Architecture:   64-bit
Server MPM:     event
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)

或者,更直接的命令 httpd -lapachectl -V | grep -i mpm服務器

# httpd -l
Compiled in modules:
  core.c
  mod_so.c
  http_core.c
  event.c
# apachectl -V | grep -i mpm
Server MPM:     event

這裏使用的是event模式,在apache的早期版本2.0默認prefork,2.2版本是worker,2.4版本是event,詳見米撲博客:Apache 服務器負載低訪問慢的緣由分析和優化方案多線程

在configure配置編譯參數的時候,可使用--with-mpm=prefork|worker|event 來指定編譯爲那一種MPM,固然也能夠用編譯爲三種都支持:--enable-mpms-shared=all,這樣在編譯的時候會在modules目錄下自動編譯出三個MPM文件的so,而後經過修改httpd.conf配置文件更改MPM併發

 

一、Prefork MPM ide

Prefork MPM實現了一個非線程的、預派生的web服務器。它在Apache啓動之初,就先預派生一些子進程,而後等待鏈接;能夠減小頻繁建立和銷燬進程的開銷,每一個子進程只有一個線程,在一個時間點內,只能處理一個請求。這是一個成熟穩定,能夠兼容新老模塊,也不須要擔憂線程安全問題,可是一個進程相對佔用資源,消耗大量內存,不擅長處理高併發的場景。高併發

如何配置在Apache的配置文件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 MPM 

和prefork模式相比,worker使用了多進程和多線程的混合模式,worker模式也一樣會先預派生一些子進程,而後每一個子進程建立一些線程,同時包括一個監聽線程,每一個請求過來會被分配到一個線程來服務。線程比起進程會更輕量,由於線程是經過共享父進程的內存空間,所以,內存的佔用會減小一些,在高併發的場景下會比prefork有更多可用的線程,表現會更優秀一些;另外,若是一個線程出現了問題也會致使同一進程下的線程出現問題,若是是多個線程出現問題,也只是影響Apache的一部分,而不是所有。因爲用到多進程多線程,須要考慮到線程的安全了,在使用keep-alive長鏈接的時候,某個線程會一直被佔用,即便中間沒有請求,須要等待到超時纔會被釋放(該問題在prefork模式下也存在)。

如何配置在Apache的配置文件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

若是負載很大,現有的子進程數不能知足時,控制進程會派生新的子進程。默認ServerLimit 最大的子進程總數是16,加大時也須要顯式聲明ServerLimit(最大值是20000)。

須要注意的是,若是顯式聲明瞭ServerLimit,那麼它乘以 MaxRequestWorkers必須是hreadsPerChild的整數倍,不然 Apache將會自動調節到一個相應值。

 

三、Event MPM 

這是Apache最新的工做模式,它和worker模式很像,不一樣的是在於它解決了keep-alive長鏈接的時候佔用線程資源被浪費的問題,在event工做模式中,會有一些專門的線程用來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務器的線程,執行完畢後,又容許它釋放。這加強了在高併發場景下的請求處理。

如何配置在Apache的配置文件httpd.conf的配置方式:

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

event 模式與 worker 模式徹底同樣,參考 worker 模式參數便可,這裏再也不重複。

 

Apache httpd 能更好的爲有特殊要求的站點定製。

例如,要求更高伸縮性的站點能夠選擇使用線程的 MPM,即 worker 或 event; 須要可靠性或者與舊軟件兼容的站點可使用 prefork。

 

常見問題

查看apache的error日誌,能夠發現許多系統運行中的問題。

server reached MaxRequestWorkers setting


[mpm_prefork:error] [pid 1134] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting

進程或者線程數目達到了MaxRequestWorkers,能夠考慮增長這個值,固然先考慮增長硬件,如內存大小、CPU、SSD硬盤等。

 

scoreboard is full

[mpm_event:error] [pid 7555:tid 140058436118400] AH00485: scoreboard is full, not at MaxRequestWorkers

這個問題好像是apache2自帶的bug,咱們無力解決。好在這個問題通常只會影響單個線程,因此暫時能夠忍。

StackOverflow: Scoreboard is full,not at MaxRequestWorkers 

一、I had this same problem. I tried different Apache versions and MPMs. I seem to get this alot with MPM Worker. Also error does not reoccur using Apache 2.2.2,Are you using cPanel? IF so try /upcp --force and increase StartServers to a higher amount like 50 as that's all I did to get this error away.

二、Try EnableMMAP Off in 00_default_settings.conf

 

apache 主要版本有:

參考:https://httpd.apache.org/docs/ 

 

關於 Apache 配置優化,請參見米撲博客:Apache 服務器負載低訪問慢的緣由分析和優化方案

 

 

參考推薦

Apache 工做的三種模式:Prefork、Worker、Event

Apache 服務器負載低訪問慢的緣由分析和優化方案

Apache 設置禁止訪問網站目錄

Apache 封禁IP及IP段訪問

Apache 日誌格式詳解

Apache 實現https+Apache http訪問轉到https

Nginx 配置文件禁止訪問目錄或文件

相關文章
相關標籤/搜索