我目前有一个Apache2服务器,在一个有512 server /1024MBurstableRAM(没有交换)的OpenVZ VPS上运行着mpm-prefork和mod_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服务器。
发布于 2010-04-18 20:49:50
哈!我自己终于发现了这个问题。它与编程有关,而不是服务器管理,但我还是决定在这里给出答案,因为通过搜索google,我发现我不是唯一有这种问题的人(而且,由于Apache挂起,最初的猜测是服务器有问题)。
问题不在于Apache,而在于我的Wordpress。更具体地讲我的主题。我使用了一个名为Lightworld的主题,它支持将图像添加到博客标题中。为了允许这样做,它使用PHP的函数getimagesize()来检查图像大小。由于这个函数打开了另一个http连接到服务器以获取映像,因此来自ab的每个请求都是从PHP内部创建另一个请求。当我使用所有可用的服务器插槽时,这些PHP请求被放入队列中,但是Apache无法到达它们,因为它的所有进程都被锁定在原始请求中,等待一个插槽来完成PHP内部请求。
基本上,PHP将我的服务器置于死锁状态,而Apache只有在这些连接超时等待它们的“子”请求之后才能正常工作。
在我将这个函数从我的主题中删除之后,现在我可以用我想要的多个并发连接来ab我的服务器了,并且Apache正在像预期的那样排队。
发布于 2010-04-18 20:10:31
这里发生的情况是,您有25个线程能够接受连接,并且您正在发送26个并发请求。最后一个请求位于套接字队列中,取决于积压的大小。
第二个问题是,无论您运行的是2到3秒的时间,都需要足够长的时间来响应,这25个并发连接正在减慢速度。睡眠(1)可能有效,但是,当您正在执行mysql的文件锁定或表锁定时,每个并行请求可能都在等待之前完成,直到到达45秒超时为止。
对于带有mod_php和任何加载模块的apache来说,23 is听起来很小,因此,我怀疑在应用程序运行时,可能会看到这些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()的页面上试一试,看看结果是否相同。
https://serverfault.com/questions/133561
复制相似问题