我有一个低内存 VPS,mysql 和交换文件每天早上 03:00 准时崩溃。系统上没有配置任何 cronjobs。该服务器是一个基本的 LAMP 开发服务器,所有设置都是默认设置。
cat /var/log/messages|grep -i mysql
Jun 25 20:51:07 vader sshd[72946]: error: PAM: authentication error for mysql from 65.52.155.140
Jun 28 03:01:34 vader kernel: pid 848 (mysqld), uid 88, was killed: out of swap space
Jun 28 03:01:34 vader kernel: pid 93947 (mysqld), uid 88, was killed: out of swap space
Jun 29 03:01:32 vader kernel: pid 98578 (mysqld), uid 88, was killed: out of swap space
Jun 29 03:01:33 vader kernel: pid 2586 (mysqld), uid 88, was killed: out of swap space
我的交换文件是 1GB。我试过 2GB,一周后又出现了同样的崩溃情况。
ls -l /home/sw*
-rw------- 1 root wheel 1073741824 Jun 21 13:19 /home/swap0
更糟糕的是,如果不重启,我无法重新初始化交换文件
swapoff -a mdconfig -a -t vnode -f /home/swap0 -u 0 && swapon /dev/md0 mdconfig: ioctl(/dev/mdctl): 设备繁忙
我没有太多的内存可以使用:
# vmstat
procs memory page disks faults cpu
r b w avm fre flt re pi po fr sr vt0 md0 in sy cs us sy id
1 0 3 1709M 491M 44 0 0 0 54 29 0 0 4 135 94 0 0 100
但是如果 mysql 运行正常的话我就不需要它了。
两个问题。
没有。1)如何在交换文件崩溃后重新初始化它,这样我就不必重新启动(我只是想知道,因为我在谷歌上找到的一切都失败了)?
没有。2)如何稳定mysql以便它不会在0300时因大量内存而中断?
答案1
我也刚刚看到了这种行为,只不过在我的例子中,mysql 服务器每周死机一次,而不是每天死机一次。它发生在每周定期任务运行的同时(请参阅 /etc/crontab 和 /etc/cron.d/periodic/{daily,weekly}/)。从您的日志来看,它发生在 03:01,即每日定期任务运行期间(从 03:00 开始)。有几种可能的解决方案:
- 避免运行定期任务,或者至少确定哪个任务正在消耗内存。在我的情况下,它是
makewhatis
每周运行的命令 - 添加更多交换空间。超过某个点后,服务器应该有足够的内存来与定期任务共存
- 添加另一个定期任务,在其他任务之后运行并重新启动服务器