我们可以使用下面这个文件来人工触发缓存清除的操作,Linux 提供了三种清空方式:
echo 1 > /proc/sys/vm/drop_caches
# 仅清除页面缓存echo 2 > /proc/sys/vm/drop_caches
# 清除目录项和inodeecho 3 > /proc/sys/vm/drop_caches
# 清除页面缓存、目录项以及inode
sync
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
但是这种放时只能在执行的当时起作用,过一段时间之后又会发现内存被占满,怎么办呢?
一键脚本调整:
curl -sS -O https://raw.githubusercontent.com/woniu336/open_shell/main/adjust.sh && chmod +x adjust.sh && ./adjust.sh
查看当前 vm.vfs_cache_pressure
的值:
sysctl vm.vfs_cache_pressure
重新加载 sysctl 配置文件以使更改生效
sudo sysctl -p
在Linux 2.6
之后Linux将他们统一合并到了Page cache
作为文件层的缓存。而buffer
则被用作block
层的缓存。block
层的缓存是什么意思呢,你可以认为一个buffer
是一个physical disk block
在内存的代表,用来将内存中的pages
映射为disk blocks
,这部分被使用的内存被叫做buffer
。
buffer
里面的pages
,指的是Page cache
中的pages
,所以,buffer
也可以被认为Page cache
的一部分。
或者简单来说,buffer
负责裸设备相关的缓存,cache
负责文件系统的缓存。
Buffer 的具体职责
在当前的系统实现里,buffer
主要是设计用来在系统对块设备进行读写时作为缓存来使用。这意味着对块的操作会使用buffer
进行缓存,比如我们在格式化文件系统的时候。
但是一般情况下两个缓存系统是一起配合使用的,比如当我们对一个文件进行写操作的时候,cache
的内容会被改变,而buffer
则用来将cache
的page
标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。
这样,内核在后续执行脏数据的回写(writeback
)时,就不用将整个page
写回,而只需要写回修改的部分即可。
Cache 的具体职责
cache
主要用来作为文件系统上的文件数据的缓存来用,当进程对文件有read/write
操作的时候。包括将文件映射到内存的系统调用mmap
,就会用到cache
。
因为cache
被作为文件类型的缓存来用,所以事实上也负责了大部分的块设备文件的缓存工作。
怎么回收 buff/cache?
Linux内核会在内存将要耗尽的时候,自动触发内存回收的工作,以便释放出内存给急需内存的进程使用。
但是这种回收的工作也并不是没有成本。
理解cache
是干什么的就知道,cache
中存在着一部分write
操作的数据。所以必须保证cache
中的数据跟对应文件中的数据一致,才能对cache
进行释放。
于是伴随着cache
清除的行为的,一般都是系统IO
飙高。这是因为内核要将cache
中缓存的write
数据进行回写。