首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Apache会疯狂运行并杀死MySQL呢?

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

Server Fault用户
提问于 2013-12-19 11:54:08
回答 3查看 5.1K关注 0票数 8

在过去的几天里,Apache已经失去了控制,使MySQL两次崩溃。这一切都是从我迁移了一个WordPress网站开始的,该网站还包含了一个phpBB论坛。

我在服务器管理方面不是很有经验,所以我很难确定是什么导致了这个问题。当我注意到MySQL下降时,我跑到了顶端,看到我的系统负载峰值达到98.00。服务器运行10V主机,所有这些主机都收到了大量的通信量,因此我很明显地看到许多apache-2进程正在运行。

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

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

我的问题是:

下一次发生这种情况时,我如何确定是什么导致了系统负载激增?会不会是一个php脚本疯了?会不会是DDOS攻击?

有办法在MySQL崩溃时自动重新启动它吗?

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

在这里,我的服务器统计:

代码语言:javascript
复制
m1.xlarge (8 ECUs, 4 vCPUs, 15 GiB memory, 4 x 420 GiB Storage Capacity)
Ubuntu Server 12.04.3 LTS 
EN

回答 3

Server Fault用户

发布于 2013-12-19 13:46:42

MySQL可能仍然没有记录任何内容,因为可能发生的情况是,由于来自apache的子级的系统内存压力,系统正在草率地杀死它。在/var/log/syslog中应该有这方面的跟踪。

MySQL应该尝试在崩溃或强制终止时重新启动自己,但是除非有足够的内存,否则它不能这样做.mysqld_safe并不认为第二次失败是“崩溃”,而是“拒绝启动”,因此不会继续尝试。失败的重新启动尝试常常被管理员误解为“崩溃”,因为原始故障的本质隐藏在MySQL错误日志中容易被忽略的消息后面:

代码语言:javascript
复制
mysqld_safe Number of processes running now: 0

关于我怀疑与您类似的情况,请参见InnoDB坠机死后分析

对于“为什么”,似乎很简单的答案是,在Apache和MySQL之间,您所拥有的负载,以及您当前的信任,您在机器上没有足够的内存,并且有一些与流量负载相关的临界点会导致这种情况出现。

Apache为来自子进程的每个并发浏览器请求提供服务,因此并发连接的数量增加,子进程的数量将增加。您首先需要在apache配置中限制此值,以便您能够了解导致并发连接增加的实际原因.这仅仅是一个沉重但合法的交通高峰吗?某种拒绝服务?因为请求运行时间太长而延迟请求的DB查询?需要优化的东西?

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

限制并发Apache进程应该有助于防止这种情况,但要明确地说,认为这是完全的解决方案是天真的,所以我不想暗示这一点。一旦流程被限制在一个合理的或至少更安全的级别上,您就可以着手确定到底发生了什么。( Apache上还有其他约束控制,但这不是我的专长。)

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

票数 9
EN

Server Fault用户

发布于 2013-12-19 14:04:57

您有一些要点需要检查:

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

-If --使用apache与预叉mpm :检查进程的数量。如果apache将大量的进程(在繁重的工作负载期间)与mysql链接在一起,那么所使用的延迟和内存就会迅速增长。

-Check由mysql启动的具有显示全局状态的线程数: threads_cached、threads_created和threads_running非常需要检查(threads_created应该在0附近)。

-Check是Mysql使用的ram。

票数 1
EN

Server Fault用户

发布于 2013-12-19 14:54:07

您还可以查看实现库塞斯和为mysql保留资源。这是最接近于在不同硬件上运行这些服务的,但仍然给您提供了维护单个服务器的好处。

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/562453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档