![MySQL 在服务器负载过大时崩溃](https://linux22.com/image/614885/MySQL%20%E5%9C%A8%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%B4%9F%E8%BD%BD%E8%BF%87%E5%A4%A7%E6%97%B6%E5%B4%A9%E6%BA%83.png)
我安装了一个新的 Ubuntu Server 12.04 实例,并使用基本 lamp 配置将其配置为基本 Web 服务器。此处 apache 和 mysql 的所有设置均采用其默认设置,但我看到在 apache 负载过大的情况下随机服务崩溃。
Apache 在负载下会启动许多 www-data 线程,这很正常,内存会慢慢开始消耗。当服务器达到最大内存负载时,它会开始终止进程,其中最常见的是 mysql。
我查看了 mysql 日志,其中一部分如下所示。一切都运行良好,直到我这里的内存不足。我在 mysql 中运行的唯一东西是默认的 wordpress 数据库,所有表都在 MyISAM 引擎上。这些是崩溃时的 mysql 日志:
130716 14:41:12 InnoDB: Fatal error: cannot allocate memory for the buffer pool
130716 14:41:12 [ERROR] Plugin 'InnoDB' init function returned error.
130716 14:41:12 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
130716 14:41:12 [ERROR] Unknown/unsupported storage engine: InnoDB
130716 14:41:12 [ERROR] Aborting
以下是崩溃时的服务器日志:
Jul 16 16:47:36 ip-172-31-36-128 kernel: [728613.183276] apache2 invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0
Jul 16 16:47:36 ip-172-31-36-128 kernel: [728613.183283] apache2 cpuset=/ mems_allowed=0
Jul 16 16:47:36 ip-172-31-36-128 kernel: [728613.183287] Pid: 29348, comm: apache2 Not tainted 3.2.0-49-virtual #75-Ubuntu
Jul 16 16:47:36 ip-172-31-36-128 kernel: [728613.183290] Call Trace:
Jul 16 16:47:36 ip-172-31-36-128 kernel: [728613.183301] [<ffffffff81119b31>] dump_header+0x91/0xe0
Jul 16 16:47:36 ip-172-31-36-128 kernel: [728613.183305] [<ffffffff81119eb5>] oom_kill_process+0x85/0xb0
Jul 16 16:47:36 ip-172-31-36-128 kernel: [728613.183309] [<ffffffff8111a25a>] out_of_memory+0xfa/0x220
答案1
要么增加更多 RAM 来应对增加的负载,要么限制 apache 进程的数量以确保 MySQL 不会被终止。另外,确保您的 VPS 有交换空间(许多 VPS 提供商不提供此项)