内存和CPU的关系非常紧密,而内存管理本身也是很负责的机制。
free输出界面
root@VM-4-9-ubuntu:~# free
total used free shared buff/cache available
Mem: 3514764 165864 3225656 6156 123244 3163460
Swap: 0 0 0
从man free的手册中可以看出,buffer和cache的说明
- Buffers是内核缓冲区用到的内存,对应的是/proc/meminfo中的Buffers的值。
- Cache是内核页缓存和Slab用到的内存,对应的是/proc/meminfo中的Cached与SReclaimable之和。
这些数值都来自/proc/meminfo,但更具体的Buffers、Cached和SReclaimable的含义。
proc文件系统
/proc是Linux内核提供的一种特殊文件系统,是用户跟内核交互的接口。比方说,用户可以从/proc中查询内核的运行状态和配置选项,查询进程的运行状态,统计数据等,当然,也可以通过/proc来修改内核的配置。
/proc/meminfo,继续查proc文件系统,获取上面三个的具体定义。
执行man proc
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.
...
SReclaimable %lu (since Linux 2.6.19)
Part of Slab, that might be reclaimed, such as caches.
通过这个文档可以看到:
- Buffers是对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会很大(20Mb左右)。这样,内核就可以吧分散的写集中起来,统一优化磁盘的写入,比如可以把多次小的写合并成单次大的写等等。
- Cache是从磁盘读取文件的页缓存,也就是用来缓存从文件读取的额数据。这样,下次访问这些文件数据时,就可以从内存中快读获取,而不需要再次访问缓慢的磁盘。
- SReclaimable是Slab的一部分,Slab包括两部分,其中的可回收部分,用SReclaimable记录;而不可回收部分,用SUnreclaim记录。
大概的意思是明确了,但也存在的问题就是Buffer的文档没有提到这是磁盘读数据还是写数据的缓存。Cache是对从文件读取数据的缓存,那么它是不是也会缓存写文件的数据
接下来,用几个实例来展示,Buffer与Cache在不同场景下的使用情况。
案列
准备
系统 Ubuntu 18.04
机器配置 2CPU 4GB内存
预先安装sysstat包,apt-get install sysstat。
安装sysstat是因为要使用到vmstat来观察Buffer和Cache的变化情况。可以从其他读到相同的结果,但还