linux系统运维之,你知道linux真实剩余内存吗?回收?

117人浏览   2024-06-05 21:46:45


我们在使用linux系统时经常会使用free -m 来查看linux内存剩余的大小,比如

内存使用

这里看到空闲的内存大小已经非常小只剩88M,首先看下各个字段的解释:

  • total: 系统中的可用物理内存
  • used: 已使用的物理内存
  • free: 剩余多少物理内存可用
  • shared: 共享使用的物理内存
  • buff/cache: buffer 和 cache 使用的物理内存
  • available: 可被回收的内存

Linux真实剩余内存

linux系统在运行时,free剩余屋里内存会在一个稳定值运行,看上去可能比较小。那么真实的剩余内存数量是多少?

这里可以简单理解为available是真的剩余内存,粗略计算也就是free + buff/cache的值,这个值会比available略高,available值是减去了不可回收的内存。

linux内存回收

这样运行是没有问题的,但是当某个程序需要一整块物理内存时,这时候就会申请不到可以的内存,此时我们就需要来释放内存,以便于后续的程序运行,可以使用如下命令来回收内存,在执行前需要使用sysn先将内存数据回写到磁盘。

echo 1 > /proc/sys/vm/drop_caches
#表示清除pagecache。
echo 2 > /proc/sys/vm/drop_caches
#清除回收slab分配器中的对象
echo 3 > /proc/sys/vm/drop_caches
#表示清除pagecache和slab分配器中的缓存对象。

在回收内存时,系统IO会升高,此时内核在对比cache中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收,所以尽量在空闲时来执行。

清理内存shell脚本

定时检查自动回收内存

我们也可以内存剩余定义一个阈值比如剩余20%时,脚本在晚上某个时间段或者空闲时段来执行内存回收。

#!/bin/bash 

MEM_TOTAL=`free -m |grep Mem: | awk '{print  $2}'` 
MEM_FREE=`free -m |grep Mem: | awk '{print  $4}'` 
MEM_USE=`free -m |grep Mem: | awk '{print  $3}'` 

if [ $MEM_USE -gt 0 ]; then 
    MEM_PRO=0`echo "scale=2;$MEM_FREE/$MEM_TOTAL" | bc` 
    echo "$(date) free proportion $MEM_PRO" >>/var/log/mem.log
    mem_threshold='0.20'
    mem_now=`expr $MEM_PRO \> $mem_threshold` 
    if [ $mem_now -eq 0 ]; then 
        sync 
        sync 
        echo 1 > /proc/sys/vm/drop_caches 
        echo 2 > /proc/sys/vm/drop_caches 
        echo 3 > /proc/sys/vm/drop_caches
    fi
fi


相关推荐