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)
在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主要用来作为文件系统上的文件数据的缓存来用,当进程对文件有read/write操作的时候。包括将文件映射到内存的系统调用mmap,就会用到cache。
因为cache被作为文件类型的缓存来用,所以事实上也负责了大部分的块设备文件的缓存工作。
在当前的系统实现里,buffer主要是设计用来在系统对块设备进行读写时作为缓存来使用。这意味着对块的操作会使用buffer进行缓存,比如我们在格式化文件系统的时候。
但是一般情况下两个缓存系统是一起配合使用的,比如当我们对一个文件进行写操作的时候,cache的内容会被改变,而buffer则用来将cache的page标记为不同的缓冲区,并记录是哪一个缓冲区被修改了。这样,内核在后续执行脏数据的回写(writeback)时,就不用将整个page写回,而只需要写回修改的部分即可。
通过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
开源工具pcstat、hcache、pgcacher均可以查询,其中pgcacher功能稍强,pcstat是鼻祖,都是go语言写的。这几个工具可以查询某个文件是否在cache里;可以查询当前进程打开的文件和进程使用的cache。
对于文件不存在或文件被关闭的,则无法查询,目前也没发现好的方法,只能通过总值减去查询出的值来看
参考:
Linux buffer/cache 内存占用过高的原因以及解决办法_buffcache占用过高是什么导致的 博客-CSDN博客
https://xiaorui.cc/archives/7373