本文是通过学习倪朋飞老师的《Linux性能优化实战》 :怎么理解内存中的Buffer和Cache?

怎么理解内存中的Buffer和Cache?

  • free 数据的来源
    • proc 文件系统
  • 案例
    • 场景 1:磁盘和文件写案例
  • 总结

内存和 CPU 的关系非常紧密,而内存管理本身也是很复杂的机制,所以感觉知识很硬核、 很难啃,都是正常的。但还是那句话,初学时不用非得理解所有内容,继续往后学,多理 解相关的概念并配合一定的实践之后,再回头复习往往会容易不少。当然,基本功不容放弃。

我们先看一下系统的内存使用情况,比如下面这个 free 输出界面:

freetotal        used        free      shared  buff/cache   available
Mem:        3871192     1152832     1771464       492      946896     2471884
Swap:       4194300       91904     4102396

显然,这个界面包含了物理内存 Mem 和交换分区 Swap 的具体使用情况,比如总内存、 已用内存、缓存、可用内存等。其中缓存是 Buffer 和 Cache 两部分的总和 。

这里的大部分指标都比较容易理解,但 Buffer 和 Cache 可能不太好区分。从字面上来说,Buffer 是缓冲区,而 Cache 是缓存,两者都是数据在内存中的临时存储。那么,这两种“临时存储”有什么区别吗?

注:接下来的内容,Buffer 和 Cache 我会都用英文来表示,避免跟文中的“缓存”一词混淆。而文中的“缓存”,则通指内存中的临时存储。

free 数据的来源

  • Buffers 是内核缓冲区用到的内存,对应的是 /proc/meminfo 中的 Buffers 值。
  • Cache 是内核页缓存和 Slab 用到的内存,对应的是 /proc/meminfo 中的 Cached 与 SReclaimable 之和。

proc 文件系统

/proc 是 Linux 内核提供的一种特殊文件系统,是用户跟内核交互的接口。比方说,用户可以从 /proc 中查询内核的运行状态和配置选项, 查询进程的运行状态、统计数据等,当然,也可以通过 /proc 来修改内核的配置。

proc 文件系统同时也是很多性能工具的最终数据来源。比如我们刚才看到的 free ,就是通过读取 /proc/meminfo ,得到内存的使用情况。

man procBuffers %luRelatively temporary storage for raw disk blocks that shouldn't get tremendously large (20MB or so)Cached %luIn-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.
SUnreclaim %lu (since Linux 2.6.19)Part of Slab, that cannot be reclaimed on memory pressure.

通过文档,我们可以看到:

  • Buffers 是对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大 (20MB 左右)。这样,内核就可以把分散的写集中起来,统一优化磁盘的写入,比如 可以把多次小的写合并成单次大的写等等。
  • Cached 是从磁盘读取文件的页缓存,也就是用来缓存从文件读取的数据。这样,下次 访问这些文件数据时,就可以直接从内存中快速获取,而不需要再次访问缓慢的磁盘。
  • SReclaimable 是 Slab 的一部分。Slab 包括两部分,其中的可回收部分,用 SReclaimable 记录;而不可回收部分,用 SUnreclaim 记录。

好了,我们终于找到了这三个指标的详细定义。到这里,我们是不是长舒一口气,满意地想着,总算弄明白 Buffer 和 Cache 了。不过,知道这个定义就真的理解了吗?这里我给你 提了两个问题,你先想想能不能回答出来。

第一个问题,Buffer 的文档没有提到这是磁盘读数据还是写数据的缓存,而在很多网络搜索的结果中都会提到 Buffer 只是对将要写入磁盘数据的缓存。那反过来说,它会不会也缓存从磁盘中读取的数据呢?

第二个问题,文档中提到,Cache 是对从文件读取数据的缓存,那么它是不是也会缓存写文件的数据呢?

为了弄明白这两个问题,接下来,我们用几个案例来展示, Buffer 和 Cache 在不同场景下的使用情况。

案例

预先安装 sysstat 包,如 yum install sysstat。

之所以要安装 sysstat ,是因为我们要用到 vmstat ,来观察 Buffer 和 Cache 的变化情 况。虽然从 /proc/meminfo 里也可以读到相同的结果,但毕竟还是 vmstat 的结果更加直观。

