Apache到达MaxClients并锁定服务器


9

我目前有一个Apache2服务器,该服务器在OpenVZ VPS上运行,mpm-preforkmod_php带有512M real / 1024M突发性RAM(无交换)。运行一些测试后,我发现Apache获得的最大进程大小为23M,因此我将其设置MaxClients为25(23M x 25 = 575 MB,对我来说很好)。我决定在服务器上运行一些负载测试,结果使我感到困惑。

我在ab台式机上使用,从wordpress博客请求主页。

当我ab使用24个并发连接运行时,一切似乎都很好。当然,CPU上升,可用RAM下降,结果是每个请求的响应时间约为2-3s。

但是,如果我ab使用25个并发连接(服务器限制)运行,Apache会在几秒钟后挂起。它开始处理请求,然后停止响应,CPU返回到100%空闲并ab超时。Apache日志说已达到MaxClients

发生这种情况时,Apache会将自己锁定在25个正在运行的进程中(如果我检查服务器状态,它们全都处于“ W”状态),并且只有在TimeOut设置停止后进程开始并且服务器开始再次响应(在我的情况下已设置)至45)。

我的问题是:这是预期的行为吗?为什么Apache到达时就死了MaxClients?如果它适用于24个连接,那么它不应该适用于25个连接,只是花更多的时间来响应每个请求并排队其余的请求吗?

令我感到有点奇怪的是,任何奔波的孩子ab都可以通过设置与服务器的并发连接单独杀死一个Web服务器MaxClients

Answers:


17

哈!我终于找到了问题所在。与服务器管理员相比,它与编程更相关,但是我还是决定把答案放在这里,因为通过搜索google我发现我不是唯一遇到这种问题的人(而且由于Apache挂起,第一个猜测是有问题)与服务器)。

问题不在于Apache,而在于我的Wordpress。更具体地说,我的主题。我正在使用一个名为Lightworld的主题,它支持将图像添加到博客标题。为此,它使用PHP的function检查图像大小getimagesize()。由于此函数正在打开与服务器的另一个http连接以获取图像,因此来自每个请求ab都是从PHP内部创建另一个请求。当我使用服务器上所有可用的插槽时,这些PHP请求被放入队列中,但是Apache却无法到达它们,因为它的所有进程都被原始请求锁定,等待插槽完成PHP内部请求。

基本上,PHP使我的服务器进入死锁状态,而Apache仅在这些连接等待其“子级”请求超时后才能开始正常工作。

从主题中删除此功能后,现在我可以为ab服务器提供所需的并发连接数,而Apache正在按预期对它们进行排队。


感谢您在此处发布此信息,我已经尝试了几天来完全相同的症状问题-认为我们也陷入了僵局!
詹姆斯·耶鲁

您如何确定的,主要是您用于确定次要出站请求的日志和工具感兴趣。
Anirudh Goel

2

这里发生的是您有25个线程可以接受连接,并且正在发送26个并发请求。最后一个请求位于套接字队列中,具体取决于积压的大小。

第二个问题是,无论您花费了2-3秒的时间在运行,它花费的时间都足以响应25个并发连接使其速度降低。sleep(1)可能有效,但是在您通过mysql进行文件锁定或表锁定的情况下,每个并行请求都可能在等待之前完成,直到它们达到45秒超时。

对于使用mod_php和任何模块加载的apache进程,23mb听起来很小,所以,我怀疑您可能会在应用程序运行时看到这些apache进程占用更多内存。您真的不能像这样用MaxClients和内存进行数学运算……这会有点接近,但是,您永远不会知道。

www-data  1495  0.1  0.9  56288 19996 ?        S    15:48   0:01 /usr/sbin/apache2 -k start
www-data  1500  0.0  0.5  49684 12436 ?        D    15:48   0:00 /usr/sbin/apache2 -k start

一台机器,有56M和49M的进程。

另一台机器:

www-data  7767  0.1  0.1 213732 14840 ?        S    14:55   0:08 /usr/sbin/apache2 -k start
www-data  8020  0.2  0.1 212424 13660 ?        S    14:57   0:08 /usr/sbin/apache2 -k start

另一台机器:

www-data 28509  0.8  0.1 161720 10068 ?        S    14:39   0:43 /usr/sbin/apache2 -k start
www-data 28511  0.8  0.1 161932 10344 ?        S    14:39   0:43 /usr/sbin/apache2 -k start

因此,内存使用非常依赖于任务,加载了哪些模块等。在最后两个方面,我相信我们已禁用pdo和pdo_mysql,因为该应用程序不使用它们。

真正的问题是,您在做什么需要3秒钟?在当今世界,这是永恒的,被认为是“阻止”应用程序。Apache通常不会死亡,但是会将那些线程留在积压队列中,直到可以为它们提供服务或等待的请求超时为止。我相信您的应用程序可能导致Apache超时。在仅包含phpinfo()的页面上尝试一下;看看结果是否相同。


感谢所有的提示!我知道我仍然需要优化很多事情(几天前我才刚开始配置服务器,这是我第一次使用VPS的经验),但是问题还不止于此……我发布了答案问题来说明我的具体情况是什么问题
罗德里戈·西耶罗
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.