最近工作中出现一个问题就是在软件服务运行20多天左右就会将内存耗尽,导致软件无法起来,服务无法进行,只能将软件关闭一段时间后,或者将系统重启,才能运行,而这也不是最终的解决方法,因为运行20多天后,内存会又继续耗尽。目前还在寻找解决思路中,目前的方法是定时清除缓存。因此有了这篇文章。

一、free

先来说说free命令:# free -m

b3b666c6544d1cea4c1bdf42f7a2c693.png

其中:total 内存总数used 已经使用的内存数free 空闲的内存数shared 多个进程共享的内存总额buffers buffer Cache和cached Page Cache 磁盘缓存的大小-buffers/cache (已用)的内存数:used - buffers - cached+buffers/cache(可用)的内存数:free + buffers + cached可用的memory=free memory+buffers+cached

为了提高磁盘存取效率,Linux做了一些精心的设计,除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。那么有人说过段时间,linux会自动释放掉所用的内存。等待一段时间后,我们使用free再来试试,看看是否有释放?根据我的观察,cache内容是没有被释放的。

二、手动释放cache

/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与Kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。那么我们可以通过调整/proc/sys/vm/drop_caches来释放内存。操作如下:

# cat /proc/sys/vm/drop_caches0首先,/proc/sys/vm/drop_caches的值,默认为0。

# sync手动执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-Node、已延迟的块 I/O 和读写映射文件)

# echo 3 > /proc/sys/vm/drop_caches# cat /proc/sys/vm/drop_caches3将/proc/sys/vm/drop_caches值设为3

三、脚本文件

#!/bin/shcaches_num=$(free|grep Mem|awk  '{ print $7 }')echo $caches_numif [ $caches_num -gt  10000000 ] ; then{syncecho "sync done!"echo 3 > /proc/sys/vm/drop_caches}fi

然后通过crontab设置定时任务,进行脚本的执行。定时释放cache。

230beae32bfa0d75703efffb7da20178.png

Logo

更多推荐