linux 内存中Buffer和Cache的区别
linux 内存中Buffer和Cache的区别
通过man proc(或者 man procfs),搜索关键词meminfo:
Buffers %lu
Relatively temporary storage for raw disk blocks that shouldn’t get tremendously large (20MB or so).Cached %lu
In-memory cache for files read from the disk (the page cache). Doesn’t include SwapCached.
具体怎么理解?
通过实验发现,
比较写数据到文件和写数据到磁盘:
- 写数据到文件:Buffer 基本保持不变,Cache 在不停地增长
- 写数据到磁盘:Buffer 和 Cache都在增长,但明显Buffer 的增长快得多。这说明,写磁盘用到了大量的 Buffer
比较从文件中读取数据和从磁盘中读数据:
- 从文件中读取数据:Buffer保持不变,Cache增长
- 从磁盘中读取数据:Buffer 和 Cache 都在增长,但明显Buffer的增长快很多。这说明读磁盘时,数据缓存到了 Buffer 中。
实验数据参考:https://time.geekbang.org/column/article/74633
简单理解:Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存。
同学@Geek_5258f8 的解答:
理论上,一个文件读首先到Block Buffer, 然后到Page Cache。有了文件系统才有了Page Cache。在老的Linux上这两个Cache是分开的。那这样对于文件数据,会被Cache两次。这种方案虽然简单,
但低效。后期Linux把这两个Cache统一了。对于文件,Page Cache指向Block Buffer,对于非文件则是Block Buffer。这样就如文件实验的结果,文件操作,只影响Page Cache,而Raw操作,则只影响Buffer. 比如一此VM虚拟机,则会越过File System,只接操作 Disk, 常说的Direct IO.