内存中的Buffer和Cache

 这个界面包含了物理内存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是对文件数据的缓存,他们既会用在读请求中,也会用在写请求中

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值