另外,这几个案例使用了 dd 来模拟磁盘和文件的 I/O,所以我们也需要观测 I/O 的变化情况。

工具安装完成后,你可以打开两个终端,连接到机器上。

场景 1:磁盘和文件写案例

我们先来模拟第一个场景。首先,在第一个终端,运行下面这个 vmstat 命令:

vmstat 1
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r  b   swpd   free   buff  cache    si   so    bi    bo   in   cs  us sy id  wa st0  0  91904 1758276  948  954012    0    0     0     6    0    1   19 16 65  0  00  0  91904 1777896  948  954052    0    0     0     0  1328  2310  0  1 99  0  0

输出界面里, 内存部分的 buff 和 cache ,以及 io 部分的 bi 和 bo 就是我们要关注的重点。

  • buff 和 cache 就是我们前面看到的 Buffers 和 Cache,单位是 KB。
  • bi 和 bo 则分别表示块设备读取和写入的大小,单位为块 / 秒。因为 Linux 中块的大小 是 1KB,所以这个单位也就等价于 KB/s。

正常情况下,空闲系统中,你应该看到的是,这几个值在多次结果中一直保持不变。

接下来,到第二个终端执行 dd 命令,通过读取随机设备,生成一个 500MB 大小的文件:

dd if=/dev/urandom of=/tmp/file bs=1M count=500

然后再回到第一个终端,观察 Buffer 和 Cache 的变化情况:

procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st0  9 177664  86024      0 2754656    0   32  9920    32 2973 3202  0 22 21 57  02  2 251136 110632      0 2817868  924  460   924 88524 5267 3253  0 26 34 39  02  0 249600 106332      0 2833680 1184  788  1184 123668 4950 2959  0 27 29 44  01  3 250624 108604      0 2830612    0 1020    12 154624 5001 2733  1 27 45 28  00  4 251904 127880      0 2829716   28 1260 14684 179444 3532 2630  1 23 28 49  01  1 251904 104864      0 2820744    0   44 10984 32812 3803 3811  5 19 18 58  0

通过观察 vmstat 的输出,我们发现,在 dd 命令运行时, Cache 在不停地增长,而 Buffer 基本保持不变。

再进一步观察 I/O 的情况,我们会看到:

  • 在 Cache 刚开始增长时,块设备 I/O 很少,bi 只出现了一次 924 KB/s,bo 则只有一 次 32KB。而过一段时间后,才会出现大量的块设备写,比如 bo 变成了 179444
  • 当 dd 命令结束后,Cache 不再增长,但块设备写还会持续一段时间,并且,多次 I/O 写的结果加起来,才是 dd 要写的 500M 的数据。

虽然文档提供了对 Buffer 和 Cache 的说明,但是仍不能覆盖到所 有的细节。比如说,今天我们了解到的这两点:

  1. Buffer 既可以用作“将要写入磁盘数据的缓存”,也可以用作“从磁盘读取数据的缓 存”。
  2. Cache 既可以用作“从文件读取数据的页缓存”,也可以用作“写文件的页缓存”。

简单来说,Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读 请求中,也会用在写请求中

总结

我们一起探索了内存性能中 Buffer 和 Cache 的详细含义。Buffer 和 Cache 分别缓 存磁盘和文件系统的读写数据。

  • 从写的角度来说,不仅可以优化磁盘和文件的写入,对应用程序也有好处,应用程序可以在数据真正落盘前,就返回去做其他工作。
  • 从读的角度来说,既可以加速读取那些需要频繁访问的数据,也降低了频繁 I/O 对磁盘的压力。

除了探索的内容本身,这个探索过程对你应该也有所启发。在排查性能问题时,由于各种资源的性能指标太多,我们不可能记住所有指标的详细含义。那么,准确高效的手段—— 查文档,就非常重要了。

所以我们一定要养成查文档的习惯,并学会解读这些性能指标的详细含义。此外,proc 文件系统也是我们的好帮手。它为我们呈现了系统内部的运行状态,同时也是很多性能工具的数据来源,是辅助排查性能问题的好方法。

