Linux释放内存方法

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

一、free

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

wKioL1h9skSw3bIXAAA5p8NzKxw573.jpg

其中:
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_caches
0
首先,/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_caches
3
将/proc/sys/vm/drop_caches值设为3

三、脚本文件

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

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

wKioL1h9ssyB9bqLAAGZnFt15d8895.jpg


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章