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

我们在使用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