linux云服务器内存使用率还没占满时,触发了Out Of Memory,可能原因有哪些?如何解决?
这种情况可能是因为内存占用过高、进程数超限、系统可用内存低于 min_free_kbytes 值等。先逐一排除再来找出实际解决方法。
先检查是否存在内存使用率过高。执行以下命令看共享内存是否使用过高:
cat /proc/meminfo | grep -i shmem
查看不可回收的slab内存占用情况:
cat /proc/meminfo | grep -i SUnreclaim
查找是否存在内存大页:
cat /proc/meminfo | grep -iE "HugePages_Total|Hugepagesize"
如果HugePages_Total 输出非0,表示配置了内存大页。内存大页的大小为 HugePages_Total*Hugepagesize, 您需确认 hugepage 是否为其他恶意程序配置。若确认已不需要内存大页,可通过注释 /etc/sysctl.conf 文件中的 vm.nr_hugepage 配置项,再执行 sysctl -p 命令取消内存大页。
如果通过上述检查发现内存使用率正常,继续检查进程数是否超限。
sysctl -a | grep min_free
min_free_kbytes 值单位为 kbytes,如min_free_kbytes = 1024000 即为1GB。
执行以下命令,使用 VIM 编辑器打开 /etc/sysctl.conf 配置文件:
vim /etc/sysctl.conf
按i进入编辑模式,修改 vm.min_free_kbytes 配置项。若该配置项不存在,则直接在配置文件中增加即可(建议修改 vm.min_free_kbytes 值为不超过总内存的1%)。
按Esc并输入:wq,按Enter保存并推出VM编辑器。执行以下命令,使配置生效:
sysctl -p
min_free_kbytes 值表示强制linux系统最低保留的空间内存,查询linux系统是否存在低于min_free_kbytes 值,如果存在这样情况则系统默认启动oom-killer或强制重启。具体情况由内核参数vm.panic_on_oom 值决定:
如果vm.panic_on_oom=0,
则系统会提示 OOM,并启动 oom-killer 杀掉占用最高内存的进程。
反之,vm.panic_on_oom =1,
则系统会自动重启。华纳云提供带宽、磁盘等使用情况监控服务,登录官网个人管理后台即可使用。