实例内存使用率过高

本页目录:

现象描述

Linux 云服务器实例出现由内存问题引发的故障。例如,系统内部服务响应速度变慢、服务器登录不上、系统触发 OOM(Out Of Memory)等。

可能原因

可能是实例内存使用率过高等问题引起。通常情况下当实例内存使用率持续高于90%时,可判断为实例内存使用率过高。

排查思路

  1. 参考 处理步骤,判断问题是否由内存使用率过高引起。
  2. 参考 其他内存问题典型案例分析,定位问题原因。

处理步骤

  1. 参考 相关操作,查看内存使用率是否过高。
  1. 在系统内部执行 top 命令后按 M,查看 “RES” 及 “SHR” 列是否有进程占用内存过高。
  • 否,则执行下一步。
  • 是,则对应进程类型进行操作,详情请参见 分析进程
  1. 执行以下命令,查看共享内存占用是否过高。
/proc/meminfo | grep -i shmem

返回结果如下图所示:

服务器内存减少 docker服务挂了 服务器内存问题_云服务

  1. 执行如下命令,查看不可回收的 slab 内存占用是否过高。
/proc/meminfo | grep -i SUnreclaim

返回结果如下图所示:

服务器内存减少 docker服务挂了 服务器内存问题_服务器内存减少 docker服务挂了_02

  1. 执行以下命令,查看是否存在内存大页。
/proc/meminfo | grep -iE  "HugePages_Total|Hugepagesize"

返回结果如下图所示:

服务器内存减少 docker服务挂了 服务器内存问题_云服务_03

  • HugePages_Total 输出为0,则请参考 其他内存问题典型案例分析,进一步定位问题原因。
  • HugePages_Total 输出非0,则表示配置了内存大页。内存大页的大小为 HugePages_Total*Hugepagesize, 您需确认 hugepage 是否为其他恶意程序配置。若确认已不需要内存大页,可通过注释 /etc/sysctl.conf 文件中的 vm.nr_hugepage 配置项,再执行 sysctl -p 命令取消内存大页。

相关操作

查看内存使用率

由于不同 Linux 发行版的 free 命令输出的含义可能有区别,内存使用率不能通过简单的 free 命令输出信息进行计算得出。请按照以下步骤,通过腾讯云内存监控得到内存使用率:

  1. 登录 云服务器控制台,进入实例管理页面。
  2. 选择实例 ID,进入实例详情页面,并选择【监控】页签。
  3. 在“内存监控”中可查看该实例的内存利用率。如下图所示:

计算内存使用率

内存监控中内存使用率计算方法为:用户使用的内存量与总内存量之比,不包括缓冲区与系统缓存占用的内容。计算过程如下:
= (Total - available)100% / Total = (Total - (Free + Buffers + Cached + SReclaimable - Shmem))100% /Total = (Total - Free - Buffers - Cached - SReclaimable + Shmem)* 100% / Total

计算过程中使用的 TotalFreeBufferCachedSReclaimableShmem 参数可从 /proc/meminfo 中获取。/proc/meminfo 示例如下:

1. [root@VM_0_113_centos test]# cat /proc/meminfo
2. MemTotal: 16265592 kB
3. MemFree: 1880084 kB
4. ......
5. Buffers: 194384 kB
6. Cached: 13647556 kB
7. ......
8. Shmem: 7727752 kB
9. Slab: 328864 kB
10. SReclaimable: 306500 kB
11. SUnreclaim: 22364 kB
12. ......
13. HugePages_Total: 0
14. Hugepagesize: 2048 kB

参数说明如下:

参数

说明

MemTotal

系统总内存。

MemFree

系统剩余内存。

Buffers

表示块设备(block device)所占用的缓存页,包括直接读写块设备,以及文件系统元数据(metadata),例如 SuperBlock 所使用的缓存页。

Cached

page cache,包含 tmpfs 中的文件 POSIX/SysV shared memoryshared anonymous mmap

Shmem

包括共享内存,tmpfs 等。

Slab

内核 slab 分配器分配的内存,可以用 slabtop 查看。

SReclaimable

可回收的 slab。

SUnreclaim

不可回收的 slab。

HugePages_Total

内存大页总共的页数。

Hugepagesize

内存大页一页的大小。

 

实例内存未耗尽时触发 Out Of Memory

本页目录:

现象描述

Linux 云服务器在内存使用率未占满的情况下触发了 OOM(Out Of Memory)。如下图所示:

服务器内存减少 docker服务挂了 服务器内存问题_服务器内存减少 docker服务挂了_04

可能原因

可能是由系统可用内存低于 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,则系统会自动重启。

解决思路

  1. 参考 处理步骤 进行排查,查看实例内存使用率是否过高及总线程数是否受限。
  2. 核实 min_free_kbytes 值设置,并修改为正确配置。

处理步骤

  1. 参考 内存使用率过高问题处理 ,查看实例是否内存使用率过高。若实例内存使用率正常,则执行下一步。
  2. 参考 日志报错 fork:Cannot allocate memory,核实线程数是否超限。若总线程数未超限,则执行下一步。
  3. 登录云服务器,执行以下命令查看 min_free_kbytes 值。

sysctl -a | grep min_free

min_free_kbytes 值单位为 kbytes,下图所示 min_free_kbytes = 1024000 即为1GB。

服务器内存减少 docker服务挂了 服务器内存问题_云服务_05

  1. 执行以下命令,使用 VIM 编辑器打开 /etc/sysctl.conf 配置文件。

vim /etc/sysctl.conf

  1. i 进入编辑模式,修改 vm.min_free_kbytes 配置项。

说明:

建议修改 vm.min_free_kbytes 值为不超过总内存的1%即可。

  1. Esc 并输入 :wq 后,按 Enter 保存并退出 VIM 编辑器。
  2. 执行以下命令,使配置生效即可。

sysctl -p

详细内容:https://cloud.tencent.com/document/product/213/54644