Apache的工作模式

來源:互聯網
上載者:User

標籤: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_MODULES3,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 >= ThreadsPerChildMaxClients = MinSpareThreads+ThreadsPerChild

Apache的工作模式

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.