Linux available 占大量内存

问题分析

1、内存不足,先查看实际内存使用情况

#free -m
total        used        free      shared  buff/cache   available
Mem:           3648         331        2837           8         479         503
Swap:             0           0           0

可以看到总内存3648MB,已使用331MB,剩余物理内存是2837MB,但是available内存为503MB。

可用内存的理解:

  • free: 尚未被使用的物理内存
  • available: 是应用程序可申请的内存。

一般情况下 available = free + buff + cache,但现在内存的数据明显是不符合上述公式的。那么什么情况下会出现available小于free呢?

lInux系统中有两种内存是不被计算在available中的,分别是:

  • hugepage 大页
  • min_free_kbytes 操作系统最小保留内存

2、hugepage大页

查看服务器的大页参数配置
#cat /proc/meminfo | grep Huge
AnonHugePages:         0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB

可以看到当前系统的页大小为2048kb,相对比较小。

内核参数

#sysctl vm.nr_hugepeages
sysctl: cannot stat /proc/sys/vm/nr_hugepeages: No such file or directory

内核参数也没有配置大页。

3、min_free_kbytes 操作系统最小保留内存

#sysctl vm.min_free_kbytes
vm.min_free_kbytes = 2097152

可以看到系统设置的最小预留内存大小为2097125kb,即2GB,占系统总内存的50%左右,相当于任何时候,系统会保留50%的内存已备不时之需,防止系统oom奔溃。

解决方案

调小 min_free_kbytes 参数值,调整为系统内存的15%-20%合理区间

echo 629145 > /proc/sys/vm/min_free_kbytes
sysctl -p

这个问题描述的是在Linux系统中,可用内存(available memory)数量很大,接近于总内存数量。这通常不是一个错误,而是Linux内核的一个特性,它尝试保持一定的内存缓存,以便加速后续的程序启动和运行。

如果你的系统经常需要交换内存(swap),或者你希望减少available内存数,以便更准确地估计系统当前可以直接使用的内存量,你可以通过调整系统参数来实现。

解决方法:

如果你想减少 available 内存,可以通过设置vm.min_free_kbytes参数来减少内核保留的最小内存量。这可以通过sysctl命令来完成:

sudo sysctl -w vm.min_free_kbytes=250000

这个命令将最小可用内存设置为250000KB。你可以根据系统的实际需求调整这个值。

另一种方法是通过调整vm.vfs_cache_pressure参数来调节内核的内存回收行为。这个参数决定了内核在回收内存时,优先考虑缓存哪种类型的对象。设置为0会优先考虑缓存Dirty和Mapped对象,设置为100会优先考虑缓存文件页,这可以通过以下命令进行设置:

sudo sysctl -w vm.vfs_cache_pressure=50

请注意,调整这些参数可能会影响系统性能,因此需要根据实际情况谨慎操作。

作者:Jeebiz  创建时间:2024-08-06 17:30
最后编辑:Jeebiz  更新时间:2024-11-01 12:20