• <thead id="gihk9"></thead>

    <th id="gihk9"><option id="gihk9"></option></th>

        <th id="gihk9"><video id="gihk9"></video></th>

        Apache-工作模式(prefork/ worker/Event)那種適合你?

        時間: 2018-05-28 08:31:34             作者:殘夢

        Apache 2.X 支持插入式并行處理模塊,稱為多進程處理模塊(MPM)。在編譯apache時必須選擇也只能選擇一個MPM,對類UNIX系統,有幾個不同的MPM可供選擇,它們會影響到apache的速度和可伸縮性,prefork是一個非線程型的、預派生的MPM,使用多個進程,每個進程在某個確定的時間只單獨處理一個連接,效率高,但內存使用比較大


        Apache 2.X  支持插入式并行處理模塊,稱為多進程處理模塊(MPM)。在編譯apache時必須選擇也只能選擇一個MPM,對類UNIX系統,有幾個不同的MPM可供選擇,它們會影響到apache的速度和可伸縮性。
        首先我們看看工作模式:
         

        [root@www ~]# httpd -l

        Compiled in modules:

          core.c

          mod_so.c

          http_core.c

          prefork.c

        那么如何設置apache的MPM呢?

        需要的apache 配置安裝的時候需要指定模式:

          [root@localhost httpd-2.4.33]# ./configure --prefix=/usr/local/apache2worker --enable-so --with-mpm=prefork
          [root@localhost httpd-2.4.33]# make
          [root@localhost httpd-2.4.33]# make install
        
        
        啟用上面模塊靠這句實現 --with-mpm=worker、prefork 如果要event請使用 --enable-nonportable-atomics=yes

        prefork模式

        prefork是一個非線程型的、預派生的MPM,使用多個進程,每個進程在某個確定的時間只單獨處理一個連接,效率高,但內存使用比較大。

        優點:適合于沒有線程安全庫,需要避免線程兼容性問題的系統。它是要求將每個請求相互獨立的情況下最好的MPM,這樣若一個請求出現問題就不會影響到其他請求。

        缺點:一個進程相對占用更多的系統資源,消耗更多的內存。而且,它并不擅長處理高并發請求,在這種場景下,它會將請求放進隊列中,一直等到有可用進程,請求才會被處理。


        StartServers

        # 服務器啟動時建立的子進程數量,prefork默認是5,

        MinSpareServers

        #空閑子進程的最小數量,默認5;如果當前空閑子進程數少于MinSpareServers ,那么Apache將以最大每秒一個的速度產生新的子進程。此參數不要設的太大。

        MaxSpareServers

        #空閑子進程的最大數量,默認10;如果當前有超過MaxSpareServers數量的空閑子進程,那么父進程會殺死多余的子進程。次參數也不需要設置太大,如果你將其設置比MinSpareServers 小,Apache會自動將其修改為MinSpareServers +1的數量。

        MaxRequestWorkers

        #限定服務器同一時間內客戶端最大接入的請求數量,默認是256;任何超過了MaxRequestWorkers限制的請求都要進入等待隊列,一旦一個個連接被釋放,隊列中的請求才將得到服務,如果要增大這個數值,必須先增大ServerLimit。在Apache2.3.1版本之前這參數MaxRequestWorkers被稱為MaxClients。

        MaxConnectionsPerChild

        #每個子進程在其生命周期內允許最大的請求數量,如果請求總數已經達到這個數值,子進程將會結束,如果設置為0,子進程將永遠不會結束。在Apache2.3.9之前稱之為MaxRequestsPerChild。

        建議設置為非零,原因:

        (1).能夠防止(偶然的)內存泄漏無限進行,從而耗盡內存。

        (2).給進程一個有限壽命,從而有助于當服務器負載減輕的時候減少活動進程的數量(重生的機會)。





        worker模式

        worker使用了多進程和多線程的混合模式,worker模式也同樣會先預派生一些子進程,然后每個子進程創建一些線程,同時包括一個監聽線程,每個請求過來會被分配到一個線程來服務。

        優點:線程比起進程會更輕量,因為線程是通過共享父進程的內存空間,因此,內存的占用會減少一些,在高并發,高流量的場景下會比prefork有更多可用的線程,表現會更優秀一些;

        缺點:如果一個線程出現了問題也會導致同一進程下的線程出現問題,如果是多個線程出現問題,也只是影響Apache的一部分,而不是全部。由于用到多進程多線程,需要考慮到線程的安全了,在使用keep-alive長連接的時候,某個線程會一直被占用,即使中間沒有請求,需要等待到超時才會被釋放(該問題在prefork模式下也存在)。




        Event模式

        Apache最新的工作模式,它和worker模式很像

        優點:不同的是在于它解決了keep-alive長連接的時候占用線程資源被浪費的問題(HTTP的Keepalive方式能減少TCP連接數量和網絡負載),在event工作模式中,會有一些專門的線程用來管理這些keep-alive類型的線程,當有真實請求過來的時候,將請求傳遞給服務器的線程,執行完畢后,又允許它釋放。這增強了在高并發場景下的請求處理



        上面的幾種模式不是說你感覺哪種適合你,而是根據硬件和系統來取決。
        經過測試。在紅帽企業版6.2中,Event模式表現很不好。prefork模式不錯;二份參考:
         

        prefork

         

        <IfModule mpm_prefork_module>

        ServerLimit 5120

        StartServers 100

        MinSpareServers 100

        MaxSpareServers 300

        MaxClients 5120

        MaxRequestsPerChild 500

        </IfModule>


        event

             

        <IfModule mpm_event_module>

            StartServers          2

            MaxClients          150

            MinSpareThreads      25

            MaxSpareThreads      75

            ThreadLimit          64

            ThreadsPerChild      25

            MaxRequestsPerChild   100

        </IfModule>

         

         


         
        相關信息
        欧美大片免费影院

      1. <thead id="gihk9"></thead>

        <th id="gihk9"><option id="gihk9"></option></th>

            <th id="gihk9"><video id="gihk9"></video></th>