1、Linux的缓存机制

  在Linux系统中,为了提高文件系统性能,内核利用一部分物理内存分配出缓冲区,用于缓存系统操作和数据文件,当内核收到读写的请求时,内核先去缓存区找是否有请求的数据,有就直接返回,如果没有则通过驱动程序直接操作磁盘。

  • 缓存机制优点: 减少系统调用次数,降低CPU上下文切换和磁盘访问频率。

  • CPU上下文切换: CPU给每个进程一定的服务时间,当时间片用完后,内核从正在运行的进程中收回处理器,同时把进程当前运行状态保存下来,然后加载下一个任务,这个过程叫做上下文切换。实质上就是被终止运行进程与待运行进程的进程切换。

  • Swap用途: Swap意思是交换分区,通常我们说的虚拟内存,是从硬盘中划分出的一个分区。当物理内存不够用的时候,内核就会释放缓存区(buffers/cache)里一些长时间不用的程序,然后将这些程序临时放到Swap中,也就是说如果物理内存和缓存区内存不够用的时候,才会用到Swap。

swap清理:

swapoff -a && swapon -a

2、查看缓存区及内存使用情况

free -m  #使用-m参数表示以兆字节(MB)为单位显示内存

查看缓存区以内存使用情况.jpg

解释:

  • total:内存总数;
  • used:已经使用的内存数;
  • free:空闲的内存数;
  • shared:当前已经废弃不用;
  • buff/cache: 缓冲区缓存和页面缓存
  • 计算关系:total = used + free
  • Swap是指交换分区。

其他指令:

# 以字节为单位显示内存,加上-b参数的free命令,以字节为单位显示内存的大小。
free -b
# 定期时间间隔更新内存状态,例如:每5秒刷新一次
free -m -s 5

每5秒更新一次.jpg

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

定时任务文件的路径.jpg

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

定时任务原内容.jpg

在后面追加内容:

0 */2 * * * sh /var/spool/cron/cleancache.sh > /dev/null 2>&1 &

查看是否设置成功:

crontab -l

定时任务设置成功.jpg

保证crond启动

systemctl start crond.service

如果没生效可以尝试重启定时任务保证重新加载

systemctl restart crond

设置crond开机自启

systemctl enable crond.service

最后查看定时任务是否执行

tail -f -n100 /var/log/cron

定时任务执行日志.png

此时再查看缓存,发现缓存已经被清理了

清理之后的缓存大小.jpg

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