通过free命令,可以查看buff/cache使用了368MB内存。从字面上理解cache是缓存,buffer是缓冲区。那么具体有什么含义呢?
free数据来源
通过man free 可以看到 free的 buffer/cache 来自/proc/meminfo
- buffers :内核缓冲区
- cache : 页缓存和slab 缓存
proc文件系统
/proc 是linux内核提供的一种特殊文件系统,用户跟内核交互的接口,用户可以从/proc中查询内核的运行状态,配置项等,也可以进行修改配置。
执行man proc
buffers:对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,内核可以把分散的写集中起来,将多次小的写合并成一次大的写入。
cached : 是对磁盘读取文件的缓存,用来缓存从文件读取的数据。后续访问可以直接从内存中获取,不用再次读取磁盘,提升读取速度。
SReclaimable 是 Slab 的一部分。Slab 包括两部分,其中的可回收部分,用 SReclaimable 记录;而不可回收部分,用 SUnreclaim 记录。
案例演示
vmstat 1
buffer和cache 单位是KB
bi和bo 分别代表块设备读取和写入的大小。单位是块/秒。
磁盘和文件写案例
通过读取随机设备,生成一个 500MB 大小的文件:
dd if=/dev/urandom of=/tmp/file bs=1M count=500
可以看到写文件的时候cache增加了很多,而buff基本不动。
所以总结下,buffer是对磁盘数据的缓存,而cache是文件数据的缓存。他们在读和写的时候都会使用。
个人理解就是因为要读取磁盘数据,并且都是按照块读取,所以为了提升读/写的性能,会先将数据写入到buffer中,然后一次性的写入和读取。提升性能。
而cache主要是针对文件的读写,当数据写入到cache可以进行快速返回,提升读写性能。
小结
本篇主要聊了free中cacha和buffer,而cache是针对文件的缓存,buffer是针对磁盘的缓存,读写都会使用。本质上都是为了提升整体IO的读写性能。这里留一个坑,后边补以下文件和磁盘的区别。