这是我的 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 MPM
是Prefork
,但你的可能不同。在运行 Apache2 的 Debian 服务器上,它是Worker
:
#/usr/sbin/apache2 -V 服务器版本:Apache/2.2.9 (Debian) 服务器 MPM: Worker
在某些机器上(例如 RedHat),prefork 和 worker 二进制文件同时存在的情况并不罕见(一个调用httpd
,另一个调用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 显示很多 apache2 进程,但 ps aux 没有显示?解释了我的问题。