一,案例入门
我们来看一个例子,我们来看free输出,free采集数据来源是:/proc/meminfo文件,对于这个文件,会贯穿这个系列。
root@szdc-calic-2-6:~# free total used free shared buff/cache availableMem: 32895096 1698396 8197904 307688 22998796 30343448Swap: 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 availableMem: 32117 8622 720 16056 22773 949Swap: 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/meminfoMemTotal: 32887860 kBMemFree: 15764108 kBMemAvailable: 17081976 kBBuffers: 1792 kBCached: 1191456 kB复制代码
(2) 执行命令及结果
[root@k8s-dbg-master-1 ~]# cp hyperkube /tmp/hyperkube[root@k8s-dbg-master-1 ~]# cat /proc/meminfoMemTotal: 32887860 kBMemFree: 15240656 kBMemAvailable: 17092320 kBBuffers: 18016 kBCached: 1708088 kB复制代码
可以看到,cached和buffer都增多
四,问题
1,现在试着回答刚开始提出的问题:目前的系统内存情况是怎么样的
五,参考文献
1,
2,