linux 内存中Buffer和Cache的区别

linux 内存中Buffer和Cache的区别

通过man proc(或者 man procfs),搜索关键词meminfo:
linux 内存中Buffer和Cache的区别

  • 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.