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

相关推荐
晨曦_子画1 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
Black_Friend10 分钟前
关于在VS中使用Qt不同版本报错的问题
开发语言·qt
算法与编程之美17 分钟前
文件的写入与读取
linux·运维·服务器
希言JY34 分钟前
C字符串 | 字符串处理函数 | 使用 | 原理 | 实现
c语言·开发语言
残月只会敲键盘34 分钟前
php代码审计--常见函数整理
开发语言·php
xianwu54334 分钟前
反向代理模块
linux·开发语言·网络·git
ktkiko1140 分钟前
Java中的远程方法调用——RPC详解
java·开发语言·rpc
Amelio_Ming1 小时前
Permissions 0755 for ‘/etc/ssh/ssh_host_rsa_key‘ are too open.问题解决
linux·运维·ssh
y5236481 小时前
Javascript监控元素样式变化
开发语言·javascript·ecmascript
Ven%2 小时前
centos查看硬盘资源使用情况命令大全
linux·运维·centos