为什么Apache疯狂运行并杀死MySQL?


8

在过去的几天里,Apache失去了控制,并使MySQL崩溃了两次。当我迁移了一个WordPress网站(其中还包含一个phpBB论坛)时,一切就开始了。

我在服务器管理方面经验不是很丰富,因此很难确定导致问题的原因。当我注意到MySQL关闭时,我运行TOP,看到系统负载激增至98.00。该服务器运行10个V-HOSTS,所有这些都接收到正常的流量,因此我显然看到许多apache-2进程正在运行。

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

不幸的是,MySQL错误日志记录被禁用(现在已重新启用),因此那里没有任何线索。但是我很确定这是因为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 

尽管禁用了日志,但会dmesg有所帮助吗?
Daniel W.

Answers:


9

MySQL可能仍未记录任何内容,因为可能发生的是由于apache的孩子的系统内存压力,它被系统毫不客气地杀死了。在/ var / log / syslog中应该有一个痕迹。

MySQL应该尝试在崩溃或强制终止时重新启动自身,但除非有足够的内存可用,否则它无法做到这一点……并且mysqld_safe不会将第二个失败视为“崩溃”,而应视为“拒绝”开始”,因此它将不会继续尝试。失败的重新启动尝试通常被管理员误解为“崩溃”,因为原始失败的本质隐藏在MySQL错误日志中容易被忽略的消息后面:

mysqld_safe Number of processes running now: 0

我怀疑与您的情况相似,请参阅InnoDB崩溃后事态

“为什么”的看似简单的答案是,在Apache和MySQL之间,您所拥有的负载以及当前的配置之间,计算机上没有足够的内存,并且与流量负载相关的一些临界点使这种情况得以解决。 。

Apache为子进程处理每个并发浏览器请求,因此,随着并发连接数的增加,子进程的数量也会增加。首先,您需要在apache配置中限制此值,以便您了解真正导致并发连接增加的原因……这仅仅是一个繁重但合法的流量高峰吗?某种拒绝服务?数据库查询由于请求运行时间太长而延迟了请求?需要优化的东西吗?

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

限制并发Apache进程应该有助于防止这种情况,但是要明确地说,认为这是完整的解决方案很幼稚,因此我不想暗示这一点。一旦流程被限制在合理或至少更安全的水平,您就可以确定实际情况。(Apache上还有其他约束控制,但这不是我的专长。)

当然,“最佳实践”是在不同的硬件上运行数据库,以使应用程序无法杀死它。从表面上看,通过共享来“最大化利用”一台机器似乎更为有效,但这是一种错误的经济做法。在典型的工作负载中,MySQL使用的大部分内存是在启动时分配的,并在MySQL Server运行时一直保留。对CPU的需求很可能会共享MySQL和Apache的高峰时间,因为它们最终将承担相同的负载。实际上,使用两台m1.large机器而不是一台m1.xlarge可能会更好,并且费用相同,因为较小的机器恰好是较大的机器价格的一半...即使您已经提前付款对于额外的折扣,可以完成此更改


感谢您的回复,它真的很有帮助。我检查了/ ver / log / syslog并发现以下行:Dec 18 15:48:38 ip-10-33-164-173内核:[29714591.071719]内存不足:杀死进程28369(mysqld)得分21或牺牲孩子12月18日15:48:38 ip-10-33-164-173内核:[29714591.071753]杀死了进程28369(mysqld)total-vm:2520332kB,anon-rss:335304kB,file-rss:0kB所以您认为限制了最好在apache中设置maxclients来防止这种情况发生?您认为更安全的价值是什么?
鲍勃·弗莱明

1
我建议限制maxclients是开始了解导致您遇到任何雪崩的情况的最佳方法。您必须根据您的情况,系统上的可用内存量以及观察到的孩子使用的apache的典型内存量,得出一个更安全的值。太低,请求将开始备份;太高了,您就是现在的位置。然后监视产生的进程并观察您的可用内存和服务器日志。
Michael-sqlbot

1

您需要检查以下几点:

-检查/ var / log / messages:如果没有更多的可用内存,oomkiller可以杀死mysql进程。使用free -lm检查ram(无缓存)

-如果将Apache与prefork mpm一起使用:请检查进程数。如果apache堆栈了大量的进程(在繁重的工作量中)并带有指向mysql的链接,则等待时间和所使用的内存可能会迅速增长。

-检查具有显示全局状态的mysql启动的线程数:threads_cached,threads_created和threads_running对检查很重要(threads_created应该接近0)。

-检查Mysql使用的ram。


0

您也可以研究实现cpusets和为mysql保留资源。这是最接近在不同硬件上运行这些服务的情况,但仍为您提供维护单个服务器的好处。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.