前几天,我的 vps 上的 mysql 服务器开始崩溃,有时在重启后立即崩溃。我在 wordpress 网站上发现了这个问题。service mysql start
许多 apache2 进程导致内存和 CPU 超载。这是顶部的屏幕截图。
我没有从 apache 日志中找到任何有用的信息,mysql 错误日志显示有关内存不足的消息:
140922 12:24:43 [Note] Plugin 'FEDERATED' is disabled.
140922 12:24:43 InnoDB: The InnoDB memory heap is disabled
140922 12:24:43 InnoDB: Mutexes and rw_locks use GCC atomic builtins
140922 12:24:43 InnoDB: Compressed tables use zlib 1.2.8
140922 12:24:43 InnoDB: Using Linux native AIO
140922 12:24:43 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
140922 12:24:43 InnoDB: Completed initialization of buffer pool
140922 12:24:43 InnoDB: Fatal error: cannot allocate memory for the buffer pool
140922 12:24:43 [ERROR] Plugin 'InnoDB' init function returned error.
140922 12:24:43 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
140922 12:24:43 [ERROR] Unknown/unsupported storage engine: InnoDB
140922 12:24:43 [ERROR] Aborting
140922 12:24:43 [Note] /usr/sbin/mysqld: Shutdown complete
首先,我认为问题可能出在数据库中,并检查了数据库,mysqlcheck --all-databases
但一切正常,我尝试删除并创建新的数据库,但没有成功。
我还尝试删除 wordpress 插件文件夹。Wordpress 是最新版本,评论已禁用,3 个用户,访客数量很少(公司博客)。
现在我不知道去哪里查找以及如何诊断问题,如果在 apache 中启用了 wordpress 配置,mysql 的存活时间不会超过 10-20 秒。
更新:我删除了 WP 文件夹并下载了新的 WP,没有任何配置。如果启用了 wp 站点,vps 会开始超载,apache 无法响应请求。如果不启用 WP,一切都会顺利进行。我还没有销毁这个 droplet,因为我想找到问题的原因。也许这是 vps 中的一些漏洞?
UPDATE2:在日志和 netstat 中搜索后,我发现问题出现在:
- wordpress 网站已启用,并且 apache 与 mysql 可以正常工作
- 一些来自虚拟机器人对 rpc.php 的请求或类似的东西将 apache 连接设置为 CLOSE_WAIT,经过几次请求后,apache 有许多工作进程处于 CLOSE_WAIT 状态,结果许多工作进程和内存不足(是的,我应该减少最大值,但无论如何,当所有工作进程都在等待时,站点就停止工作了)
- MySQL 内存不足(这不是答案中提到的问题,而是其他问题导致的,而且升级 VM 也不能解决问题)
- mysql 降级后过载停止。(这让我认为数据库可能已损坏,但检查数据库后未发现错误)
在丢失文件的虚拟请求后,什么原因可能导致 apache 进入 CLOSE_WAIT 状态?
答案1
正如错误所暗示的,看起来您只是用完了内存cannot allocate memory for the buffer pool
。
您的选择是:
- 升级(虚拟)硬件,使其具有更多内存
- 和/或获得更多的交换
- 减少其他应用程序(即 apache)的 RAM 使用量。
仅您的 apache 就消耗了系统所能承受的所有内存。没有剩余空间供 mysql 使用。您需要调整 apache 设置,以减少内存消耗。最大的影响应该来自于减少 apache 设置的最大子项标准。以您最大的 apache 实例为例,似乎您最多只能承受 14 个子项,否则系统将因缺少内存(约 34MB)而崩溃。
例如,如果预计每个 Apache 占用 30MB,而数据库占用 128MB,操作系统占用 128MB,那么我们可以进行非常简单的计算。512(总计)- 128(数据库)- 128(操作系统)将为 Apache 留下 256。每个 30MB 意味着您只能负担得起 8 个 Apache 子项。虽然还有更多,但我们至少可以在您的顶部屏幕截图中看到 22 个子项。
512MB 对于运行一个网站来说只是很小的内存量,你需要做大量的调整来优化你拥有的少量内存。此外,像 InnoDB 这样的引擎可能不适合你,因为它对内存的依赖性很高。像 myisam 这样的其他引擎可能更适合你的需求。