怎么理解内存中的Buffer和Cache相关推荐

  1. linux buffer cache 过高_怎么理解内存中的Buffer和Cache?

    1|0缓存 从 free 命令可以看到,缓存其实就是 Buffer 和 Cache 两部分的总和 字面意思,Buffer 是缓存区,Cache 是缓存,两者都是数据再内存中的临时存储 2|0Buffe ...

  2. 16 | 基础篇:怎么理解内存中的Buffer和Cache?

    上一节,我们梳理了 Linux 内存管理的基本原理,并学会了用 free 和 top 等工具,来查看系统和进程的内存使用情况. 在今天的内容开始之前,我们先来回顾一下系统的内存使用情况,比如下面这个 ...

  3. Linux内存中的 buffer 和 cache

    Linux内存中的 buffer 和 cache 到底是个什么东东? Linux 中的 free 命令,会输出: total 总量 used  已使用 free 空闲 shared 共享内存 buff ...

  4. Linux内存中的 buffer 和 cache 到底是个什么东东?

    Linux 中的 free 命令,会输出: total 总量 used  已使用 free 空闲 shared 共享内存 buffers cached 前面四项都比较好理解,一看我也就知道啥意思了.但 ...

  5. 内存中的Buffer和Cache

    这个界面包含了物理内存Mem和交换分区Swap的使用情况,其中包括以用内存.缓存.可用内存等.其中缓存是buffer和cache这两部分的总和. 从字面意思理解,Buffer和Cache分别代表缓冲区 ...

  6. buffer pool mysql_理解Mysql中的Buffer pool

    Buffer Pool在数据库里的地位 1.回顾一下Buffer Pool是个什么东西? 数据库中的Buffer Pool是个什么东西?其实他是一个非常关键的组件,数据库中的数据实际上最终都是要存放在 ...

  7. Linux free命令中的Buffer和Cache

    前言: 查看当前系统的内存使用情况时,我们最常使用free来查看,如下 root@7bc18553126f:/# free -htotal used free shared buff/cache av ...

  8. Linux中内存buffer和cache的区别

    Linux中内存buffer和cache的区别 分类: LINUX 原文地址:Linux中内存buffer和cache的区别 作者:platinaluo 细心的朋友会注意到,当你在linux下频繁存取 ...

  9. Linux 内存中的缓冲区(Buffer)与缓存(Cache)

    Buffer 和 Cache 的定义: Buffer:是原始磁盘块的临时存储,即将缓存数据写入磁盘.它通常不会很大(大约  20MB).这样,内核就可以将分散的写入集中起来,从而对磁盘写入进行统一优化 ...

最新文章

  1. 看看10万程序员怎么评论:零基础的前端开发该如何系统地学习?
  2. python五十三:组合的方式完成授权
  3. Python中函数的参数传递方式
  4. 挽救Centos7.0
  5. 10.2.3 基本属性
  6. SQL Server里一些未公开的扩展存储过程
  7. geth 转账_eth客户端安装 geth使用 批量转账(一)
  8. Elizabeth Taylor【伊丽莎白·泰勒】
  9. 推荐5款好用的安卓版RSS应用
  10. 如何从零搭建一个hexo博客网站02
  11. 网站性能优化小结和spring整合redis
  12. 乱码385b1b926a38153d38957556c0dc55b5
  13. opencv 的norm_OpenCV:norm-范数求解函数
  14. linux iometer安装教程,硬盘测试软件IOMETER安装配置指南
  15. 证书链——区块链电子证书系统
  16. 学生个人信息管理系统(mysql)
  17. 国外计算机cpu排行,电脑处理器排行榜_电脑处理器排行榜最新2020
  18. 使用python-opencv去掉视频水印
  19. 浏览器如何清除缓存教程
  20. 国产骨传导耳机哪个牌子好、国产骨传导耳机排名

热门文章

  1. 数控加工编程的概念,方法,原理,步骤
  2. 支付宝14岁生日,蚂蚁金服井贤栋表示技术创新要解决实际问题
  3. Edge浏览器使用 Infinity 新标签页 (Pro)插件
  4. java10 var关键字浅析
  5. 计算机页面格式和编排,计算机基础教案word排版页面格式设置.doc
  6. LeetCode练习五:哈希表
  7. 最新天选姬Q版桌宠V2.3+比原版更可爱
  8. for循环语句java图形_Java图形开发人员指南,用于其中的图形和检测循环
  9. 对接阿里云车型库接口,Access-Control-Allow-Headers 通过用户流量控制节流
  10. 阿里云服务器云盘在线扩容