内存中的Buffer和Cache

内存中的Buffer和Cache这个界面包含了物理内存 Mem 和交换分区 Swap 的使用情况 其中包括以用内存 缓存 可用内存等

 这个界面包含了物理内存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分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2024-12-14 07:30
下一篇 2024-12-14 07:27

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/86393.html