我们在使用linux系统时经常会使用free -m 来查看linux内存剩余的大小,比如
这里看到空闲的内存大小已经非常小只剩88M,首先看下各个字段的解释:
total: 系统中的可用物理内存used: 已使用的物理内存free: 剩余多少物理内存可用shared: 共享使用的物理内存buff/cache: buffer 和 cache 使用的物理内存available: 可被回收的内存linux系统在运行时,free剩余屋里内存会在一个稳定值运行,看上去可能比较小。那么真实的剩余内存数量是多少?
这里可以简单理解为available是真的剩余内存,粗略计算也就是free + buff/cache的值,这个值会比available略高,available值是减去了不可回收的内存。
这样运行是没有问题的,但是当某个程序需要一整块物理内存时,这时候就会申请不到可以的内存,此时我们就需要来释放内存,以便于后续的程序运行,可以使用如下命令来回收内存,在执行前需要使用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中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收,所以尽量在空闲时来执行。
我们也可以内存剩余定义一个阈值比如剩余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今天就写这么多,喜欢大叔的可以关注我哦_