通常在查看linux系统内存使用情况时,我们通常会使用free、top等工具。
正常情况下,我们使用free命令会看到如下的输出:
example
|
这个输出中包含了物理内存Mem和交换分区Swap的具体使用情况,例如总内存、已经使用的内存、剩余内存、缓存等信息。大部分指标还是比较容易理解的,但是其中的buffer和cache这是什么鬼,从字面的理解来看buffer是指缓冲区,cache是缓存,两者都是数据在内存中的临时存储,那么这两种临时存储到底有什么区别呢?
查看free的man手册命令你会发现如下解释:
|
buffers:是内核缓冲区用到的内存,对应的是/proc/meminfo中的Buffers值
cache:是内核页缓存和slab用到的内存,对应的是/proc/meminfo中的cached和slab之和
继续查看proc的man手册可以查到如下信息:
|
可以看到:
buffers:是对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大(20MB左右)。这样内核就可以把分散的写集中起来,统一优化磁盘的写入,比如把多次小的写合并成单次大的写
cache:是从磁盘读取文件的页缓存,也就是用来缓存从文件读取的数据,这样下次访问这些文件数据时,就可以直接从内存中快速读取,从而不再需要访问缓慢的磁盘。
文档中对buffer的描述是缓存磁盘的数据,对cache的描述是缓存从文件读取的数据,但真的是这样的吗?
经过实际的测试(测试数据及过程就不在这里列出了),真正的情况是:
buffer 既可以用作“将要写入磁盘数据的缓存”,也可以用作“从磁盘读取数据的缓存”。
cache 既可以用做“从文件读取数据的页缓存”,也可以用作“写文件的页缓存”。
总结下来就是:
buffer是对磁盘数据的缓存,cache是文件数据的缓存,它们既会用在读请求中也会用在写请求中。