为什么Apache运行野生和杀死MySQL?

在过去的几天中,Apache已经失去控制,并使MySQL崩溃了两次。 这一切都开始时,我迁移了一个WordPress的网站,其中还包含一个phpbb论坛。

我不是非常有经验的服务器pipe理员,所以我很难找出是什么原因造成的问题。 当我注意到mysql已经closures时,我跑了TOP,看到我的系统负载峰值达到了98.00。 服务器运行10个V-HOSTS,所有这些都可以接收到一定数量的stream量,所以我显然看到很多apache-2进程在运行。

高服务器负载持续10分钟,然后恢复到正常状态。 在这一点上,我没有看到networkingstream量的高峰。

不幸的是,mysql错误日志logging被禁用(现在重新启用),所以没有线索。 但我很确定这是因为Apache耗用所有资源,所以mysql进程ID被杀死。

我的问题是:

下一次发生这种情况 – 如何识别导致系统负载峰值的原因? 难道这是一个疯狂的PHP脚本? 这可能是一个ddos攻击?

有没有办法自动重新启动的时候崩溃的MySQL?

我现在已经安装了htop 。 这可能比top更有用吗?

在这里我的服务器统计:

 m1.xlarge (8 ECUs, 4 vCPUs, 15 GiB memory, 4 x 420 GiB Storage Capacity) Ubuntu Server 12.04.3 LTS 

提前致谢!

MySQL可能仍然没有logging任何东西,因为可能发生的事情是,由于系统内存压力来自apache的孩子,系统正在被系统毫不客气地杀害。 在/ var / log / syslog中应该有一个这样的path。

MySQL应该尝试在崩溃或强制终止时自行重启,但是除非有足够的内存可用,否则它不能这么做……而这第二次失败并不是mysqld_safe被视为“崩溃”,而是被拒绝开始“,所以它不会继续尝试。 失败的重新启动尝试经常被pipe理员误解为“崩溃”,因为原始失败的本质隐藏在MySQL错误日志中容易被忽略的消息之后:

 mysqld_safe Number of processes running now: 0 

查看InnoDB Crash Post Mortem的情况,我怀疑是类似于你的情况。

“为什么”这个看起来很简单的答案是Apache和MySQL之间,你有负载和你当前的configuration,你的计算机上没有足够的内存,并且有一些与stream量负载相关的引爆这个条件的引爆点。

Apache从一个subprocess为每个并发浏览器请求提供服务,因此并发连接的数量增加,subprocess的数量也会增加。 您首先需要在apacheconfiguration中限制这个值,以便您能够理解实际上导致并发连接数增加的因素……是一个沉重而合法的stream量高峰吗? 某种拒绝服务? 数据库查询延迟请求,因为它们运行时间过长? 有什么需要优化?

http://httpd.apache.org/docs/2.2/mod/mpm_common.html#maxclients

限制并发的Apache进程应该有助于防止这一点,但要清楚,认为这是完整的解决scheme是天真的,所以我不想暗示这一点。 一旦stream程被限制在一个合理的或者至less比较安全的水平,你可以继续确定真正发生了什么。 (Apache还有其他限制控制,但这不是我的专业领域。)

“最佳实践”当然是在不同的硬件上运行你的数据库,这样应用程序就不能杀死它。 从表面上看,通过分享一台机器来“最大限度地利用”一台机器似乎更有效率,这是一种虚假的经济。 在一个典型的工作负载中,MySQL使用的大部分内存是在启动时分配的,并且只要MySQL服务器正在运行就保存。 对CPU的需求很可能会分享MySQL和Apache的高峰时间,因为它们最终会承担相同的负载。 用两台m1.large机器,而不是单个m1.xlarge,你可能会更好,而成本将是相同的,因为较小的一个是大一半的价格的一半…即使你已经提前付款对于额外的折扣, 这个改变可以完成 。

你有几点检查:

– 检查/ var / log / messages:oomkiller可以杀死mysql进程,如果没有更多的内存使用。 检查公羊免费-lm(没有caching)

– 如果你用prefork使用apache mpm:检查进程的数量。 如果apache将一个重要的进程(在繁重的工作负载中)与一个到mysql的链接堆栈在一起,那么所使用的延迟和内存就会快速增长。

– 检查显示全局状态的mysql启动线程的数量:threads_cached,threads_created和threads_running是重要的检查(threads_created应接近0)。

– 检查Mysql使用的内存。

您也可以考虑实施cpusets并为mysql预留资源。 这是最接近在不同的硬件上运行这些服务,但仍然给你维护一台服务器的好处。