1、prefork.c子產品(一個非線程型的、預派生的MPM)<b></b>
prefork MPM 使用多個子程序,每個子程序隻有一個線程。每個程序在某個确定的時間隻能維持一個連接配接。在大多數平台上,Prefork MPM在效率上要比Worker MPM要高,但是記憶體使用大得多。prefork的無線程設計在某些情況下将比worker更有優勢:它可以使用那些沒有處理好線程安全的第三方子產品,并且對于那些線程調試困難的平台而言,它也更容易調試一些。
<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 1000
MaxRequestsPerChild 0
</IfModule>
ServerLimit 2000
//預設的MaxClient最大是256個線程,如果想設定更大的值,就的加上ServerLimit這個參數。20000是ServerLimit這個參數的最大值。如果需要更大,則必須編譯apache,此前都是不需要重新編譯Apache。
生效前提:必須放在其他指令的前面
//指定伺服器啟動時建立的子程序數量,prefork預設為5。
//指定空閑子程序的最小數量,預設為5。如果目前空閑子程序數少于MinSpareServers ,那麼Apache将以最大每秒一個的速度産生新的子程序。此參數不要設的太大。
//設定空閑子程序的最大數量,預設為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.c子產品(支援混合的多線程多程序的多路處理子產品)
worker MPM 使用多個子程序,每個子程序有多個線程。每個線程在某個确定的時間隻能維持一個連接配接。通常來說,在一個高流量的HTTP伺服器上,Worker MPM是個比較好的選擇,因為Worker MPM的記憶體使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,如果一個線程崩潰,整個程序就會連同其所有線程一起"死掉".由于線程共享記憶體空間,是以一個程式在運作時必須被系統識别為"每個線程都是安全的"。
<IfModule worker.c>
ServerLimit 50
ThreadLimit 200
MaxClients 5000
MinSpareThreads 25
MaxSpareThreads 500
ThreadsPerChild 100
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的限制後,子程序将會結束。如果MaxRequestsPerChild為"0",子程序将永遠不會結束。
2.給程序一個有限壽命,進而有助于當伺服器負載減輕的時候減少活動程序的數量。
注意
對于KeepAlive連結,隻有第一個請求會被計數。事實上,它改變了每個子程序限制最大連結數量的行為。
每個程序可以擁有的線程數量是固定的。伺服器會根據負載情況增加或減少程序數量。一個單獨的控制程序(父程序)負責子程序的建立。每個子程序可以建立 ThreadsPerChild數量的服務線程和一個監聽線程,該監聽線程監聽接入請求并将其傳遞給服務線程處理和應答。Apache總是試圖維持一個備用(spare)或是空閑的服務線程池。這樣,用戶端無須等待新線程或新程序的建立即可得到處理。在Unix中,為了能夠綁定80端口,父程序一般都是以 root身份啟動,随後,Apache以較低權限的使用者建立子程序和線程。User和Group指令用于設定Apache子程序的權限。雖然子程序必須對其提供的内容擁有讀權限,但應該盡可能給予它較少的特權。另外,除非使用了suexec ,否則,這些指令設定的權限将被CGI腳本所繼承。
3、perchild.c子產品
公式:
ThreadLimit >= ThreadsPerChild
MaxClients <= ServerLimit * ThreadsPerChild 必須是ThreadsPerChild的倍數
MaxSpareThreads >= MinSpareThreads+ThreadsPerChild
硬限制:
ServerLimi和ThreadLimit這兩個指令決定了活動子程序數量和每個子程序中線程數量的硬限制。要想改變這個硬限制必須完全停止伺服器然後再啟動伺服器(直接重新開機是不行的)。
Apache在編譯ServerLimit時内部有一個硬性的限制,你不能超越這個限制。
prefork MPM最大為"ServerLimit 200000"
其它MPM(包括work MPM)最大為"ServerLimit 20000
Apache在編譯ThreadLimit時内部有一個硬性的限制,你不能超越這個限制。
mpm_winnt是"ThreadLimit 15000"
其它MPM(包括work prefork)為"ThreadLimit 20000
使用ServerLimit和ThreadLimit時要特别當心。如果将ServerLimit和ThreadLimit設定成一個高出實際需要許多的值,将會有過多的共享記憶體被配置設定。當設定成超過系統的處理能力,Apache可能無法啟動,或者系統将變得不穩定。
本文轉自 gehailong 51CTO部落格,原文連結:http://blog.51cto.com/gehailong/264160,如需轉載請自行聯系原作者