Linux buffer/cache

清除方法

echo 1 > /proc/sys/vm/drop_caches # 仅清除页面缓存

echo 2 > /proc/sys/vm/drop_caches # 清除目录项和inode

echo 3 > /proc/sys/vm/drop_caches # 清除页面缓存、目录项以及inode

下面了解一下这几种都是什么,简单理解,目录项和inode,那么只要有读取遍历目录,那么就会去从磁盘读取inode和目录文件系统结构,这块不应很大;另一部分就是PageCache。

简单理解,内存是通过page管理的,

那么disk 数据加载到内存中,就变成了pagecache,(第一种)

写磁盘时也会先写入pagecache,然后由后台同步到磁盘中。(第二种)

除此之外读取目录的时候目录也会缓存进cache(第三种)

下面资料都是借鉴网上公开资料。

页缓存PageCache(Buff/cache)

什么是 buff/cache?

在Linux 2.4的内存管理中,buffer指Linux内存的:Buffer cache。cache指Linux内存中的:Page cache。一般呢,是这么解释两者的。

A buffer is someting that has yet to be 'written' to disk.

A cache is someting that has been 'read' from the disk and stored for later use.

翻译过来就是说:

buffer(buff) 是用来缓存尚未"写入"磁盘的内容。

cache 是用来缓存从磁盘"读取"出来的东西。

所以 buffer 被用来当成对io设备写的缓存。而 cache 被用来当作对io设备的读缓存。这里的io设备,主要指的是块设备文件和文件系统上的普通文件。

但是在 Linux 2.6 以后,它们的意义不一样了。

在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负责文件系统的缓存。

Cache 的具体职责

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

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

Buffer 的具体职责

在当前的系统实现里,buffer主要是设计用来在系统对块设备进行读写时作为缓存来使用。这意味着对块的操作会使用buffer进行缓存,比如我们在格式化文件系统的时候。

但是一般情况下两个缓存系统是一起配合使用的,比如当我们对一个文件进行写操作的时候,cache的内容会被改变,而buffer则用来将cache的page标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。这样,内核在后续执行脏数据的回写(writeback)时,就不用将整个page写回,而只需要写回修改的部分即可。

Buffer/Cache测试

复制代码
通过dd 可以对buffer进行测试,用top进程观察

free -h

dd if=/dev/zero of=testfile bs=1M count=1000

free -h

echo 1 | sudo tee /proc/sys/vm/drop_caches

time -p cat testfile > /dev/null

free -h

time -p cat testfile > /dev/null

Buffer/Cache查询

开源工具pcstat、hcache、pgcacher均可以查询,其中pgcacher功能稍强,pcstat是鼻祖,都是go语言写的。这几个工具可以查询某个文件是否在cache里;可以查询当前进程打开的文件和进程使用的cache。

对于文件不存在或文件被关闭的,则无法查询,目前也没发现好的方法,只能通过总值减去查询出的值来看

参考:

Linux buffer/cache 内存占用过高的原因以及解决办法_buffcache占用过高是什么导致的 博客-CSDN博客

https://xiaorui.cc/archives/7373

相关推荐
zhanghaha13141 小时前
Python进阶教程:35_PyQt (保姆级零基础教程)
开发语言·python·pyqt
释厄6231 小时前
多黑洞具现论·物理/生物/金融三域显化·虚拟宇宙黑洞·奇点=0 圆圈
开发语言·数据结构·人工智能·程序人生·安全威胁分析
雯宝2 小时前
mnt_init 函数
linux
Fruit_Caller3 小时前
static
开发语言·c++
律宏阔8 小时前
WSL Docker 端口明明空闲,但就是绑不上端口
linux·windows
律宏阔8 小时前
WSL 突然断网,无法 ping 内网或外网
linux·windows
穷人小水滴8 小时前
用容器编译 VirtualBox 虚拟机软件 (ArchLinux, podman)
linux·容器·virtualbox
乱码三千8 小时前
如何优雅地直连无公网 IP 的远程 GPU 服务器
linux·人工智能·程序员
yunwei378 小时前
使用 eBPF 跟踪 Nginx 请求
linux·后端·性能优化
yunwei378 小时前
使用 eBPF 跟踪 MySQL 查询
linux·后端·性能优化