Linux服务器内存(cached)释放脚本

上线很久的一个项目突然监控预警系统报警,提示内存达警戒值(使用率达到90%以上预警系统会报警),使用free -m查看,可用内存少的可怜,重启了Java应用,也仅仅释放了2个G的内存,而系统内存是8G,也就是说有其他应用占着。我们都知道,如果Cached的值过大,那么就会导致系统没有可以再分配的内存空间。而Cached是用来缓存文件的,经常读写的文件会被缓存到Cached中,可以增加读写效率,该功能是Linux系统内核提供的(2.6.16以后的核心版本才提供)。由于临近年底,各种数据量突然加大,项目读写频率骤增,这就导致内存不能及时释放,重启服务也达不到目的,那么,有什么办法能够及时清理cached内存呢?我们在测试环境模拟一下这个过程:

清理Cached内存主要用到以下命令:

sync

echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches

上述提示权限不足,那么我们切换到root,执行命令,看下有效无效:

注:一定要先执行sync命令(sync命令能够将所有未写的系统缓冲区写到磁盘中)

可以看到,执行命令以后,Cached明显降低,那么我们总不能每次都手工执行命令吧,所以我们可以写一个shell脚本,用于清理Cached内存,步骤如下:

在root目录下创建一个freemem.sh的脚本:touch freemem.sh,然后vi freemem.sh,编辑内容如下:

#!/bin/bash
used=`free -m | awk 'NR==2' | awk '{print $3}'`
free=`free -m | awk 'NR==2' | awk '{print $4}'`

echo "==========================="
echo "内存使用情况 | [使用了:${used}MB][剩余:${free}MB]"

if [ $free -le 200 ] ; then
                sync && echo 1 > /proc/sys/vm/drop_caches
                sync && echo 2 > /proc/sys/vm/drop_caches
                sync && echo 3 > /proc/sys/vm/drop_caches
                echo "清理Cached成功"
else
                echo "不需要清理"
fi
exit

如果觉得手动执行麻烦,那么加入Linux Crontab 定时任务,定时执行即可。

发布了185 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_39309402/article/details/102719104