儘管有 maxclient 和其他限制,apache 仍產生太多進程

儘管有 maxclient 和其他限制,apache 仍產生太多進程

以下是我的 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 MPMPrefork,但你的可能不同。在我運行 Apache2 的 Debian 伺服器上,它是Worker

#/usr/sbin/apache2 -V
伺服器版本:Apache/2.2.9(Debian)
伺服器 MPM:工作人員

httpd在某些機器(例如 RedHat)上,同時存在 prefork 和worker 二進位(一個被調用,另一個被調用httpd.worker或類似的東西)的情況並不少見。您可能需要仔細檢查(使用pstopcat /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 進程卻沒有顯示?解釋了我的問題。

相關內容