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

Mysql 当网站繁忙时,如何阻止apache2崩溃?,mysql,apache,apache2,nginx,Mysql,Apache,Apache2,Nginx,通常情况下,请求似乎会备份,apache开始消耗越来越多的内存和CPU,直到最终耗尽RAM,然后所有apache进程都死掉,所有访问者都没有网站 这似乎是与我交谈的人的常见问题,但我似乎找不到解决办法 非常感谢任何帮助 一个相当简单的方法是限制允许访问您的站点的用户数量。 实际配置取决于您使用的MPM。 但对于典型的unix apache mpms(预工作和工作),通常是MaxClient() 另外,如果您正在使用prefork,您可能希望切换到worker mpm,因为它更快(但所有模块都必须

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

这似乎是与我交谈的人的常见问题,但我似乎找不到解决办法


非常感谢任何帮助

一个相当简单的方法是限制允许访问您的站点的用户数量。 实际配置取决于您使用的MPM。 但对于典型的unix apache mpms(预工作和工作),通常是MaxClient()


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

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

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

问题是,通过分析日志,事后调试失败也是可能的,但这些日志需要在事件发生之前做好准备,但由于您不知道要查找什么,因此可能需要更多的工作

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

由于您将问题标记为“mysql”,另一个问题是Apache是否需要等待后端数据库。一点mysql调优可以解决您所有的问题,但这只是您看到的失败的可能性之一。记录服务器状态、一点“top”输出和mysqls慢速查询日志将有助于深入了解这一点。此外,如果您怀疑mysql的内存配置可能尚未得到处理,请检查mysql的内存配置

最后,重要的是确保Apache在排队请求时不会使用太多内存,否则机器将开始交换并最终杀死Apache(或其他东西)。评估每个Apache prozess需要多少内存。在进程状态中不容易看到,但可以使用以下脚本进行计算:。然后看看您的系统可以在Apache进程上最大限度地花费多少内存,并相应地设置MaxClient,这样Apache就永远不会使用比可用内存更多的内存。(简单的数学计算,将平均进程的RAM需求乘以进程数。)可能还需要调整其他一些大小调整指令,以便它们与MaxClient匹配。这是许多设置所缺乏的,但却是防止小“爆炸”的基本保护


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

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

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


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

我可以通过在繁忙期间清除drupal CMS上的缓存来复制它,这会大大增加数据库负载。我将KeepAlive从5-2秒缩短。不确定这是否会有很大的不同。我还尝试通过fastcgi使用PHP从apache的preform版本切换到MPM worker版本。虽然我怀疑页面响应时间要快一点,但这似乎并没有太大的区别。这一切都很有帮助。谢谢你,彼得·波姆。我知道这篇文章有点老了,但是你能评论一下KeepaliveTimeout=2的好处吗?这是否像杀死正在运行的进程那样简单,这样它们就不会堆积起来?