1. 程式人生 > >Apache的工作模式

Apache的工作模式

apache prefork worker maxclient 工作模式

參考鏈接:
http://httpd.apache.org/docs/2.4/
http://httpd.apache.org/docs/2.4/mpm.html/ 


MPM是Multi-Processing Modules,表示Apache中的多路處理模塊,目前在Linux上的Apache 2.2/2.4中包括三種模式:prefork、worker和event模式

1,查看apache 使用的工作模式
/usr/local/apache2/bin/httpd -l 
Compiled in modules: 
core.c 
mod_so.c 
http_core.c  
worker.c       #說明使用的worker模式

2,查看apache 加載的所有模塊
httpd -t -D DUMP_MODULES

3,preforkh和worker的概述(prefork和worker的性能差不多,選擇默認工作模式即可
prefork:
這個多路處理模塊(MPM)實現了一個非線程型的、預派生的web服務器,它的工作方式類似於Apache 1.3它適合於沒有線程安全庫,需要避免線程兼容性問題的系統。它是要求將每個請求相互獨立的情況下最好的MPM,這樣若一個請求出現問題就不會影響到其他請求。

這個MPM具有很強的自我調節能力,只需要很少的配置指令調整。最重要的是將MaxClients設置為一個足夠大的數值以處理潛在的請求高峰,同時又不能太大,以致需要使用的內存超出物理內存的大小。

worker:
此多路處理模塊(MPM)使網絡服務器支持混合的多線程多進程。由於使用線程來處理請求,所以可以處理海量請求,而系統資源的開銷小於基於進程的MPM。但是,它也使用了多進程,每個進程又有多個線程,以獲得基於進程的MPM的穩定性。

控制這個MPM的最重要的指令是,控制每個子進程允許建立的線程數的ThreadsPerChild指令,和控制允許建立的總線程數的MaxClients指令。

4,prefork和worker工作方式
prefork:
一個單獨的控制進程(父進程)負責產生子進程,這些子進程用於監聽請求並作出應答。Apache總是試圖保持一些備用的(spare)或者是空閑的子進程用於迎接即將到來的請求。這樣客戶端就不需要在得到服務前等候子進程的產生。

StartServers, MinSpareServers, MaxSpareServers, MaxClients指令用於調節父進程如何產生子進程。通常情況下Apache具有很強的自我調節能力,所以一般的網站不需要調整這些指令的默認值。可能需要處理最大超過256個並發請求的服務器可能需要增加MaxClients的值。內存比較小的機器則需要減少MaxClients的值以保證服務器不會崩潰。更多關於調整進程產生的問題請參見性能方面的提示。

在Unix系統中,父進程通常以root身份運行以便邦定80端口,而Apache產生的子進程通常以一個低特權的用戶運行。User和Group指令用於設置子進程的低特權用戶。運行子進程的用戶必須要對它所服務的內容有讀取的權限,但是對服務內容之外的其他資源必須擁有盡可能少的權限。

MaxRequestsPerChild指令控制服務器殺死舊進程產生新進程的頻率。


worker:
每個進程可以擁有的線程數量是固定的。服務器會根據負載情況增加或減少進程數量。一個單獨的控制進程(父進程)負責子進程的建立。每個子進程可以建立ThreadsPerChild數量的服務線程和一個監聽線程,該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。

Apache總是試圖維持一個備用(spare)或是空閑的服務線程池。這樣,客戶端無須等待新線程或新進程的建立即可得到處理。初始化時建立的進程數量由StartServers指令決定。隨後父進程檢測所有子進程中空閑線程的總數,並新建或結束子進程使空閑線程的總數維持在MinSpareThreads和MaxSpareThreads所指定的範圍內。由於這個過程是自動調整的,幾乎沒有必要修改這些指令的缺省值。可以並行處理的客戶端的最大數量取決於MaxClients指令。活動子進程的最大數量取決於MaxClients除以ThreadsPerChild的值。

有兩個指令設置了活動子進程數量和每個子進程中線程數量的硬限制。要想改變這個硬限制必須完全停止服務器然後再啟動服務器(直接重啟是不行的),ServerLimit是活動子進程數量的硬限制,它必須大於或等於MaxClients除以ThreadsPerChild的值。ThreadLimit是所有服務線程總數的硬限制,它必須大於或等於ThreadsPerChild指令。這兩個指令必須出現在其他workerMPM指令的前面。

在設置的活動子進程數量之外,還可能有額外的子進程處於"正在中止"的狀態但是其中至少有一個服務線程仍然在處理客戶端請求,直到到達MaxClients以致結束進程,雖然實際數量會很小。這個行為能夠通過以下禁止特別的子進程中止的方法來避免:

將MaxRequestsPerChild設為"0" 
將MaxSpareThreads和MaxClients設為相同的值 



prefork 工作模式優化參數 (4核16G服務器的httpd-mpm.conf配置文件)
<IfModule mpm_prefork_module>
    ServerLimit         2000
    StartServers          10
    MinSpareServers       20
    MaxSpareServers       50
    MaxClients          1000
    MaxRequestsPerChild   7000
</IfModule>
參數詳解:
ServerLimit         2000
這個指令設置了MaxClients最大允許配置的數值。
使用這個指令時要特別當心。如果將ServerLimit設置成一個高出實際需要許多的值,
將會有過多的共享內存被分配。如果將ServerLimit和MaxClients設置成超過系統的處理能力,Apache可能無法啟動,或者系統將變得不穩定。
對於preforkMPM,只有在你需要將MaxClients設置成高於默認值256的時候才需要使用這個指令。要將此指令的值保持和MaxClients一樣
註意:
Apache在編譯時內部有一個硬限制"ServerLimit 20000"(對於preforkMPM為"ServerLimit 
200000")。你不能超越這個限制。

StartServers          10
指定服務器啟動時建立的子進程數量,prefork默認為5。

MinSpareServers 20
指定空閑子進程的最小數量,默認為5。假如當前空閑子進程數少於MinSpareServers ,那麽Apache將以最大每秒一個的速度產生新的子進程。此參數不要設的太大。

MaxSpareServers 50
配置空閑子進程的最大數量,默認為10。假如當前有超過MaxSpareServers數量 的空閑子進程,那麽父進程將殺死多余的子進程。此參數不要 設的太大。假如您將該指令的值配置為比MinSpareServers小,Apache將會自動將其修改成"MinSpareServers+1"。

MaxClients 1000
限定同一時間客戶端最大接入請求的數量(單個進程並發線程數),默認為256。任何超過MaxClients限制的請求都將進入等候隊列,一旦一個鏈接被釋放,隊列中的請求將得到服務。要增大這個值,您必須同時增大ServerLimit 。

MaxRequestsPerChild 10000
每個子進程在其生存期內允許的最大請求數量,默認為10000.到達MaxRequestsPerChild的限制後,子進程將會結束。假如MaxRequestsPerChild為"0",子進程將永遠不會結束。
將MaxRequestsPerChild配置成非零值有兩個好處:
1.能夠防止(偶然的)內存泄漏無限進行,從而耗盡內存。 
2.給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。
    

worker 工作模式優化參數(4核16G服務器的httpd-mpm.conf配置文件)

將MaxRequestsPerChild設為"0"
將MaxSpareThreads和MaxClients設為相同的值
<IfModule mpm_worker_module>
    ServerLimit 50
    ThreadLimit 200
    StartServers 5
    MaxClients 5000
    MinSpareThreads 100
    MaxSpareThreads 500
    ThreadsPerChild 100
    MaxRequestsPerChild 7000
</IfModule>
ServerLimit 50
服務器允許配置的進程數上限。這個指令和ThreadLimit結合使用配置了MaxClients最大允許配置的數值。任何在重啟期間對這個指令的改變都將被忽略,但對MaxClients的修改卻會生效。

ThreadLimit 200
每個子進程可配置的線程數上限。這個指令配置了每個子進程可配置的線程數ThreadsPerChild上限。任何在重啟期間對這個指令的改變都將被忽略,但對ThreadsPerChild的修改卻會生效。默認值是"64".

StartServers 5
服務器啟動時建立的子進程數,默認值是"3"。

MinSpareThreads 75
最小空閑線程數,默認值是"75"。這個MPM將基於整個服務器監控空閑線程數。假如服務器中總的空閑線程數太少,子進程將產生新的空閑線程。

MaxSpareThreads 500
配置最大空閑線程數。默認值是"250"。這個MPM將基於整個服務器監控空閑線程數。假如服 務器中總的空閑線程數太多,子進程將殺死多余的空閑線 程。MaxSpareThreads的取值範圍是有限制的。Apache將按照如下限制自動修正您配置的值:worker需要其大於等於 MinSpareThreads加上ThreadsPerChild的和

MaxClients 5000
允許同時伺服的最大接入請求數量(最大線程數量)。任何超過MaxClients限制的請求都將進入等候 隊列。默認值是"400",16 (ServerLimit)乘以
25(ThreadsPerChild)的結果。因此要增加MaxClients的時候,您必須同時增加 ServerLimit的值。

ThreadsPerChild 100
每個子進程建立的常駐的執行線程數。默認值是25。子進程在啟動時建立這些線程後就不再建立新的線程了。

MaxRequestsPerChild 7000
配置每個子進程在其生存期內允許伺服的最大請求數量。到達MaxRequestsPerChild的限制後,子進程將會結束。假如MaxRequestsPerChild為"0",子進程將永遠不會結束。
將MaxRequestsPerChild配置成非零值有兩個好處:
1.能夠防止(偶然的)內存泄漏無限進行,從而耗盡內存。 
2.給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。 
註意
對於KeepAlive鏈接,只有第一個請求會被計數。事實上,他改變了每個子進程限制最大鏈接數量的行為。

公式:
ThreadLimit >= ThreadsPerChild
MaxClients = MinSpareThreads+ThreadsPerChild

Apache的工作模式