我有一台租用的 rackspace 服务器,用来运行我的个人项目。由于我比较抠门,所以它只有 256Mb 的 RAM,说实话处理不了太多事情。偶尔,当流量急剧上升时,服务器就会决定开始终止进程,而 mysqld 似乎是它最常终止的进程。我尝试访问我的网站,结果收到一条消息,提示建立数据库连接时出错。检查日志发现 mysqld 因内存不足而被终止。
由于我仍然像昨天一样穷,并且不想升级我的 rackspace VM 的 RAM,有没有办法让它在死机时自动重新启动 mysqld?
我曾想过使用类似 crontab 的东西,但遗憾的是,我也不知道具体要做什么。我想我是“桌面上的 Linux”一代的产物,因为我可以在我的台式机和笔记本电脑上做大多数事情(它们几乎只运行 Linux),但仍然缺乏很多 Linux 服务器管理技能。
服务器运行CentOS 6.3
答案1
这不是一个干净的解决方案,显然最好从一开始就避免这个问题。无论如何,我不确定 CentOS 如何管理服务,但我认为它使用service
。如果是这样,你可以检查mysql
服务是否正在运行
/sbin/service mysql status
如果正在运行,此命令将成功退出;mysql
如果未运行,则返回非 0 退出状态。因此,如果服务未运行,您可以使用以下命令启动它:
/sbin/service mysql status || service mysql start
您可以添加此行以/etc/crontab
每分钟启动这些命令:
* * * * * /sbin/service mysql status || service mysql start
答案2
这有点令人不安。
mysqld总是重新启动mysqld_safe因为底部有一个无限循环mysqld_safe
来检查异常关机。如果错误太严重,甚至无法mysqld_safe
在mysqld
后续尝试中重新启动。
考虑到所设计的情况,如果无论如何都会拒绝它,强制启动mysqld_safe
可能不是一个好主意。mysqld
mysqld_safe
您需要在 my.cnf 中找到错误日志,它位于
[mysqld]
log-error=log-filename
或者
[mysqld_safe]
log-error=log-filename
阅读文本文件(可能通过运行tail -30 log-filename
)并找到 mysqld 处理关闭的源头。
答案3
为了在低内存 VPS 上保持正常运行,我使用了 terdom 的修改版回答检查并重新启动MySQL。
/sbin/service mysqld status || service mysqld restart
我需要更改mysql
为mysqld
才能使其正常工作。如果没有它,我会收到错误“ ERROR! MySQL is running but PID file could not be found
”。
在我的 CentOS 7.2 系统上,/sbin/service
重定向到/bin/systemctl status
,因此以下命令执行速度更快。
/bin/systemctl status mysqld.service || /bin/systemctl start mysqld.service
我最终在系统的根 crontab 中添加了以下行。它每分钟检查一次 MySQL 是否正在运行,并将 stdout 重定向为 null。除非出现问题,否则启动服务不会输出任何内容,因此无需在最后一个命令上添加 null 重定向。
* * * * * /bin/systemctl status mysqld.service > /dev/null || /bin/systemctl start mysqld.service
双管道||
意味着OR
如果第一个命令因某种原因失败,则将执行第二个命令。(返回大于零的退出代码。)
这就像说,“运行第一个命令,或者,如果第一个命令因某种原因失败,则运行第二个命令”。
这与双“&”符号不同,后者&&
的意思像是在说,“运行第一个命令,和,只有第一个命令成功执行,才运行第二个命令”。
答案4
以下内容来自 jonnyreeves.co.uk:
罪魁祸首就是 php-fpm!快速谷歌搜索后,我发现另一个 Wordpress 客户也遇到了类似的问题;建议调整 php-fpm 池配置 (/etc/php-fpm.d/www.conf) 并调整 pm 配置。主要更改是从 移动到 ,并将pm = dynamic
值设置为pm = ondemand
(基于观察每个工作者约 5% 的内存使用情况)。更改配置后,我重新启动了所有服务并检查了内存使用情况。pm.max_children
5
service php-fpm restart
service nginx restart
service mariadb restart
重新启动后,内存使用量显著降低。