Apache 2.x支持插入式並行處理模塊,稱為多路處理模塊(MPM Multi-Processing Modules),在編譯Apache時必須選擇一個MPM(有且只能選擇一次),針對非UNIX系統的MPM有:beos、 mpm_netware、mpmt_os2、mpm_winnt。對於UNIX系統,有幾個不同的MPM可供選擇,它們都會影響到httpd的速度和可伸縮性:

? preforkMPM使用多個子進程,但每個子進程並不包含多線程,每個進程只處理一個鏈接,在許多系統上它的速度和workerMPM一樣快,但是需要更多的內存。

? workerMPM使用多個子進程,每個子進程中又有多個線程,每個線程處理一個請求。該MPM通常對高流量的伺服器是一個不錯的選擇,因為它比preforkMPM需要更少的內存且更具有伸縮性。

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

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

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

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

在Unix系統中,父進程通常以root身份運行以便邦定80埠,而Apache產生的子進程通常以一個低特權的用戶運行,User和Group指令用於設置子進程的低特權用戶。運行子進程的用戶必須要對它所服務的內容有讀取的許可權,但是對服務內容之外的其他資源必須擁有儘可能少的許可權。MaxRequestsPerChild指令控制伺服器殺死舊進程產生新進程的頻率。

MaxSpareServers

該指令設置空閑子進程的最大數量。所謂空閑子進程是指沒有正在處理請求的子進程。如果當前有超過MaxSpareServers數量的空閑子進程,那麼父進程將殺死多餘的子進程。只有在非常繁忙機器上才需要調整這個參數,此參數設的通常不能設置過大。如果你將該指令的值設置為比MinSpareServers小,Apache將會自動將其修改成「MinSpareServers+1」。

MinSpareServers

該指令設置空閑子進程的最小數量。所謂空閑子進程是指沒有正在處理請求的子進程,如果當前空閑子進程數少於MinSpareServers ,那麼Apache將以最大每秒一個的速度產生新的子進程。只有在非常繁忙機器上才需要調整這個參數,不應將此參數設置過大。

MaxClients

該指令設置了允許同時伺服的最大接入請求數量。任何超過MaxClients限制的請求都將進入等候隊列,直到達到ListenBacklog指令限制的最大值為止,一旦一個鏈接被釋放,隊列中的請求將得到服務。

對於非線程型的MPM(也就是prefork),MaxClients表示可以用於伺服客戶端請求的最大子進程數量,默認值是256,要增大這個值,必須同時增大ServerLimit的值。

對於線程型或者混合型的MPM(也就是beos或worker),MaxClients表示可以用於伺服客戶端請求的最大線程數量。線程型的beos的默認值是50,對於混合型的MPM默認值是16(ServerLimit)乘以25(ThreadsPerChild)的結果。因此要將MaxClients增加到超過16個進程才能提供的時候,必須同時增加ServerLimit的值。

MaxClients計算公式如下:

MaxClients ≈ (RAM - size_all_other_processes)/(size_apache_process)

如以下實例:

系統:VPS(虛擬專用伺服器)Linux RedHat5 128MB RAM

Apache:2.2 mpm_prefork、mod_php、mod_rewrite、mod_ssl及其它一些模塊

其他服務:MySQL、BIND、Sendmail

報告的系統內存:120MB

報告的httpd進程大小:7-13MB

假設Apache可用內存為:90MB

最佳的設置:

StartServers 5

MinSpareServers 5

MaxSpareServers 10

ServerLimit 15

MaxClients 15

MaxRequestsPerChild 2000

ServerLimit

該指令指伺服器允許配置的進程數上限,對於preforkMPM,這個指令設置了MaxClients最大允許配置的數值。對於workerMPM,這個指令和ThreadLimit結合使用設置了MaxClients最大允許配置的數值。任何在重啟期間對這個指令的改變都將被忽略,但對MaxClients的修改卻會生效。

使用這個指令時要特別注意,如果將ServerLimit設置成一個高出實際需要許多的值,將會有過多的共享內存被分配,如果將ServerLimit和MaxClients設置成超過系統的處理能力,Apache可能無法啟動,或者系統將變得不穩定。

對於preforkMPM,只有在需要將MaxClients設置成高於默認值256的時候才需要使用這個指令,要將此指令的值保持和MaxClients一樣。

對於workerMPM,只有在需要將MaxClients和ThreadsPerChild設置成需要超過默認值16個子進程的時候才需要使用這個指令。不要將該指令的值設置的比MaxClients 和ThreadsPerChild需要的子進程數量高。

注意:Apache在編譯時內部有一個硬限制「ServerLimit 20000」(對於preforkMPM為「ServerLimit 200000」),不能超越這個限制。

StartServers

該指令是指伺服器啟動時建立的子進程數。StartServers指令設置了伺服器啟動時建立的子進程數量。因為子進程數量動態的取決於負載的輕重,所有一般沒有必要調整這個參數。不同的MPM默認值也不一樣,對於worker默認值是「3」,對於prefork默認值是「5」,mpmt_os2是「2」。

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

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

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

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

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

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

? 將MaxRequestsPerChild設為「0」;

? 將MaxSpareThreads和MaxClients設為相同的值;

Apache Winnt MPM 是專門針對Windows NT優化的MPM(多路處理模塊),它使用一個單獨的父進程產生一個單獨的子進程,在這個子進程中輪流產生多個線程來處理請求,也就是說 mpm_winnt只能啟動父子兩個進程,不能像Linux下那樣同時啟動多個進程。

mpm_winnt主要通過ThreadsPerChild和MaxRequestsPerChild兩個參數來優化Apache。

關於StartServers、MinSpareServers、MaxSpareServers、MaxClients和ServerLimit的設置與Apache Prefork MPM模塊中的設置一致。

ThreadsPerChild

這個參數用於設置每個進程的線程數,子進程在啟動時建立這些線程後就不再建立新的線程了. 一方面因為mpm_winnt不能啟動多個進程,所以這個數值要足夠大,以便可以處理可能的請求高峯;另一方面該參數以伺服器的響應速度為準的,數目太大的反而會變慢。因此需要綜合均衡一個合理的數值。

mpm_winnt上的默認值是64,最大值是1920,建議設置為100-500之間,伺服器性能高的話值大一些,反之值小一些。

MaxRequestsPerChild

該參數表示每個子進程能夠處理的最大請求數,即同時間內子進程數目。設置為零表示不限制, mpm_winnt上的默認值就是0。

注意:建議不應該設置為0,主要基於兩點考慮:第一:可以防止(偶然的)內存泄漏無限進行,從而耗盡內存;第二:給進程一個有限壽命,從而有助於當伺服器負載減輕的時候減少活動進程的數量。

類UNIX常用的模式有三種:prefork 、worker 、event

prefork模塊工作的原理如下:

worker模塊工作原理如下:

event模塊工作原理如下:

推薦閱讀:

查看原文 >>
相關文章