这个界面包含了物理内存Mem和交换分区Swap的使用情况,其中包括以用内存、缓存、可用内存等。其中缓存是buffer和cache这两部分的总和。
从字面意思理解,Buffer和Cache分别代表缓冲区和缓存的意思,二者都是数据再内存中的临时存储。
Buffers是内核缓冲区用到的内存,对应的是/proc/meminfo种得buffers值
Cache是内核页缓存和Slab用到的内存,对应的是/proc/meminfo种得Cache与SReclaimable之和
Buffers是对原始磁盘的临时存储,也就是用来缓存磁盘的数据,通常不会特别大(20MB左右),这样内核就可以把分散的写集中起来,统一优化磁盘的写入,比如可以把多次小的写合并成单次大的写
Cached是从磁盘读取文件的页缓存,也就是用来缓存从文件读取的数据,下次访问这些文件数据的时候,就可以从内存中快速的读取,而不需要每次缓慢的从磁盘读读取。
SReclaimable 是 Slab 的一部分。Slab 包括两部分,其中的可回收部分,用 SReclaimable 记录;而不可回收部分,用 SUnreclaim 记录。
通过实例来理解Buffers和Cached
一台服务器,分别都是1核2G
为了减少其他缓存的影响,需要执行echo 3 > /proc/sys/vm/drop_caches
1、首先再一个终端上运行vmstat命令
此处的buff和cache就是之前说到的Buffers和Cached,单位是KB
bi和bo分别表示设备读取和写入的大小,单位是快/秒。因为Linux中快的大小是1KB,所以这个单位也就等价于KB/s
系统再空闲的时候,这几个值应该是不变的
再第二个终端执行命令:dd if=/dev/urandom of=/tmp/file bs=1M count=500
通过读取随机设备,生产一个500M的文件
通过结果可以看出,buff基本没怎么变,但是cache却有一个明显的下滑,再逐步上升
再进行进一步分析发现,再Cache刚开始变化的时候,bo依旧是0,一段时间之后,出现了大量块设备写。然后再dd结束的时候,Cache不在增长,多次I/O写得结果加起来,才是dd要写的500M数据
问题1:Cache是从磁盘读取文件的页缓存,为什么再写入文件的时候也会使用到它?
写文件的时候会用到Cache缓存数据,写磁盘的时候会用到Buffer来缓存数据,所以,虽然Cache是文件读的缓存,但是实际上,Cache也会缓存写文件的数据。
磁盘和文件读案例
反过来看,磁盘、文件读取时是如何一个表现
首先还是清空缓存
echo 3 > /proc/sys/vm/drop_caches
运行文件读取命令
dd if=/tmp/file of=/dev/null
回到终端1观察内存和I/O的变化
观察vmstat时,发现在文件读取的开始时buff几乎没有变化,但是cache再不断增加。bi写入的大小也会在dd结束之后达到1G,这与之前说的“Cache 是对文件读的页缓存”是一致的
总结:
Buffer是对磁盘数据的缓存,而Cache是对文件数据的缓存,他们既会用在读请求中,也会用在写请求中
今天的文章 内存中的Buffer和Cache分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/86393.html