2014年9月10日 星期三

Apache Multi-Processing Modules (多處理模模組)

調整 Apache MPM(Multi-Processing Modules) 多處理模組的設定,可以增加 Apache 處理連限的能力。有時候伺服器的資源 (CPU、記憶體、頻寬...) 都還足夠,但 Apache 卻無法再處理更多連線,這時有可能是 MPM 的設定限制了 Apache 的連線數。

Apache 在不同平台有不同的 MPM
Netware mpm_netware
OS/2 mpmt_os2
Unix prefork,worker 或 event
Windows mpm_winnt

  1. perfork MPM:預先創建進程 (1個主進程,多個子進程)
    分為「監聽者、工作者、空閒者」。
    leader/follower模型。
    只有一個監聽者,當發生請求時,監聽者變為工作者,原本的空閒者相互競爭,然後其中一個變為監聽者。
    請求處理完畢,工作者變回空閒者。
    在windows上進程代價太高,所以不使用。
    極端情況:所有進程都成為工作者,將變成沒有監聽者,也就無法處理新的請求
  2. worker MPM:線程化,同時使用進程與線程(主進程、多個工作子進程、多個工作線程)
    主進程啟動後,建立數個工作子進程,每個子進程又會建立多個固定數量的工作線程。
    工作線程分為「監聽線程、工作線程」,監聽線程用來監聽並接受連接,放到佇列,工作線程從佇列取得連接處理。
    因使用線程,所以所有模組都要是線程安全的。
    缺點,線程掛掉其他線程也會崩潰。
  3. event MPM:worker的變種。
  4. winnt MPM:有兩個進程(1個監控進程、1個工作進程),工作進程再產生多個線程。
    使用線程當做基本運行單元,因為windows下,進程需耗費很多資源。
    線程數固定。
    監控線程(主進程),用來監控工作進程,確保工作進程正常,若發現工作進程發生異常,主進程會重新啟動工作進程。
    工作進程內部的線程可區分為「監聽線程、工作線程」。監聽線程用來負責接受請求,工作線程則負責處理這些請求。

如果要在 windows 修改 mpm 設定,以 apache 2.2 為例
  1. 修改 httpd.conf,include conf/extra/httpd-mpm.conf (拿掉下面一行的註解)
    Include conf/extra/httpd-mpm.conf
  2. 修改 conf/extra/httpd-mpm.conf 設定,httpd-mpm.conf 裡面有各種 MPM 的設定,因在 windows 上面,所以找到 WinNT MPM,將 ThreadsPerChild 的數字改大一點,可增加可處理的連線數。
    <IfModule mpm_winnt_module>
        ThreadsPerChild      800
        MaxRequestsPerChild    0
    </IfModule>

其他:使用 httpd -l,可列出目前正使用的 mpm 模組,例:
D:\Apache\bin>httpd -l
Compiled in modules:
  core.c
  mod_win32.c
  mpm_winnt.c
  http_core.c
  mod_so.c


參考:
http://httpd.apache.org/docs/2.4/mpm.html
http://blog.yam.com/htshboy/article/17182660
http://www.aminglinux.com/bbs/thread-579-1-1.html
http://www.cnblogs.com/fnng/archive/2012/11/20/2779977.html
Apache httpd-mpm.conf参数配置说明

1 則留言:

  1. 原來在Windows環境要這樣設定!真是太感謝你了!

    回覆刪除