Linux下清理系统缓存、非交互式编辑计划任务

2021-09-17   


Linux下清理系统缓存并释放内存

查看内存命令:free -h

[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:          1.7Gi       940Mi       554Mi       1.0Mi       218Mi       633Mi
Swap:         2.0Gi       0.0Ki       2.0Gi

各参数含义:
total:总物理内存
used:已使用内存
free:完全未被使用的内存
shared:应用程序共享内存
buffers:缓存,主要用于目录方面,inode值等
cached:缓存,用于已打开的文件
-buffers/cache:应用程序使用的内存大小,used减去缓存值
+buffers/cache:所有可供应用程序使用的内存大小,free加上缓存值

其中:
total = used + free
-buffers/cache=used-buffers-cached,这个是应用程序真实使用的内存大小
+buffers/cache=free+buffers+cached,这个是服务器真实还可利用的内存大小

Linux系统的缓存机制是相当先进的,他会针对dentry(用于VFS,加速文件路径名到inode的转换)、Buffer Cache(针对磁盘块的读写)和Page Cache(针对文件inode的读写)进行缓存操作。但是在进行了大量文件操作之后,缓存会把内存资源基本用光。但实际上我们文件操作已经完成,这部分缓存已经用不到了。这个时候,我们就需要清理系统缓存了

注意:并不是什么时候都需要清除RAM缓存的,大家都知道,linux查找数据都是优先从RAM缓存中查找的,一旦清空缓存,所有的数据都需要从磁盘读取,所以只在需要的时候清空缓存,才是正确的选择

要达到释放缓存的目的,我们首先需要了解下关键的配置文件/proc/sys/vm/drop_caches。这个文件中记录了缓存释放的参数,默认值为0,也就是不释放缓存。它的值可以为0~3之间的任意数字,代表着不同的含义:

0 – 不释放

1 – 释放Page Cache缓存

2 – 释放dentries和inodes

3 – 释放所有缓存

关于drop_caches的官方说明如下:

Writing to this file causes the kernel to drop clean caches,dentries and inodes from memory, causing that memory to becomefree.
To free pagecache, use echo 1 > /proc/sys/vm/drop_caches;
to free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
to free pagecache, dentries and inodes, use echo 3 >/proc/sys/vm/drop_caches.
Because this is a non-destructive operation and dirty objects are not freeable, the user should run sync first

在说明里有写,对drop_caches写入值将会在不杀死任何应用服务的情况下清空缓存。但我们在清理缓存先要先把buffe中的数据先写入到硬盘中,使用sync命令,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件

下面就是清理缓存的脚本:

[root@localhost ~]# vim drop_caches.sh
#!/bin/bash
#内存清理脚本
sync;echo 1 > /proc/sys/vm/drop_caches
sync;echo 2 > /proc/sys/vm/drop_caches
sync;echo 3 > /proc/sys/vm/drop_caches

#清除交换空间
sync && swapoff -a && swapon -a

#打印提示信息
printf '\n%s\n' 'Ram-cache and Swap Cleared'

非交互模式写入crontab定时任务

crond是计划任务服务,一般我们在系统设置计划任务的时候都是使用crontab -e交互式编辑指令。但如果我们需要将计划任务写入脚本进行批量化插入的话,就需要用到非交互模式

结合上面刚编辑的清理内存脚本,非交互式写一个每天凌晨执行一次的计划任务,如下:

#非交互式编辑计划任务,每天0点0分的时候执行drop_caches.sh脚本
[root@localhost ~]# (crontab -l;echo "0 0 * * * /bin/bash /root/drop_caches.sh > /dev/null 2>&1") | crontab

#查看计划任务是否写入
[root@localhost ~]# crontab -l

#非交互式删除执行drop_caches.sh的计划任务
[root@localhost ~]# crontab -l | grep -v "drop_caches.sh" | crontab

Q.E.D.