Linux工具性能调优系列二:buffer和cache

3,481 阅读3分钟

一,案例入门

我们来看一个例子,我们来看free输出,free采集数据来源是:/proc/meminfo文件,对于这个文件,会贯穿这个系列。

root@szdc-calic-2-6:~# free
              total        used        free      shared  buff/cache   available
Mem:       32895096     1698396     8197904      307688    22998796    30343448
Swap:      31250428      114992    31135436

从上面的输出我们可以得到什么呢?系统当前内存是否够用?什么是buffer,什么是cache,当前可分配的内存还剩下多少?带着这些问题,我们接着往下看。

二,cache和buffer

2.1 cache

2.1.1 定义

首先明确一点,在内存管理中,cache指的是:page cache。page cache即页面高速缓存,是针对文件系统的,存储的是文件的文件数据(文件分为元数据和文件数据)。

2.1.2 哪些cache无法被回收

我们执行回收cache命令

[root@k8s-dbg-master-1 ~]# echo 3 > /proc/sys/vm/drop_caches
[root@k8s-dbg-master-1 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          32117        8622         720       16056       22773         949
Swap:         16383         216       16167

从上面我们知道,即使我们执行清理cache命令,仍然有部分cache无法回收,这些无法回收的包括:tmpfs,共享内存,mmap申请标志状态为MAP_SHARED的内存。这块不深入讲解,有兴趣的再去自己尝试下。

2.2,buffer

2.2.1 定义

(1) 在内存管理中,buffer指的是:buffer cache。buffer cache是是块设备的读写缓冲区。我们继续补充知识,操作系统是以块的概念操作磁盘的,一个块会包含一个或者多个扇区,但是不会超过一个页面大小。

(2) buffers主要用于缓存文件系统中的元数据信息(dentries、inodes),和另外一些不是文件数据的块,例如metadata和raw block I/O,因此还是需要单独用buffer cache来缓存。

2.3 两者之间的关系

在内核2.6以后,两者结构进行统一,都是page cache,page中含有一个个的buffer结构,所以我们的free命令中,也将两者进行统一。两者是配合使用的,当我们对一个文件进行写操作时候,page cache的内容会被改变,而buffer cache则可以将page标记不同的缓冲区(buffer),并记录哪个块被修改,这样,脏数据回写时候,就不用回写整个page,而只要回写修改的块。

三,案例分析

3.1 案例分析

我们将直接使用案例对cache进行分析,看看操作系统中会如何使用。事先准备一个大文件,对大文件进行读操作。

(1) 手动清空cache

[root@k8s-dbg-master-1 ~]# echo 3 > /proc/sys/vm/drop_caches       

[root@k8s-dbg-master-1 ~]# cat /proc/meminfo
MemTotal:       32887860 kB
MemFree:        15764108 kB
MemAvailable:   17081976 kB
Buffers:            1792 kB
Cached:          1191456 kB

(2) 执行命令及结果

[root@k8s-dbg-master-1 ~]# cp hyperkube /tmp/hyperkube
[root@k8s-dbg-master-1 ~]# cat /proc/meminfo
MemTotal:       32887860 kB
MemFree:        15240656 kB
MemAvailable:   17092320 kB
Buffers:           18016 kB
Cached:          1708088 kB

可以看到,cached和buffer都增多

四,问题

1,现在试着回答刚开始提出的问题:目前的系统内存情况是怎么样的

五,参考文献

1,www.cnblogs.com/sparkdev/p/…

2,linuxperf.com/?p=142