当网站繁忙时,如何阻止apache2崩溃?

时间:2009-12-03 15:54:08

标签: mysql apache apache2 nginx

通常情况下,请求似乎备份,并且apache开始消耗越来越多的内存和CPU,直到最终它耗尽RAM然后所有apache进程死亡,所有访问者都没有网站。

这似乎是我与之交谈的人的常见问题,但我似乎无法找到解决方案!

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:1)

是的,这是一个常见问题。这也是大多数人的Apache知识/系统知识结束的地方: - )

这是一个很长的话题。首先,您可以重现行为或经常看到它吗?或者它只是“有时”发生,只有在调试任何东西为时已晚时才注意到它?

事实上,通过分析日志来调试失败也是可能的,但是那些之前需要为事件做好准备,但是因为你不知道要找什么它可能是更多的工作。

要找出资源瓶颈的位置,首先要做的是启用mod_status,使其可以从localhost或某个受信任位置访问,并查看服务器状态(/ server-status)。当它“太晚”并且Apache不再做出反应时,可能无法查看服务器状态,但之前可以收集有趣的数据。

由于你标记了你的问题“mysql”,另一个问题是,如果有一个Apache必须等待的后端数据库。一点点的mysql调优可以解决你所有的问题,但这只是你看到失败的可能性之一。记录服务器状态,一点点“顶部”输出和mysqls slow-query-log可以深入了解这一点。另外,检查mysql的内存配置,如果你怀疑它可能不会被处理掉。

最后,确保Apache不会使用太多内存,排队请求,或者机器将开始交换并最终杀死Apache(或其他内容)时,这一点非常重要。评估每个Apache prozess需要多少内存。这在流程状态中不易显示,但可以使用此脚本计算:http://cmdline.net/misc/httpd2-memusage。然后看看你的系统可以在Apache进程上花费多少内存,并相应地设置MaxClients - 这样Apache就永远不会使用超过可用的内存。 (您将平均过程的RAM需求乘以进程数,简单数学。)其他一些大小调整指令也可能需要调整,因此它们与MaxClients匹配。这是许多设置缺乏的东西 - 但它是防止小“爆炸”的必要保护。

最后,你的Apache相对忙吗?然后我几乎可以盲目地建议将KeepaliveTimeout减少到2秒。

答案 1 :(得分:0)

一种相当简单的方法是限制允许访问您网站的用户数量。 实际配置取决于您使用的MPM。 但通常情况下,对于典型的unix apache mpms(prefork和worker),它将是MaxClients(http://httpd.apache.org/docs/2.2/en/mod/mpm_common.html#maxclients)。

另外,如果您正在使用prefork,您可能希望切换到worker-mpm,因为它更快(但所有模块必须是线程安全的,例如旧的PHP版本不是)

答案 2 :(得分:0)

听起来好像数据库可能会通过“挂起”导致问题。为此,KeepAlive和MPM类型都不会有所作为。

检查您的表是否使用InnoDB引擎,而不是MyISAM引擎。 MyISAM将在随机时间点“优化”,这是一个表格阻止操作,并且可能需要几分钟才能完成一个大表。这将是一种“病态的”因素,使得Apache停滞不前(如果没有适当的限制,甚至可能会死亡)。 - > “显示表状态”

分配给数据库的内存不足是下一个可能要检查的内容。 /etc/my.cnf通常附带非常小的默认值。如果表使用InnoDB引擎,那么一个太小的innodb_buffer_pool_size值可能是罪魁祸首。你可能有更多的内存;表状态为您提供有关数据实际大小的详细信息。