CentOS7 定时任务清理缓存
1、Linux的缓存机制
在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。
-
缓存机制优点: 减少系统调用次数,降低CPU上下文切换和磁盘访问频率。
-
CPU上下文切换: CPU给每个进程一定的服务时间,当时间片用完后,内核从正在运行的进程中收回处理器,同时把进程当前运行状态保存下来,然后加载下一个任务,这个过程叫做上下文切换。实质上就是被终止运行进程与待运行进程的进程切换。
-
Swap用途: Swap意思是交换分区,通常我们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临时放到Swap中,也就是说如果物理内存和缓存区内存不够用的时候,才会用到Swap。
swap清理:
swapoff -a && swapon -a
2、查看缓存区及内存使用情况
free -m #使用-m参数表示以兆字节(MB)为单位显示内存
解释:
- total:内存总数;
- used:已经使用的内存数;
- free:空闲的内存数;
- shared:当前已经废弃不用;
- buff/cache: 缓冲区缓存和页面缓存
- 计算关系:total = used + free
- Swap是指交换分区。
其他指令:
# 以字节为单位显示内存,加上-b参数的free命令,以字节为单位显示内存的大小。
free -b
# 定期时间间隔更新内存状态,例如:每5秒刷新一次
free -m -s 5
3、 /proc 目录
/proc:这个目录本身是一个虚拟文件系统。他放置的数据都是在内存当中,例如系统内核、进程、外部设备的状态及网络状态等。我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段,也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。那么我们可以通过调整 /proc/sys/vm/drop_caches 来释放内存,/proc/sys/vm/drop_caches 中的默认值为 0,值为 3 时可以释放所有缓存。
我们在清理缓存前应该先用 sync 命令
因为系统在操作的过程当中,会把你的操作到的文件资料先保存到buffer中去,因为怕你在操作的过程中因为断电等原因遗失数据,所以在你操作过程中会把文件资料先缓存。所以我们在清理缓存先要先把 buffe 中的数据先写入到硬盘中,sync命令
sync #同步数据到硬盘
echo 3 > /proc/sys/vm/drop_caches #清除缓存
参数:
- 0 – 不释放
- 1 – 释放页缓存 (数字1是用来清空最近访问过的文件页面缓存)
- 2 – 释放dentries和inodes (数字2是用来清空文件节点缓存和目录项缓存)
- 3 – 释放所有缓存 (数字3是用来清空1和2所有内容的缓存。)
ps:值越高系统上的程序会跑起来越慢
页缓存
Linux内核会将它最近访问过的文件页面缓存在内存中一段时间,这个文件缓存被称为pagecache。dentries表示目录的数据结构,inodes表示文件的数据结构,包含了各文件相关的一些重要信息。在创建文件系统时,就会同时创建大量的inode。
4、定时任务清除缓存脚本
每次都要手动执行 echo 3 > /proc/sys/vm/drop_caches
清除缓存比较麻烦,所以可以设置Linux的定时任务来自动清除缓存。
1、找到统一存放定时任务的路径
cd /var/spool/cron
2、创建清除缓存的脚本文件 cleancache.sh
vim cleancache.sh
内容如下:
#!/bin/bash
#每两小时清除一次缓存
echo "开始清理缓存"
sync;sync;sync #写入硬盘,防止数据丢失
sleep 10 #延迟10秒
echo 3 > /proc/sys/vm/drop_caches
echo "清理结束"
给脚本设置执行权限:
chmod +x cleancache.sh
3、设置定时任务,每隔2小时运行一次
编写定时任务
crontab -e
在后面追加内容:
0 */2 * * * sh /var/spool/cron/cleancache.sh > /dev/null 2>&1 &
查看是否设置成功:
crontab -l
保证crond启动
systemctl start crond.service
如果没生效可以尝试重启定时任务保证重新加载
systemctl restart crond
设置crond开机自启
systemctl enable crond.service
最后查看定时任务是否执行
tail -f -n100 /var/log/cron
此时再查看缓存,发现缓存已经被清理了
ps:为了方便观察定时任务是否被执行,可以先暂时将定时任务设置为一分钟执行一次 */1 * * * *
,执行成功后再调回2小时执行一次
4、时间格式
f1 f2 f3 f4 f5 program
其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。
- 当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,以此类推
- 当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,以此类推
- 当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,以此类推
- 当 f1 为 a, b, c,… 时表示第 a, b, c,… 分钟要执行,f2 为 a, b, c,… 时表示第 a, b, c…个小时要执行,以此类推
* * * * *
- - - - -
| | | | |
| | | | +----- 星期中星期几 (0 - 6) (星期天 为0)
| | | +---------- 月份 (1 - 12)
| | +--------------- 一个月中的第几天 (1 - 31)
| +-------------------- 小时 (0 - 23)
+------------------------- 分钟 (0 - 59)
5、常见表达式
# 每天,每5分钟执行一次 myshell.sh脚本
*/5 * * * root /data/myshell.sh
# 每天凌晨二点,执行命令脚本,这里由于第一个的分钟没有设置,那么就会每天凌晨2点的每分钟都执行一次命令
* 2 * * * root /data/myshell.sh
# 每天凌晨二点整执行一次命令脚本
0 2 * * * root /data/myshell.sh
# 每天11点到13点之间,每10分钟执行一次命令脚本
*/10 11-13 * * * root /data/myshell.sh
# 每小时的10-30分钟,每分钟执行一次命令脚本,共执行20次
10-30 * * * * root /data/myshell.sh
# 每小时的10,30分钟,分别执行一次命令脚本,共执行2次
10,30 * * * * * root /data/myshell.sh
# 周一到周五每天的9点到14点,每5min执行一次python脚本
*/5 9-14 * * 1-5 /root/gold.py
# 周一到周五的15点到15点35分,每5min执行一次python脚本
0-35/5 15 * * 1-5 /root/gold.py