Apache 裏的 MPM 調優比較

1、什麼是MPM?
Multi-Processing Module (MPM) implements a hybrid multi-process multi-threaded server。(多進程、多線程)

2、有多少種MPM?
大致有:prefork MPM、worker MPM、BeOS MPM、NetWare MPM、OS/2 MPM、WinNT MPM。   

3、怎麼知道apache當前用的是哪個MPM?
linux及windows下都可以使用命令:“httpd -l ” 進行查詢。

4、各個MPM是怎麼工作及如何優化?

(1)prefork MPM
        <IfModule mpm_prefork_module>
            StartServers                10
            MinSpareServers        10
            MaxSpareServers        15
            ServerLimit                  2000
            MaxClients                   1000
            MaxRequestsPerChild 10000
        </IfModule>
        啓動時建立StartServers個子進程,
        然後按每秒創建指數級個進程直到達到MinSpareServers個進程(最多增到每秒32個),
        如果空閒進程數大於MaxSpareServers,則檢查kill掉一些空閒進程。
        MaxRequestPerChild指定每個進程處理了多少個請求後就自我毀滅。
        MaxClients指定apache最多可以同時處理的請求數,也就是進程數?
        MaxClients默認不能大於256,可以通過設定ServerLimit來增大這個限制數,最大20000?

//默認的MaxClient最大是256個線程,假如想配置更大的值,就的加上ServerLimit這個參數。20000是ServerLimit這個參數的最大值。假如需要更大,則必須編譯apache,此前都是無需重新編譯Apache。
生效前提:必須放在其他指令的前面
StartServers   5
//指定服務器啓動時建立的子進程數量,prefork默認爲5。
MinSpareServers   5
//指定空閒子進程的最小數量,默認爲5。假如當前空閒子進程數少於MinSpareServers ,那麼Apache將以最大每秒一個的速度產生新的子進程。此參數不要設的太大。
MaxSpareServers   10
//配置空閒子進程的最大數量,默認爲10。假如當前有超過MaxSpareServers數量 的空閒子進程,那麼父進程將殺死多餘的子進程。此參數不要 設的太大。假如您將該指令的值配置爲比MinSpareServers小,Apache將會自動將其修改成"MinSpareServers+1"。
MaxClients   256
//限定同一時間客戶端最大接入請求的數量(單個進程併發線程數),默認爲256。任何超過MaxClients限制的請求都將進入等候隊列,一旦一個鏈接被釋放,隊列中的請求將得到服務。要增大這個值,您必須同時增大ServerLimit 。
MaxRequestsPerChild 10000
//每個子進程在其生存期內允許伺服的最大請求數量,默認爲10000.到達MaxRequestsPerChild的限制後,子進程將會結束。假如MaxRequestsPerChild爲"0",子進程將永遠不會結束。
將MaxRequestsPerChild配置成非零值有兩個好處:
1.能夠防止(偶然的)內存泄漏無限進行,從而耗盡內存。
2.給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。
工作方式:
一個單獨的控制進程(父進程)負責產生子進程,這些子進程用於監聽請求並作出應答。Apache總是試圖保持一些備用的 (spare)或是空閒的子進程 用於迎接即將到來的請求。這樣客戶端就無需在得到服務前等候子進程的產生。在Unix系統中,父進程通常以root身份運行以便邦定80端口,而 Apache產生的子進程通常以一個低特權的用戶運行。User和Group指令用於配置子進程的低特權用戶。運行子進程的用戶必須要對他所服務的內容有 讀取的權限,但是對服務內容之外的其他資源必須擁有儘可能少的權限。


2)worker:
        <IfModule mpm_worker_module>
            StartServers                  3
            MaxClients                     2000
            ServerLimit                    25
            ThreadLimit                   200
            ThreadsPerChild            100
            MinSpareThreads         50
            MaxSpareThreads        200
            MaxRequestsPerChild   0
        </IfModule>
        啓動時建立StartServers個子進程,
        每個進程包含ThreadsPerChild個線程,缺省最大64
        MinSpareThreads定義最小的空閒線程數,最大75
        MaxSpareThreads定義最大的空閒線程數,超過則執行清理?最大250
        MaxClients定義所有子進程中的線程總數
        ThreadLimit,最大20000,默認64
        ServerLimit,最大值20000,默認16
        需要注意的是,如果顯式聲明瞭ServerLimit,那麼它乘以ThreadsPerChild的值必須大於等於MaxClients,而且 MaxClients必須是ThreadsPerChild的整數倍,否則Apache將會自動調節到一個相應值(可能是個非期望值)。

\\大家自己根據機子的配置設定,同時記住公式,不然啓動APACHE會報錯

注意
對於KeepAlive鏈接,只有第一個請求會被計數。事實上,它改變了每個子進程限制最大鏈接數量的行爲。

ThreadLimit >= ThreadsPerChild
MaxClients <= ServerLimit * ThreadsPerChild 必須是ThreadsPerChild的倍數
MaxSpareThreads >= MinSpareThreads+ThreadsPerChild

 

ServerLimit 16
//服務器允許配置的進程數上限。這個指令和ThreadLimit結合使用設置了MaxClients最大允許配置的數值。任何在重啓期間對這個指令的改變都將被忽略,但對MaxClients的修改卻會生效。
ThreadLimit 64
//每個子進程可配置的線程數上限。這個指令設置了每個子進程可配置的線程數ThreadsPerChild上限。任何在重啓期間對這個指令的改變都將被忽略,但對ThreadsPerChild的修改卻會生效。默認值是”64″.
StartServers 3
//服務器啓動時建立的子進程數,默認值是”3″。
MinSpareThreads 75
//最小空閒線程數,默認值是”75″。這個MPM將基於整個服務器監視空閒線程數。如果服務器中總的空閒線程數太少,子進程將產生新的空閒線程。
MaxSpareThreads 250
//設置最大空閒線程數。默認值是”250″。這個MPM將基於整個服務器監視空閒線程數。如果服務器中總的空閒線程數太多,子進程將殺死多餘的空閒線 程。MaxSpareThreads的取值範圍是有限制的。Apache將按照如下限制自動修正你設置的值:worker要求其大於等於 MinSpareThreads加上ThreadsPerChild的和
MaxClients 400
//允許同時伺服的最大接入請求數量(最大線程數量)。任何超過MaxClients限制的請求都將進入等候隊列。默認值是”400″ ,16(ServerLimit)乘以25(ThreadsPerChild)的結果。因此要增加MaxClients的時候,你必須同時增加 ServerLimit的值。
ThreadsPerChild 25
//每個子進程建立的常駐的執行線程數。默認值是25。子進程在啓動時建立這些線程後就不再建立新的線程了。
MaxRequestsPerChild 0
//設置每個子進程在其生存期內允許伺服的最大請求數量。到達MaxRequestsPerChild的限制後,子進程將會結束。如果MaxRequestsPerChild爲”0″,子進程將永遠不會結束。
將MaxRequestsPerChild設置成非零值有兩個好處:
1.可以防止(偶然的)內存泄漏無限進行,從而耗盡內存。
2.給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。


(3)WinNT MPM:
        <IfModule mpm_winnt_module>
            ThreadsPerChild         500
            MaxRequestsPerChild 10000
        </IfModule>
        mpm_winnt.c是專門針對Windows NT優化的MPM(多路處理模塊),它使用一個單獨的父進程產生一個單獨的子進程,在這個子進程中輪流產生多個線程來處理請求。也就是說 mpm_winnt只能啓動父子兩個進程, 不能像Linux下那樣同時啓動多個進程。
ThreadLimit,默認1920,最大15000,限制單個進程的線程總數。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章