Linux 手动清除缓存 drop_cahces

Posted by Sunday on 2018-10-15

为了提高磁盘存取效率,Linux做了一些精心的设计,除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。

1
2
3
4
# free -h
total used free shared buff/cache available
Mem: 15G 5.6G 721M 31M 9.3G 8.7G
Swap: 15G 3.5G 12G

一般来说使用者是不需要去管这些缓存何时会被清除的。但如有需求使用/proc/sys/vm/drop_caches可以强制内核清理缓存。

/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段。也就是说可以通过修改/proc中的文件,来对当前kernel的行为做出调整。

写入1,清除 pagecache

1
# sync;echo 1 > /proc/sys/vm/drop_caches

写入2,清除 dentries 与 inodes

1
# sync;echo 2 > /proc/sys/vm/drop_caches

写入3,清除 dentries 与 inodes 及 inodes (危险)

1
# sync;echo 3 > /proc/sys/vm/drop_caches

基本上执行这个指令没有什么好处,所以除非你很明确知道你想干嘛(例如这边是为了避免缓存影响实验结果),否则建议不要随便手动清除快取记忆体。另外,也建议在做这个 动作前先执行sync让档案写入操作先完成,否则可能会造成意想不到的结果。

/proc/sys/vm/drop_caches 预设的值是0,只有echo 1 > /proc/sys/vm/drop_caches 才会触发对应的清理工作,仅执行一次而已。

1
2
3
4
5
# sync;echo 1 > /proc/sys/vm/drop_caches 
# free -h
total used free shared buff/cache available
Mem: 15G 5.6G 5.4G 31M 4.6G 9.0G
Swap: 15G 3.5G 12G