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

相关推荐
无奈笑天下7 小时前
银河麒麟上nproc命令教程详解
linux·运维·服务器
大可不必了9 小时前
03 函数定义和调用
开发语言·python
I_belong_to_jesus9 小时前
C++关于分支预测的优化1
开发语言·c++·算法
承渊政道10 小时前
【Python编程—从入门到实践】(记分与闯关:用Python+Pygame,打造越战越精彩的太空大战!)
开发语言·python·pycharm·游戏程序·pygame
爱学习的程序媛10 小时前
Python常用框架梳理
开发语言·后端·python·ai·web·后端框架·python框架
Rabitebla10 小时前
【Linux】进程控制(十二) 自定义 Shell(二):内建命令与进程工作目录管理
linux·c++·笔记·学习·bash
eggwyw12 小时前
Anaconda安装卸载的详细流程指南
开发语言·python
坤坤子吖14 小时前
Linux网络编程:TCP 粘包与半包问题,如何正确处理 TCP 流式数据?
linux·服务器·网络·笔记·网络协议·学习
AI_Gump15 小时前
Harness篇|DeepSeek Harness 上手机:五条安卓移植路线与 App 内 Linux 拆解
android·linux·人工智能·智能手机·deepseek
another heaven16 小时前
【C/C++ Ranges 是零开销抽象吗?拆开管道、惰性求值和编译期膨胀】
c语言·开发语言·c++