我有一个 Amazon t2.small EC2 -1 核和 2GB RAM它超过了 CentOS 和 Virtualmin 的最低要求
我的系统:
- CentOS 7.5.1804
- 虚拟分钟
- MySQL 5.5.60-MariaDB
- Apache 2.4.6
MySQL 服务在一个月前多次访问后总是停止工作,我可以从 Webmin 重新启动它,直到我读到 DigitalOcean 博客中的一篇文章,添加了 [重新启动=始终] 在文件中 [/etc/systemd/system/multi-user.target.wants/mariadb.service] 我通过终止进程来测试它,然后服务会自动重新启动22天不停歇
现在服务再次停止工作,我打开了 [mariadb.service] 文件,发现 [Restart=Always] 行仍然在那里,但服务随机停止了。
注意:我仍然可以从 Webmin 启动它,没有任何问题,但是由于 DB 连接,所有网站都变得不可用。
我需要追踪这个问题,但我没有处理此类问题的经验。如何解决?
MySQL 配置:我的配置文件
symbolic-links=0
innodb_file_per_table = 1
myisam_sort_buffer_size = 8M
read_rnd_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
sort_buffer_size = 512K
table_open_cache = 64
max_allowed_packet = 1M
key_buffer_size = 16M
来自{的一些行var/日志/消息}
Oct 22 16:49:49 ns1 kernel: Out of memory: Kill process 13092 (mysqld) score 97 or sacrifice child
Oct 22 16:49:49 ns1 kernel: Killed process 13092 (mysqld) total-vm:1065992kB, anon-rss:182972kB, file-rss:0kB, shmem-rss:0kB
Oct 22 16:49:49 ns1 kernel: [12822] 27 12822 28326 73 14 0 0 mysqld_safe
Oct 23 08:58:11 ns1 kernel: [12822] 27 12822 28326 74 14 0 0 mysqld_safe
Oct 23 08:58:11 ns1 kernel: [19703] 27 19703 266425 39874 150 0 0 mysqld
Oct 23 20:04:47 ns1 saslauthd[531]: do_auth : auth failure: [user=mysql] [service=smtp] [realm=] [mech=pam] [reason=PAM auth error]
Oct 23 22:21:25 ns1 kernel: [12822] 27 12822 28326 74 14 0 0 mysqld_safe
Oct 23 22:21:25 ns1 kernel: [19703] 27 19703 266425 48494 161 0 0 mysqld
Oct 23 22:21:25 ns1 kernel: Out of memory: Kill process 19703 (mysqld) score 103 or sacrifice child
Oct 23 22:21:25 ns1 kernel: Killed process 19703 (mysqld) total-vm:1065700kB, anon-rss:193976kB, file-rss:0kB, shmem-rss:0kB
Oct 23 22:21:25 ns1 kernel: [12822] 27 12822 28326 74 14 0 0 mysqld_safe
Oct 23 22:39:58 ns1 kernel: [12822] 27 12822 28326 76 14 0 0 mysqld_safe
Oct 23 22:39:58 ns1 kernel: [19246] 27 19246 266716 16891 98 0 0 mysqld
Oct 23 22:40:02 ns1 kernel: [12822] 27 12822 28326 76 14 0 0 mysqld_safe
Oct 23 22:40:02 ns1 kernel: [19246] 27 19246 266938 17064 98 0 0 mysqld
Oct 23 22:40:05 ns1 kernel: mysqld invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
Oct 23 22:40:05 ns1 kernel: mysqld cpuset=/ mems_allowed=0
Oct 23 22:40:05 ns1 kernel: CPU: 0 PID: 19357 Comm: mysqld Kdump: loaded Not tainted 3.10.0-862.11.6.el7.x86_64 #1
答案1
最后,我经过12天的测试,找到了解决MySQL在数百个页面访问后自动启动并被杀死的解决办法。
答案取决于系统操作系统(CentOS)和 MySQL Mariadb 服务
解决方案:只需在启动服务前添加几秒即可 - 在我的情况下,我添加了 45 秒
在 { 中的 [service] 部分下添加以下行/etc/systemd/system/multi-user.target.wants/mariadb.service} - 当然路径取决于你的系统操作系统和 MySQL 服务名称(并非所有都有 mariadb.service)
Restart=always
RestartSec=45s
不要忘记运行以下命令
sudo systemctl daemon-reload
sudo systemctl restart mariadb.service
答案2
不知道。我会先介绍一下常见的
为了安全起见,检查磁盘空间状态 DF-H 和记忆 免费-m 正常运行时间(发生碰撞后立即检查)
检查数据目录的所有权和权限是否未发生改变
答案3
从日志输出中的这一行:
Oct 22 16:49:49 ns1 kernel: Out of memory: Kill process 13092 (mysqld) score 97 or sacrifice child
可以看出你的 systemd 确实耗尽了内存,并且 Linux OOM(内存不足)终止程序确实停止了你的 mysqld(MySQL 守护进程)进程。
从描述来看重启=部分,上面写着如果,它将不会重新启动the service is stopped with systemctl stop or an equivalent operation
,也许 OOM killer 是 systemd 的等效物,这个我不知道。
危险路段
似乎你可以禁用 OOM 终止为您的流程添加OOMScoreAdjust=-1000
禁用此功能的功能。