2008年12月16日 星期二

Apache的PreFork MPM功能

轉載自Apache的PreFork MPM功能


Apache, 用了很久, 但的確沒有好好研究過有關於 performance tuning 這塊. 事實上, 這個免費的 web server 功能真的十分強大, 尤其是可以載入的模組也多, 在使用上, 真的有許多沒有深入研究就學不到的內容.

首先我們來看有關於 MPM 的一些資料:
http://dz.adj.idv.tw/archiver/tid-214.html

在 MPM中, prefork 及 worker 是兩種不同的 multi-processing module, 在 apache 管方網站上分別有對這兩個 module 有深入的介紹:
http://httpd.apache.org/docs/2.0/mod/prefork.html
http://httpd.apache.org/docs/2.0/mod/prefork.html
這二者只能擇其一來使用, 一般來說, 雖然 prefork 比較佔用記憶體, 但相容性及穩定性較佳, 也是在 FreeBSD 下安裝 Apache 的預設 MPM module.

事實上, 預設的 prefork mpm 參數如下:

<ifmodule>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</ifmodule>



其中一項重要的參數 ServerLimit 並未設置, 預設是 256, 也就是最多僅使用了 256個 worker, 所以透過 /server-status 看到的 . 只會有 256 個, 而預設的 MaxClients 也只有 150 個, 代表著 256 個 worker 最多同時僅 150 上線工作. 這是預設的狀況.

接下來我們可以先來了解一下 prefork 這些參數的意義, 這些 xxxServers 雖然叫 Server, 但其實就是 /server-status 中所稱的 worker, 所以 StartServers 代表起始要發起的 worker, 而 MinSpareServers 及 MaxSpareServers 分別代表至少及至多個 spare (預備)的 worker, MaxClients 則是指最多同時服務的 worker, 最後的 MaxRequestsPerChild 指的是這些 worker (雖然參數是 Child)在服務多少個 Request 後就要 reset (可以達到減少若程式上有 leak 問題的發生).

所以在 prefork 的 MPM 設計下, 若要提高同時服務的上限時, 可以直接調整 MaxClients 即可, 但若是要超過 256 個時, 就要設定 ServerLimit, 將允許同時發起的 worker 數, 提高, 而 MaxClients 設置 <= ServerLimit, 例如下面是一個設置的例子:


<ifmodule>
ServerLimit 1024
StartServers 128
MinSpareServers 16
MaxSpareServers 64
MaxClients 1024
MaxRequestsPerChild 0
</ifmodule>

再進行 Apache 的停止, 啟動(注意, 一定是要停止, 啟動, 若是用 restart apache不會重新 allocation servers), 再觀察 /server-status 時, 就可以發現 apache 準備好 1024 個總 worker slot, 一開始起動 128 個 worker, 如此一來便能提高 web server 的效能及吞吐量了.

轉載自Apache的PreFork MPM功能


Apache, 用了很久, 但的確沒有好好研究過有關於 performance tuning 這塊. 事實上, 這個免費的 web server 功能真的十分強大, 尤其是可以載入的模組也多, 在使用上, 真的有許多沒有深入研究就學不到的內容.

首先我們來看有關於 MPM 的一些資料:
http://dz.adj.idv.tw/archiver/tid-214.html

在 MPM中, prefork 及 worker 是兩種不同的 multi-processing module, 在 apache 管方網站上分別有對這兩個 module 有深入的介紹:
http://httpd.apache.org/docs/2.0/mod/prefork.html
http://httpd.apache.org/docs/2.0/mod/prefork.html
這二者只能擇其一來使用, 一般來說, 雖然 prefork 比較佔用記憶體, 但相容性及穩定性較佳, 也是在 FreeBSD 下安裝 Apache 的預設 MPM module.

事實上, 預設的 prefork mpm 參數如下:

<ifmodule>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
</ifmodule>



其中一項重要的參數 ServerLimit 並未設置, 預設是 256, 也就是最多僅使用了 256個 worker, 所以透過 /server-status 看到的 . 只會有 256 個, 而預設的 MaxClients 也只有 150 個, 代表著 256 個 worker 最多同時僅 150 上線工作. 這是預設的狀況.

接下來我們可以先來了解一下 prefork 這些參數的意義, 這些 xxxServers 雖然叫 Server, 但其實就是 /server-status 中所稱的 worker, 所以 StartServers 代表起始要發起的 worker, 而 MinSpareServers 及 MaxSpareServers 分別代表至少及至多個 spare (預備)的 worker, MaxClients 則是指最多同時服務的 worker, 最後的 MaxRequestsPerChild 指的是這些 worker (雖然參數是 Child)在服務多少個 Request 後就要 reset (可以達到減少若程式上有 leak 問題的發生).

所以在 prefork 的 MPM 設計下, 若要提高同時服務的上限時, 可以直接調整 MaxClients 即可, 但若是要超過 256 個時, 就要設定 ServerLimit, 將允許同時發起的 worker 數, 提高, 而 MaxClients 設置 <= ServerLimit, 例如下面是一個設置的例子:


<ifmodule>
ServerLimit 1024
StartServers 128
MinSpareServers 16
MaxSpareServers 64
MaxClients 1024
MaxRequestsPerChild 0
</ifmodule>

再進行 Apache 的停止, 啟動(注意, 一定是要停止, 啟動, 若是用 restart apache不會重新 allocation servers), 再觀察 /server-status 時, 就可以發現 apache 準備好 1024 個總 worker slot, 一開始起動 128 個 worker, 如此一來便能提高 web server 的效能及吞吐量了.