首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Apache到达MaxClients并锁定服务器

Apache到达MaxClients并锁定服务器
EN

Server Fault用户
提问于 2010-04-18 17:06:17
回答 2查看 14.3K关注 0票数 9

我目前有一个Apache2服务器,在一个有512 server /1024MBurstableRAM(没有交换)的OpenVZ VPS上运行着mpm-preforkmod_php。运行了一些测试之后,我发现Apache的最大进程大小是23M,所以我已经将MaxClients设置为25 (23mx25= 575 MB,对我来说可以)。我决定在服务器上运行一些负载测试,结果让我感到困惑。

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

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

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

当这种情况发生时,Apache将自己锁定在25个正在运行的进程中(如果我检查服务器状态,它们都处于"W“状态),并且只有在TimeOut设置之后进程开始死亡,服务器再次开始响应(在我的例子中,它被设置为45)。

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

我觉得有点奇怪,任何一个运行ab的孩子,只要设置到服务器MaxClients的并发连接,就可以单独杀死一个kid服务器。

EN

回答 2

Server Fault用户

回答已采纳

发布于 2010-04-18 20:49:50

哈!我自己终于发现了这个问题。它与编程有关,而不是服务器管理,但我还是决定在这里给出答案,因为通过搜索google,我发现我不是唯一有这种问题的人(而且,由于Apache挂起,最初的猜测是服务器有问题)。

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

基本上,PHP将我的服务器置于死锁状态,而Apache只有在这些连接超时等待它们的“子”请求之后才能正常工作。

在我将这个函数从我的主题中删除之后,现在我可以用我想要的多个并发连接来ab我的服务器了,并且Apache正在像预期的那样排队。

票数 18
EN

Server Fault用户

发布于 2010-04-18 20:10:31

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

第二个问题是,无论您运行的是2到3秒的时间,都需要足够长的时间来响应,这25个并发连接正在减慢速度。睡眠(1)可能有效,但是,当您正在执行mysql的文件锁定或表锁定时,每个并行请求可能都在等待之前完成,直到到达45秒超时为止。

对于带有mod_php和任何加载模块的apache来说,23 is听起来很小,因此,我怀疑在应用程序运行时,可能会看到这些apache进程占用更多的内存。你不能像那样用MaxClients和内存计算.它会有点接近,但是,你永远不会知道。

代码语言:javascript
复制
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进程。

另一台机器:

代码语言:javascript
复制
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

另一台机器:

代码语言:javascript
复制
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()的页面上试一试,看看结果是否相同。

票数 2
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/133561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档