prefok和worker模式

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://lxycneo.blog.51cto.com/2534579/671527
    apache作爲現今web服務器用的最廣泛也是最穩定的開源服務器軟件,其工作模式有許多中,目前主要有兩種模式:prefork模式和worker模式
     prefork模式:
    這個多路處理模塊(MPM)實現了一個非線程型的、預派生的web服務器,它的工作式類似於Apache 1.3。它適合於沒有線程安全庫,需要避免線程兼容性問題的系統。它要求將每個請求相互獨立的情況下最好的MPM,這樣若一個請求出現問題就不會影響到其他請求。
這個MPM具有很強的自我調節能力,只需要很少的配置指令調整。最重要的是將MaxClients設置爲一個足夠大的數值以處理潛在的請求高峯,同時又不能太大,以致需要使用的內存超出物理內存的大小。
   worker模式:
    此多路處理模塊(MPM)使網絡服務器支持混合的多線程多進程。由於使用線程來處理請求,所以可以處理海量請求,而系統資源的開銷小於基於進程的MPM。但是它也使用了多進程,每個進程又有多個線程,以獲得基於進程的MPM的穩定性。
控制這個MPM的最重要的指令是,控制每個子進程允許建立的線程數ThreadsPerChild指令,和控制允許建立的總線程數的MaxClients指令。
  apache模式的查看和安裝:
     如果apache已經安裝,我們可以用 httpd -l  命令查看當前模式(只可能有一種)
   如果找到 prefork.c 則表示當前工作在prefork模式,同理出現worker.c則工作在worker模式。
    如果apache還未安裝,我們在編譯的時候可以加入 --with-pem=(prefork|worker)選項決定啓用什麼模式。
     當然如果你安裝過了(筆者模式爲prefork) 也可以使用以下命令來切換
mv httpd httpd.prefork
mv httpd.worker httpd
   重啓之後,模式就會改變。
  不同模式配置:
  針對不通的模式配置文件也是不一樣的,他們都是在httpd的默認配置文件httpd.conf中
<IfModule prefork.c>
StartServers             5
MinSpareServers        5
MaxSpareServers     20
ServerLimit            256
MaxClients             256
MaxRequestsPerChild    4000
</IfModule>
#這是prefork的配置文件
<IfModule worker.c>
StartServers                 2
MaxClients                 150
MinSpareThreads         25
MaxSpareThreads         75
ThreadsPerChild         25
MaxRequestsPerChild    0
</IfModule>
#這是worker的配置文件

 
 prefork.c模塊
prefork MPM 使用多個子進程,每個子進程只有一個線程。每個進程在某個確定的時間只能維持一個連接。在大多數平臺上,Prefork MPM在效率上要比Worker MPM要高,但是內存使用大得多。prefork的無線程設計在某些情況下將比worker更有優勢:他能夠使用那些沒有處理好線程安全的第三方模塊,並 且對於那些線程調試困難的平臺而言,他也更容易調試一些。
ServerLimit 20000
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 1000
MaxRequestsPerChild 0
  //默認的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指令用於配置子進程的低特權用戶。運行子進程的用戶必須要對他所服務的內容有 讀取的權限,但是對服務內容之外的其他資源必須擁有儘可能少的權限。
worker.c模塊
worker MPM 使用多個子進程,每個子進程有多個線程。每個線程在某個確定的時間只能維持一個連接。通常來說,在一個高流量的HTTP服務器上,Worker MPM是個比較好的選擇,因爲Worker MPM的內存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方,假如一個線程崩潰,整個進程就會連同其任何線程一起"死掉".由於線程共享內存空間,所以一個程式在運行時必須被系統識別爲"每 個線程都是安全的"。
ServerLimit 50
ThreadLimit 200
StartServers 5
MaxClients 5000
MinSpareThreads 25
MaxSpareThreads 500
ThreadsPerChild 100
MaxRequestsPerChild 0
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.給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。
注意
對於KeepAlive鏈接,只有第一個請求會被計數。事實上,他改變了每個子進程限制最大鏈接數量的行爲。
工作方式:
每個進程能夠擁有的線程數量是固定的。服務器會根據負載情況增加或減少進程數量。一個單獨的控制進程(父進程)負責子進程的建 立。每個子進程能夠建立 ThreadsPerChild數量的服務線程和一個監聽線程,該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。Apache總是試圖維持一個備 用(spare)或是空閒的服務線程池。這樣,客戶端無須等待新線程或新進程的建立即可得到處理。在Unix中,爲了能夠綁定80端口,父進程一般都是以 root身份啓動,隨後,Apache以較低權限的用戶建立子進程和線程。User和Group指令用於配置Apache子進程的權限。雖然子進程必須對 其提供的內容擁有讀權限,但應該儘可能給予他較少的特權。另外,除非使用了suexec ,否則,這些指令配置的權限將被CGI腳本所繼承。
 查看apache進程:
    因爲apache工作模式關係所以,httpd的進程查看也是不一樣的。
對於prefork來說,因爲一個進程只對應一個線程所以查看的時候我們可以使用
# ps aux | grep httpd |grep -v grep    
root            3704    0.0    0.9    10548    3452 ?                Ss     Sep08     0:00 /usr/sbin/httpd
apache        3778    0.0    0.5    10548    2112 ?                S        Sep08     0:00 /usr/sbin/httpd
apache        3779    0.0    0.5    10548    2112 ?                S        Sep08     0:00 /usr/sbin/httpd
apache        3780    0.0    0.5    10548    2112 ?                S        Sep08     0:00 /usr/sbin/httpd
apache        3781    0.0    0.5    10548    2112 ?                S        Sep08     0:00 /usr/sbin/httpd
apache        3782    0.0    0.5    10548    2112 ?                S        Sep08     0:00 /usr/sbin/httpd
 而worker模式則需要
# pstree    |grep httpd
   |-httpd---2*[httpd---26*[{httpd}]]

 
  以前apache主流模式爲prefork,現在worker模式也開始多了起來,區別來說,worker模式可以應對高流量,但是安全性不太好;prefork模式安全性比較好,但是性能會差一點,各位可以根據自己服務器的類別 選取不同的模式,更好的使用apache。

 

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