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

相关推荐
Scott9999HH5 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
Yana.nice6 小时前
Linux 只保留 30 天内日志(find命令删除日志文件)
linux·运维·chrome
码智社6 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海6 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖7 小时前
JDK 26 新特性详解
java·开发语言
马优晨8 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
DFT计算杂谈10 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
人邮异步社区10 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大10 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai11 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang