apache prefork 和worker 模式對比

 apache 常用的兩種工作模式:prefork 和worker 的對比

一 prefork 模式
      prefork 爲多路出來模塊MPM 實現了一個非線程型的,預派生的web服務器。prefork 適用於沒有線程安全庫,需要避免線程兼容性問題的系統。他是要求將每個請求相互獨立的情況下最好的MPM,這樣一個請求出現問題,不至於影響其他的請求。
      prefork模式使用多個子進程,每個子進程只會有一個線程。每個線程在某個確定的時間只能維持一個連接。在大多數平臺上,Prefork MPM在效率上要比Worker MPM 要高,但是內存使用大的多。prefork的無線程序設計在某些情況下將比worker更有優勢:它可以使用那些沒有處理好線程安全的第三方模塊,並且對於那些線程調試困難的平臺而言,它也更容易調優 一些
   prefork 配置詳解
   <IfModule mpm_prefork_module>
   ServerLimit   20000
   StartServers   5
   MinSpareServers   5
   MaxSpareServers   10
   MaxClients   1000
   MaxRequestsPerChild 0
   ServerLimit     2000 
   </ifModule>
 
   ServerLimit 2000
   默認的MaxClient最大是256個線程,假如想胚子更大的值,就需要加上ServerLimit這個參數。 200000是ServerLimit這個參數的最大值。假如需要更大,則必須編譯apache,此前都是無需重新編譯apache。生肖前提是,必須放在其他指令的前面
   StartServer 5
   指定服務器啓動是建立的子進程的數量,prefork 默認爲5。爲了滿足MinSpareServers設置的需要創建一個進程, 等待一秒鐘,繼續創建兩個,再等待一秒鐘,繼續創建四個……如此按指數級增加創建的進程數,最多達到每秒32個,直到滿足 MinSpareServers設置的值爲止。這就是預派生 (prefork)的由來。這種模式可以不必在請求到來時再產生新的進程,從而減小了系統開銷以增加性能。
   MinSpareServers 5 
     指定空閒子進程的最小數量,默認爲5。假如當前空閒子進程數少於MinSpareServers,那麼apache 將以每秒一個的速度產生新的子進程。此參數不要設置的太大
   MaxSpareServers
      設置空閒進程的最大數量,默認爲10。如果當前有超過MaxSpareServers數量的空閒子進程,那麼父進程將殺死多餘的子進程。此參數不要設置過大。如果該參數設置比MinSpareServers小,apache將會自動將其修改成"MinSpareServers+1”。如果站點負載較大,可考慮同時加大MinSpareServers和MaxSpareServers。
   MaxClients
       限定同一時間客戶端最大接入的數量(單個進程併發線程數)。默認爲256,任何超過MaxClients限制的請求都會進入等候隊列,一旦一個鏈接被釋放,隊列中的請求將得到服務。如果要增大這個值,必須同時增加ServerLimit
   MaxRequestsPerChild
       每個子進程在其生存期內允許伺服的最大請求數量。默認爲10000到達MaxRequestsPerChild的限制後,子進程將會結束。
       如果MaxRequestsPerChild 爲0,子進程將永遠不會結束。將MaxRequestsPerChild 設置成非零值有兩個好處:
       1 可以防止內存泄漏
       2 給進程一個有限壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量
   prefork 工作方式:
        一個單獨的控制進程(父進程)負責生產子進程,這些子進程用於監聽請求並作出應答。apache 總是試圖保持一個備用的(spare)
     或是空閒的子進程用於迎接即將到來的請求。這樣客戶端就無需在得到服務前等候子進程的產生。在unix系統中,父進程通常是以
     root 身份運行以便綁定80端口,而apache生產的子進程通常一個低特權的用戶運行。User和Group指令用於配置
    配置子進程的低特權用戶。運行子進程的用戶必須要對他所服務的內容用讀取的權限,但是對服務內容之外的其他資源必須擁有儘可能少的權限
 
  二  worker 模式
     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 50
       服務器允許配置的進程數上限。這個指令和ThreadLimit 結合使用配置了MaxClients 最大允許配置的數值。任何在重啓期間對這個指令的改變都將被忽略,但對MaxClients 的修改卻會生效
       ThreadLimit 200
       每個進程可配置的線程上限。這個指令配置了每個子進程可配置的線程ThreadsPerChild上限。任何在重啓期間對這個指令的修改都將被忽略,但對ThreadsPerChild的修改會生效。默認值是64 
       StartServer 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 0
       配置每個子進程在其生存期內允許伺服的最大請求數量。到達MaxRequestsPerChild的限制後,子進程將會結束。假如MaxRequestsPerChild 爲"0"
       子進程將永遠不會結束。
        將MaxRequestPerChild配置成非零值後兩個好處:
         1 能夠防止內存泄漏。
         2 給進程一個有限的壽命,從而有助於當服務器負載減輕的時候減少活動進程的數量。
       注意 對於keepalive鏈接,只有第一個請求會被計數。事實上,他改變了每個進程限制最大鏈接數量的行爲
       工作方式:
         每個進程能夠擁有的線程數量是固定的。服務器會根據負載情況增加或減少進程數量。一個單獨的控制進程(父進程)負責子進程的建立。每個子進程能夠建立ThreadsPerChild數量的服務器線程和一個監聽線程。該監聽線程監聽接入請求並將其傳遞給服務線程處理和應答。Apache總是試圖維持一個備用(Spare)或是空閒的服務線程池。這樣,客戶端無須等待新線程或新進程的建立即可得到處理。在unix中,爲了能夠綁定80端口父進程一般都是以root身份啓動,隨後,apache以較低權限的用戶建立子進程和線程。User和Group指令用於配置Apache子進程的權限。雖然子進程必須對其提供的內容擁有讀權限,但還應該儘可能給予他較少的特權。另外,除非使用了suexec,否則。這些指令配置的權限將被CGI 腳本所繼承
     公式:
         ThreadLimit >= ThreadsPerChild
         MaxClients   =  MinSpareThreads + ThreadsPerChild
     硬限制
          ServerLimit和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,請在編譯前修改如下文件
            #cd  httpd-version/server/mpm/worker/
            #vim  worker.c
            把
             define DEFAULT_SERVER_LIMIT 16
             define MAX_SERVER_LIMIT 20000
             define DEFAULT_THREAD_LIMIT 64
             define MAX_THREAD_LIMIT 20000
 
             改爲
            define DEFAULT_SERVER_LIMIT 256
            define MAX_SERVER_LIMIT 40000
            define DEFAULT_THREAD_LIMIT 256
            define MAX_THREAD_LIMIT 40000 
      注意:
   使用ServerLimit和ThreadLimit時要特別當心。假如將ServerLimit和ThreadLimit配置成一個高出實際需要許多的值,將會有過多的共享內存被分配。當配置成超過系統的處理能力,Apache可能無法啓動,或系統將變得不穩定。
 
 文章出自:http://blog.chinaunix.net/uid-20441206-id-3360689.html
 
                                                                                              

 

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