Linux 内存问题
Linux 内存问题
1 内存使用率过高
现象描述
Linux 云服务器实例出现由内存问题引发的故障。例如,系统内部服务响应速度变慢、服务器登录不上、系统触发 OOM(Out Of Memory)等。
可能原因
可能是实例内存使用率过高等问题引起。通常情况下当实例内存使用率持续高于90%时,可判断为实例内存使用率过高。
处理步骤
- 参考 相关操作,查看内存使用率是否过高。
- 内存使用率过高,则执行下一步。
- 内存使用率正常,则请参考 其他内存问题典型案例分析,进一步定位问题原因。
- 在系统内部执行
top
命令后按 M,查看 “RES” 及 “SHR” 列是否有进程占用内存过高。- 否,则执行下一步。
- 是,则对应进程类型进行操作,详情请参见 分析进程。
- 执行以下命令,查看共享内存占用是否过高。
- 返回结果如下图所示:
- 执行如下命令,查看不可回收的 slab 内存占用是否过高。
cat /proc/meminfo | grep -i SUnreclaim
- 执行以下命令,查看是否存在内存大页。
HugePages_Total
输出为0,则请参考 其他内存问题典型案例分析,进一步定位问题原因。HugePages_Total
输出非0,则表示配置了内存大页。内存大页的大小为HugePages_Total*Hugepagesize
, 您需确认 hugepage 是否为其他恶意程序配置。若确认已不需要内存大页,可通过注释/etc/sysctl.conf
文件中的vm.nr_hugepage
配置项,再执行sysctl -p
命令取消内存大页。
计算内存使用率
内存监控中内存使用率计算方法为:用户使用的内存量与总内存量之比,不包括缓冲区与系统缓存占用的内容。计算过程如下:
= (Total - available)100% / Total
= (Total - (Free + Buffers + Cached + SReclaimable - Shmem))100% /Total
= (Total - Free - Buffers - Cached - SReclaimable + Shmem)* 100% / Total
计算过程中使用的 Total
、Free
、Buffer
、Cached
、SReclaimable
、Shmem
参数可从 /proc/meminfo
中获取。
参数说明如下:
参数 | 说明 |
---|---|
MemTotal |
系统总内存。 |
MemFree |
系统剩余内存。 |
Buffers |
表示块设备(block device)所占用的缓存页,包括直接读写块设备,以及文件系统元数据(metadata),例如 SuperBlock 所使用的缓存页。 |
Cached |
page cache,包含 tmpfs 中的文件 POSIX/SysV shared memory 及 shared anonymous mmap 。 |
Shmem |
包括共享内存,tmpfs 等。 |
Slab |
内核 slab 分配器分配的内存,可以用 slabtop 查看。 |
SReclaimable |
可回收的 slab。 |
SUnreclaim |
不可回收的 slab。 |
HugePages_Total |
内存大页总共的页数。 |
Hugepagesize |
内存大页一页的大小 |
2 内存未耗尽时触发 Out Of Memory
现象描述
Linux 云服务器在内存使用率未占满的情况下触发了 OOM(Out Of Memory)。如下图所示:
可能原因
可能是由系统可用内存低于 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
,则系统会自动重启。
解决思路
- 参考 处理步骤 进行排查,查看实例内存使用率是否过高及总进程数是否受限。
- 核实
min_free_kbytes
值设置,并修改为正确配置。
- 登录云服务器,执行以下命令查看
min_free_kbytes
值。
min_free_kbytes
值单位为 kbytes,下图所示min_free_kbytes = 1024000
即为1GB。 - 执行以下命令,使用 VIM 编辑器打开
/etc/sysctl.conf
配置文件。
- 按 i 进入编辑模式,修改
vm.min_free_kbytes
配置项。若该配置项不存在,则直接在配置文件中增加即可。说明建议修改
vm.min_free_kbytes
值为不超过总内存的1%即可。 - 按 Esc 并输入 :wq 后,按 Enter 保存并退出 VIM 编辑器。
- 执行以下命令,使配置生效即可。