Apache产生了大量的httpd进程

我运行一个简单的networking服务器设置(Apache / 2.2.15,PHP / 5.3.3,MySQL / 5.1.66)的CentOS 6.7机器(16 GB vRAM,8个vCPU),托pipe一个网上商店,数量适中页面展示次数(每天约2,000〜4,000次)。

服务器在过去的三年中运行平稳,无需更改其configuration。 现在,从上个星期以来 – 不知何故,在短时间(大约30分钟)之后,Apache / HTTP经常变得无法访问。 我检查了一些参数,看到有很多httpd进程正在运行。 ps axf | grep httpd | wc ps axf | grep httpd | wc显示了这样的内容:

 387 2344 18354 

而负载不是很令人兴奋。 top看起来像这样:

在这里输入图像说明

有一小部分httpd进程会不时被释放,但总数却几乎不断增加。 如果我运行一个service httpd reload ,进程数回落到0,并在接下来的几分钟到几小时内再次增加。 过了一会儿,Apache的日志告诉我:

 [error] server reached MaxClients setting, consider raising the MaxClients setting 

我做了这个,我也调整了不同的进一步的configuration参数,但它没有帮助。 无论MaxClientsServerLimit设置为什么值,Apache都不会停止产生新的httpd进程,直到达到这些限制。 在此之后,网站无法访问了。

根据AWStats,页面点击量没有增加。 而且,在PHP应用程序中没有任何变化。 除了在30分钟之后阻止所有请求,网站的运行速度一切如常。 作为一个肮脏和临时的解决scheme,Cron不断重新加载Apache半小时。

在过去的三年中,Prefork / Worker的设置如下:

 <IfModule prefork.c> StartServers 4 MinSpareServers 5 MaxSpareServers 10 ServerLimit 128 MaxClients 128 MaxRequestsPerChild 600 </IfModule> <IfModule worker.c> StartServers 2 MaxClients 150 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule> 

我把他们提升到:

 <IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 10 ServerLimit 640 MaxClients 640 MaxRequestsPerChild 1000 </IfModule> <IfModule worker.c> StartServers 4 MaxClients 300 MinSpareThreads 25 MaxSpareThreads 75 ThreadsPerChild 25 MaxRequestsPerChild 0 </IfModule> 

在这个变化之后,大约1小时后Apache / HTTP变得不可用。

这怎么会突然发生,还有什么办法可以进一步调查这种奇怪行为的起源呢?

拳头,增加prefork参数只会恶化你的情况。 所以恢复以前的configuration。

要排除任何prefork问题/错误configuration,请尝试禁用它。 情况变化很大吗? 如果是这样,你会发现你的问题。

如果不是这样,问题就与外部因素有关:例如,也许一些bot /脚本是针对你的网站的,打开许多连接(使用相对的httpd进程)。 如果是这种情况,您应该能够从Apache日志文件中看到。

如果这还不够,可以启用mod_status模块来显示详细的统计信息。 然后,发出apachectl fullstatus来访问这些统计信息。 看到这里和这里的更多细节。