以下是我的 MPM 限制:
<IfModule mpm_prefork_module>
StartServers 10
MinSpareServers 10
MaxSpareServers 10
MaxClients 10
MaxRequestsPerChild 2000
</IfModule>
然而儘管如此,我目前有超過 20 個 apache 進程正在運行,並且在過去一兩個小時內已經多達 40-50 個。 MaxClient 和 MaxSpareServers 不應該控制進程數量(即大約 10 個)嗎?
我有什麼遺漏的嗎?
答案1
Apache 有不同的風格,其中最常見的是兩種預叉和勞工。 prefork 模型會產生多個進程,但每個進程一次只處理一個請求。另一方面,工作模型會產生多個進程,每個進程都有多個線程,每個線程一次處理一個請求。
根據您的發行版,您可能正在運行與您期望的型號不同的模型。您正在期待 prefork,但您確定這是正在運行的類型嗎?要找類型:
$httpd-V 伺服器版本:Apache/2.2.15(Unix) 伺服器建成:2010年5月28日07:58:25 伺服器模組魔數:20051115:24 伺服器載入:APR 1.4.2、APR-Util 1.3.9 編譯使用:APR 1.4.2、APR-Util 1.3.9 架構:32位元 伺服器 MPM:預分叉 螺紋:無 forked:是(可變進程數)
在這種情況下,我的Server MPM
是Prefork
,但你的可能不同。在我運行 Apache2 的 Debian 伺服器上,它是Worker
:
#/usr/sbin/apache2 -V 伺服器版本:Apache/2.2.9(Debian) 伺服器 MPM:工作人員
httpd
在某些機器(例如 RedHat)上,同時存在 prefork 和worker 二進位(一個被調用,另一個被調用httpd.worker
或類似的東西)的情況並不少見。您可能需要仔細檢查(使用ps
或top
或cat /etc/init.d/httpd
)實際正在啟動的項目。
答案2
對於任何其他偶然發現這個問題的人來說,還有另一個潛在的原因。
我知道您相信您已經找到了答案,但是使用 prefork,無論您以何種方式查看其流程,您都應該看到相同的事情。您一定沒有使用過 prefork。
這就是為什麼:
http://httpd.apache.org/docs/2.4/mod/prefork.html
此多處理模組 (MPM) 實作了一個非執行緒、預分叉的 Web 伺服器。
我遇到的另一種解釋
在配置選項起作用之前加載 prefork 模組,但如果您在配置選項之後加載它,它似乎會加載一些預設值,從而使您的 IfModule 指令變得惰性。您可能只會在自訂的 apache 配置上看到這一點,因為發行版會正確設定它以啟動。
作品- 配置已套用
LoadModule mpm_prefork_module /usr/lib/apache2/modules/mod_mpm_prefork.so
<IfModule mpm_prefork_module>
StartServers 1
MinSpareServers 1
MaxSpareServers 0
ServerLimit 4
MaxClients 4
MaxRequestsPerChild 4000
</IfModule>
不起作用- 配置沒有效果
<IfModule mpm_prefork_module>
StartServers 1
MinSpareServers 1
MaxSpareServers 0
ServerLimit 4
MaxClients 4
MaxRequestsPerChild 4000
</IfModule>
LoadModule mpm_prefork_module /usr/lib/apache2/modules/mod_mpm_prefork.so
答案3
我現在覺得有點愚蠢,但:為什麼 htop 透過 ps aux 顯示大量 apache2 進程卻沒有顯示?解釋了我的問題。