尽管有 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 模型会生成多个进程,但每个进程每次只处理一个请求。而 worker 模型则会生成多个进程,每个进程都有多个线程,每个线程每次只处理一个请求。

根据您的发行版,您可能正在运行与您期望的模型不同的模型。您期望的是 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: Prefork
  螺纹:无
    分叉:是(可变进程数)

在这种情况下,我的Server MPMPrefork,但你的可能不同。在运行 Apache2 的 Debian 服务器上,它是Worker

#/usr/sbin/apache2 -V
服务器版本:Apache/2.2.9 (Debian)
服务器 MPM: Worker

在某些机器上(例如 RedHat),prefork 和 worker 二进制文件同时存在的情况并不罕见(一个调用httpd,另一个调用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 显示很多 apache2 进程,但 ps aux 没有显示?解释了我的问题。

相关内容