我在运行 nginx、mariadb、php 和 WordPress 的 t2.micro 实例 (1GB) 中似乎存在内存问题。
我可以看到 mariadb.service 经常被杀死(我使用了grep -e kill /var/log/messages
下面的示例输出)。如您所见,mysqld 正在杀死 mariadb(这不是自杀吗?)。
我已经尝试对 mariadb 进行各种调整和调整,但我认为这更像是一个整体系统问题。
当“崩溃”发生时,我无法隔离。我可以愉快地登录到 WordPress 管理员,离开工作,当我切换到新区域(提示 dbase 调用)时,站点挂起。SSH 连接也会同时挂起。
t2.micro 是不是不够强大?
Apr 9 11:22:32 ip-172-31-20-68 systemd[1]: mariadb.service: Main process exited, code=killed, status=9/KILL
Apr 9 11:23:25 ip-172-31-20-68 kernel: mysqld invoked oom-killer: gfp_mask=0x6200ca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0
Apr 9 11:23:25 ip-172-31-20-68 kernel: oom_kill_process.cold.28+0xb/0x10
Apr 9 11:23:25 ip-172-31-20-68 kernel: oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/system.slice/mariadb.service,task=mysqld,pid=6383,uid=27
Apr 9 11:23:25 ip-172-31-20-68 systemd[1]: mariadb.service: Main process exited, code=killed, status=9/KILL
Apr 9 11:27:04 ip-172-31-20-68 kernel: tuned invoked oom-killer: gfp_mask=0x6200ca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0
Apr 9 11:27:04 ip-172-31-20-68 kernel: oom_kill_process.cold.28+0xb/0x10
Apr 9 11:27:04 ip-172-31-20-68 kernel: oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/system.slice/mariadb.service,task=mysqld,pid=6483,uid=27
Apr 9 11:27:51 ip-172-31-20-68 NetworkManager[928]: <info> [1617967671.1410] manager: rfkill: Wi-Fi enabled by radio killswitch; enabled by state file
Apr 9 11:27:51 ip-172-31-20-68 NetworkManager[928]: <info> [1617967671.1411] manager: rfkill: WWAN enabled by radio killswitch; enabled by state file
Apr 9 12:04:48 ip-172-31-20-68 kernel: mysqld invoked oom-killer: gfp_mask=0x6200ca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0
Apr 9 12:04:48 ip-172-31-20-68 kernel: oom_kill_process.cold.28+0xb/0x10
Apr 9 12:04:48 ip-172-31-20-68 kernel: oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/system.slice/mariadb.service,task=mysqld,pid=1746,uid=27
Apr 9 12:04:48 ip-172-31-20-68 systemd[1]: mariadb.service: Main process exited, code=killed, status=9/KILL
Apr 9 12:06:04 ip-172-31-20-68 kernel: tuned invoked oom-killer: gfp_mask=0x6200ca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0
Apr 9 12:06:04 ip-172-31-20-68 kernel: oom_kill_process.cold.28+0xb/0x10
Apr 9 12:06:04 ip-172-31-20-68 kernel: oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/user.slice/user-1000.slice/session-3.scope,task=dnf,pid=1982,uid=0
Apr 9 12:08:30 ip-172-31-20-68 kernel: php-fpm invoked oom-killer: gfp_mask=0x6200ca(GFP_HIGHUSER_MOVABLE), order=0, oom_score_adj=0
Apr 9 12:08:31 ip-172-31-20-68 kernel: oom_kill_process.cold.28+0xb/0x10
Apr 9 12:08:31 ip-172-31-20-68 kernel: oom-kill:constraint=CONSTRAINT_NONE,nodemask=(null),cpuset=/,mems_allowed=0,global_oom,task_memcg=/system.slice/mariadb.service,task=mysqld,pid=2126,uid=27
Apr 9 12:08:31 ip-172-31-20-68 systemd[1]: mariadb.service: Main process exited, code=killed, status=9/KILL
OOM 杀手是一个内核函数,它代表当前分配内存的进程进行操作。这可以是选择被杀死以释放内存的同一进程。
选择规则通常选择具有最大匿名内存(即折扣内存映射文件)到物理页面(即折扣被换出或从未被写入的内存)映射的进程。
通常可以以牺牲性能为代价来调整数据库以使用更少的内存,并且我还希望默认调整假设数据库服务器是专用机器并且应该将其所有资源都用于这个单一任务,即不是你在这里做什么。
所以这里有多种途径:
数据库通常擅长适应可用的内存量,并将其用于查询优化器已知的缓存,并且可以作为成本计算的一部分(与操作系统级别的磁盘缓存相反,后者是不可预测的),因此要么限制到某个值,为其他软件留下足够的空间,或者确保没有其他软件需要空间,很好地解决了这个问题。
如果这仍然不够,您将需要更大的虚拟机。
添加交换空间没有帮助,因为它使数据库内部缓存的访问时间不可预测,因此数据库将开始创建次优查询计划,因为它假定数据已缓存并且对内存中副本的访问将比重新加载更快来自磁盘的数据——但是在你为 I/O 付费的虚拟机上交换空间不是一个好主意。