skip to content
Logo Hetai's blog

内核参数drop_cache的使用

/ 5 min read

Table of Contents

零、场景

场景:在进行了大量文件操作之后,缓存会把内存资源基本用光。但实际上我们文件操作已经完成,这部分缓存已经用不到了。此时就需要执行释放内存(清理缓存)的操作了。那么可以使用下面命令进行优化。

一、命令

Terminal window
echo 3 > /proc/sys/vm/drop_cache

该命令会触发内核清除所有缓存(pagecache和slab分配器中的缓存对象),清除完缓存,系统会重新对当下的数据生成缓存。

使用上面命令之前最好运行命令 sync 。因为有数据写入系统或者修改过数据时,比如文字写入文件,输入的数据不会立刻写入硬盘,而是会储存在页面缓存中(page cache),因此清除内存时需要使用sync命令将这些在缓存中的数据写入硬盘,保证数据不丢失。

这些将要写入磁盘但还没写入磁盘的数据也叫脏页,他们存在于缓存中。为什么是脏的呢,我的理解是他被玷污了,玷污就是相对于原文件有新的数据写入,相较于原来就被新数据脏了身子。脏的东西就还需被处理,被洗干净。也就是新的数据还需被写入磁盘。系统会定期将脏页的数据写入磁盘,使用sync命令可以立即将脏页写入磁盘。

所以,可以使用下面的命令,清楚缓存且保证不丢失数据

Terminal window
sync;echo 3 > /proc/sys/vm/drop_cache

二、执行时机

执行sync会让系统性能短暂下降,甚至卡顿,因此需要在服务器负载小的时候执行,例如夜间。

为什么会卡顿?

  1. 强制写入数据:**sync**命令会立即将所有未写入磁盘的缓冲区数据强制写入磁盘。这一过程需要时间,尤其是在数据量较大时,系统需要等待所有数据完成写入才能继续执行其他操作,因此可能导致短暂的延迟。
  2. I/O操作的阻塞:在执行**sync**时,所有相关的输入/输出(I/O)操作会被阻塞,直到写入完成。这意味着在此期间,系统无法处理其他I/O请求。
  3. 磁盘性能:如果磁盘的读写速度较慢,或者当前有其他进程也在进行磁盘操作,命令的执行时间可能会更长。

所以我们应该在服务器负载量小的时候清除缓存,例如在夜间,那么可以使用定时任务crontab来实现定期清理缓存。

  1. crontab -e 命令来编辑当前用户的 crontab 文件
  2. 设置一个每天凌晨 3 点执行清理缓存的定时任务0 3 * * * sync; echo 3 > /proc/sys/vm/drop_caches

三、drop_cache的其他值

drop_caches的值可以是0-3之间的数字,代表不同的含义: 0:不释放(系统默认值) 1:释放页缓存 2:释放dentries和inodes 3:释放所有缓存

drop_caches这个文件不可以持久化村粗数据的,往里写入数字只会触发一次对应的操作,之后系统会自动恢复默认值0。也就是说受用echo 3 > /proc/sys/vm/drop_caches 这个命令释放所有缓存之后,不需要再手动的echo个0进去。

参考:

Linux Page Cache Basics

Linux内存查看及一次释放Linux内存问题处理(Aliyun ecs)