Linux/UnixLinux系統下Apache 併發數的優化apache
Apache Http服務器採用prefork或者是worker兩種併發控制模式。安全
preforkMPM服務器
使用多個子進程,每一個子進程只有一個線程。每一個進程在某個肯定的時間只能維持一個鏈接。在大多數平臺 上,PreforkMPM在效率上要比Worker MPM要高,可是內存使用大得多。prefork的無線程設計在某些狀況下將比worker更有優點:它可使用那些沒有處理好線程安全的第三方模塊,並 且對於那些線程調試困難的平臺而言,它也更容易調試一些。併發
workerMPM優化
使用多個子進程,每一個子進程有多個線程。每一個線程在某個肯定的時間只能維持一個鏈接。一般來講,在一個高流量的HTTP服務器上,Worker MPM是個比較好的選擇,由於Worker MPM的內存使用比PreforkMPM要低得多。但worker MPM也由不完善的地方,若是一個線程崩潰,整個進程就會連同其全部線程一塊兒"死掉".因爲線程共享內存空間,因此一個程序在運行時必須被系統識別爲"每 個線程都是安全的"。spa
通常來講咱們的Apache Http Server都是裝在Unix/Linux下的,並且是採用源碼編譯的方式來安裝的,咱們可以指定在編譯時Apache就採用哪一種模式,爲了明確咱們目前 的Apache採用的是哪一種模式在工做,咱們還可使用httpd –l命令即在Apache的bin目錄下執行httpd –l,來確認咱們使用的是哪一種模式。線程
咱們使用Apache配置語言中的」 IfModule」來自動選擇模式的配置。設計
在httpd.conf文件中定位到最後一行LoadModule,敲入回車,加入以下內容:調試
<IfModule prefork.c>繼承
ServerLimit 20000
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 1000
MaxRequestsPerChild 0
</IfModule>
默認的MaxClient最大是256個線程,若是想設置更大的值,就的加上ServerLimit這個參數。20000是ServerLimit這個參數的最大值。若是須要更大,則必須編譯apache,此前都是不須要從新編譯Apache。
生效前提:必須放在其餘指令的前面
指定服務器啓動時創建的子進程數量,prefork默認爲5。
指定空閒子進程的最小數量,默認爲5。若是當前空閒子進程數少於MinSpareServers ,那麼Apache將以最大每秒一個的速度產生新的子進程。此參數不要設的太大。
設 置空閒子進程的最大數量,默認爲10。若是當前有超過MaxSpareServers數量的空閒子進程,那麼父進程將殺死多餘的子進程。此參數不要設的太 大。若是你將該指令的值設置爲比MinSpareServers小,Apache將會自動將其修改爲"MinSpareServers+1"。
限定同一時間客戶端最大接入請求的數量(單個進程併發線程數),默認爲256。任何超過MaxClients限制的請求都將進入等候隊列,一旦一個連接被釋放,隊列中的請求將獲得服務。要增大這個值,你必須同時增大ServerLimit。
每一個子進程在其生存期內容許伺服的最大請求數量,默認爲10000.到達MaxRequestsPerChild的限制後,子進程將會結束。若是MaxRequestsPerChild爲"0",子進程將永遠不會結束。
將MaxRequestsPerChild設置成非零值有兩個好處:
1.能夠防止(偶然的)內存泄漏無限進行,從而耗盡內存。
2.給進程一個有限壽命,從而有助於當服務器負載減輕的時候減小活動進程的數量。
Prefork.c的工做方式:
一個單獨的控制進程(父進程)負責產生子進程,這些子進程用於監 聽請求並做出應答。Apache老是試圖保持一些備用的(spare)或者是空閒的子進程用於迎接即將到來的請求。這樣客戶端就不須要在獲得服務前等候子 進程的產生。在Unix系統中,父進程一般以root身份運行以便邦定80端口,而Apache產生的子進程一般以一個低特權的用戶運行。User和 Group指令用於設置子進程的低特權用戶。運行子進程的用戶必需要對它所服務的內容有讀取的權限,可是對服務內容以外的其餘資源必須擁有儘量少的權 限。
在上述的</IfModule>後再加入一個」<IfModule>」以下紅色加粗(大又粗)內容:
<IfModule prefork.c>
ServerLimit 20000
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 1000
MaxRequestsPerChild 0
</IfModule>
<IfModule worker.c>
ServerLimit 50
ThreadLimit 200
StartServers 5
MaxClients 5000
MinSpareThreads 25
MaxSpareThreads 500
ThreadsPerChild 100
MaxRequestsPerChild 0
</IfModule>
上述參數解釋:
服務器容許配置的進程數上限。這個指令和ThreadLimit結合使用設置了MaxClients最大容許配置的數值。任何在重啓期間對這個指令的改變都將被忽略,但對MaxClients的修改卻會生效。
每一個子進程可配置的線程數上限。這個指令設置了每一個子進程可配置的線程數ThreadsPerChild上限。任何在重啓期間對這個指令的改變都將被忽略,但對ThreadsPerChild的修改卻會生效。默認值是"64".
服務器啓動時創建的子進程數,默認值是"3"。
最小空閒線程數,默認值是"75"。這個MPM將基於整個服務器監視空閒線程數。若是服務器中總的空閒線程數太少,子進程將產生新的空閒線程。
設 置最大空閒線程數。默認值是"250"。這個MPM將基於整個服務器監視空閒線程數。若是服務器中總的空閒線程數太多,子進程將殺死多餘的空閒線程。 MaxSpareThreads的取值範圍是有限制的。Apache將按照以下限制自動修正你設置的值:worker要求其大於等於 MinSpareThreads加上ThreadsPerChild的和
容許同時伺服的 最大接入請求數量(最大線程數量)。任何超過MaxClients限制的請求都將進入等候隊列。默認值是"400",16(ServerLimit)乘以 25(ThreadsPerChild)的結果。所以要增長MaxClients的時候,你必須同時增長ServerLimit的值。
每一個子進程創建的常駐的執行線程數。默認值是25。子進程在啓動時創建這些線程後就再也不創建新的線程了。
設置每一個子進程在其生存期內容許伺服的最大請求數量。到達MaxRequestsPerChild的限制後,子進程將會結束。若是MaxRequestsPerChild爲"0",子進程將永遠不會結束。
將MaxRequestsPerChild設置成非零值有兩個好處:
1.能夠防止(偶然的)內存泄漏無限進行,從而耗盡內存。
2.給進程一個有限壽命,從而有助於當服務器負載減輕的時候減小活動進程的數量。
注意
對於KeepAlive連接,只有第一個請求會被計數。事實上,它改變了每一個子進程限制最大連接數量的行爲。
Worker.c的工做方式:
每 個進程能夠擁有的線程數量是固定的。服務器會根據負載狀況增長或減小進程數量。一個單獨的控制進程(父進程)負責子進程的創建。每一個子進程能夠創建 ThreadsPerChild數量的服務線程和一個監聽線程,該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。Apache老是試圖維持一個備 用(spare)或是空閒的服務線程池。這樣,客戶端無須等待新線程或新進程的創建便可獲得處理。在Unix中,爲了可以綁定80端口,父進程通常都是以 root身份啓動,隨後,Apache以較低權限的用戶創建子進程和線程。User和Group指令用於設置Apache子進程的權限。雖然子進程必須對 其提供的內容擁有讀權限,但應該儘量給予它較少的特權。另外,除非使用了suexec,不然,這些指令設置的權限將被CGI腳本所繼承。
公式:
ThreadLimit>= ThreadsPerChild
MaxClients <= ServerLimit * ThreadsPerChild 必須是ThreadsPerChild的倍數
MaxSpareThreads>= MinSpareThreads+ThreadsPerChild
硬限制:
ServerLimi和ThreadLimit這兩個指令決定了活動子進程數量和每一個子進程中線程數量的硬限制。要想改變這個硬限制必須徹底中止服務器而後再啓動服務器(直接重啓是不行的)。
Apache在編譯ServerLimit時內部有一個硬性的限制,你不能超越這個限制。
preforkMPM最大爲"ServerLimit200000"
其它MPM(包括work MPM)最大爲"ServerLimit 20000
Apache在編譯ThreadLimit時內部有一個硬性的限制,你不能超越這個限制。
mpm_winnt是"ThreadLimit 15000"
其它MPM(包括work prefork)爲"ThreadLimit 20000
注意
使用ServerLimit和ThreadLimit時要特別小心。若是將ServerLimit和ThreadLimit設置成一個高出實際須要許多的值,將會有過多的共享內存被分配。當設置成超過系統的處理能力,Apache可能沒法啓動,或者系統將變得不穩定。