Hugo博客公告弹窗

Linux buffer/cache 内存占用过高的原因以及解决办法

   
文章摘要
摘要小助理今天溜号啦……😜

我们可以使用下面这个文件来人工触发缓存清除的操作,Linux 提供了三种清空方式:

  1. echo 1 > /proc/sys/vm/drop_caches # 仅清除页面缓存
  2. echo 2 > /proc/sys/vm/drop_caches # 清除目录项和inode
  3. echo 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则用来将cachepage标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。

这样,内核在后续执行脏数据的回写(writeback)时,就不用将整个page写回,而只需要写回修改的部分即可。

Cache 的具体职责

cache主要用来作为文件系统上的文件数据的缓存来用,当进程对文件有read/write操作的时候。包括将文件映射到内存的系统调用mmap,就会用到cache

因为cache被作为文件类型的缓存来用,所以事实上也负责了大部分的块设备文件的缓存工作。

怎么回收 buff/cache?

Linux内核会在内存将要耗尽的时候,自动触发内存回收的工作,以便释放出内存给急需内存的进程使用。

但是这种回收的工作也并不是没有成本。

理解cache是干什么的就知道,cache中存在着一部分write操作的数据。所以必须保证cache中的数据跟对应文件中的数据一致,才能对cache进行释放。

于是伴随着cache清除的行为的,一般都是系统IO飙高。这是因为内核要将cache中缓存的write数据进行回写。

CC BY-NC-SA 4.0 转载请注明
最后更新于 2024-11-23 15:12
clarity统计