使用Linux 云服务器过程中可能发生因内存占用过多而引发的故障,如系统内部的服务响应缓慢,服务器连接不上,出发OOM等。当Linux 云服务器内存使用了持续高于90%时,就会被判断为内存使用率过高。确定Linux 云服务器的故障是因为内存使用率过高,怎么解决?
在系统内部执行 top 命令后按 M,查看 RES 及 SHR 列是否有进程占用内存过高。
如果内存过高,执行以下命令,查看共享内存占用是否过高。
cat /proc/meminfo | grep -i shmem
返回结果:
[root@
/****
~]#t cat /proc/meminfo |grep -i shmem
Shmem :****556 kB
执行以下命令,查询不可回收的 slab 内存占用是否过高。
cat /proc/meminfo | grep -i SUnreclaim
返回结果:
[root@
****
~]# cat /proc/meminfo |grep -i sUnreclaim
sUnreclaim: 13780 kB
执行以下命令查看是否存在内存大页:
cat /proc/meminfo | grep -iE "HugePages_Total|Hugepagesize"
返回结果中HugePages_Total 输出为0,是存在其他内存问题,需要进一步定位问题原因。
HugePages_Total 输出非0,表示配置了内存大页。内存大页的大小为 HugePages_Total*Hugepagesize, 您需确认 hugepage 是否为其他恶意程序配置。若确认已不需要内存大页,可通过注释 /etc/sysctl.conf 文件中的 vm.nr_hugepage 配置项,再执行 sysctl -p 命令取消内存大页。
当实例内存未耗尽但是却触发了OOM,可能原因是内存使用率过高,进程数超限,系统可用内存低于 min_free_kbytes 值。检查内存占用率过高可参照上文方法,如果是进程数超限,先登录华纳云云服务器执行以下命令查看min_free_kbytes 值。
sysctl -a | grep min_free
min_free_kbytes 值单位为 kbytes,如下所示 min_free_kbytes = 1024000 即为1GB。
[root@****
]# sysctl -a
:grep
min_free
m.min_free kbytes = 124000
执行以下命令,使用 VIM 编辑器打开 /etc/sysctl.conf 配置文件。
vim /etc/sysctl.conf
按i进入编辑模式,修改vm.min_free_kbytes 配置项。若该配置项不存在,则直接在配置文件中增加即可。最好修改vm.min_free_kbytes 值不超过总内存的1%即可。
按ESC并输入:wq,按Enter保存推出vim编辑器。执行以下命令,使配置生效即可。
sysctl -p
检查系统可用内存是否低于 min_free_kbytes 值
可能是由系统可用内存低于 min_free_kbytes 值导致。min_free_kbytes 值表示强制 Linux 系统最低保留的空闲内存(Kbytes),如果系统可用内存低于设定的 min_free_kbytes 值,则默认系统启动 oom-killer 或强制重启。
具体行为由内核参数 vm.panic_on_oom 值决定:
若 vm.panic_on_oom=0,则系统会提示 OOM,并启动 oom-killer 消除占用最高内存的进程。
若 vm.panic_on_oom =1,则系统会自动重启。