1|0缓存

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

2|0Buffer 和 Cache 的区别

man free

执行上面的命令,可以从帮助手册中看到 buffer 和 cache 说明

  • Buffers:内核缓冲区用到的内存,对应的是 /proc/meminfo 中的 Buffers
  • Cache:内核页缓存和 Slab 用到的内存,对应的是 /proc/meminfo 中的 CachedSReclaimable 之和

注意事项

  • 同一个指标的具体含义,就可能因为内核版本、性能工具版本的不同而有挺大差别
  • 所以百度 Buffer 和 Cache 什么意思可能并不适用于你当前的环境
  • 所以可以通过下面说的 proc 文件系统来确认它们的含义

3|0proc 文件系统

再次回顾 proc

  • /proc 是 Linux 内核提供的一种特殊文件系统,是用户跟内核交互的接口
  • 比方说,用户可以从 /proc 中查询内核的运行状态和配置选项, 查询进程的运行状态、统计数据等,也可以通过 /proc 来修改内核的配置
  • proc 文件系统同时也是很多性能工具的最终数据来源

3|1了解 Buffer 和 Cache

查看帮助文档,找到它们

man proc

Buffers

  • 原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大 (20MB 左右)
  • 内核就可以把分散的写集中起来,统一优化磁盘的写入,比如,可以把多次小的写合并成单次大的写等等

Cached

  • 从磁盘读取文件的页缓存,也就是用来缓存从文件读取的数据
  • 这样,下次访问这些文件数据时,就可以直接从内存中快速获取,而不需要再次访问缓慢的磁盘。

SReclaimable

  • 是 Slab 的一部分
  • Slab 包括两部分,其中的可回收部分,用 SReclaimable 记录;而不可回收部分,用 SUnreclaim 记录

灵魂拷问

  • Buffers 能不能缓存磁盘中的数据?
  • Cached 能不能缓存磁盘中的数据?

为了验证上面的问题,会通过案例来展开描述

4|0Buffer 和 Cache 在不同场景下的使用情况

系统配置

  • 操作系统:Ubuntu 18.04
  • 机器配置:2 CPU,8GB 内存
  • 预先安装 sysstat 包 apt install sysstat
  • 打开两个终端连接到 Ubuntu 系统上

4|1前期准备

为了减少缓存的影响,在第一个终端中,运行下面的命令来清理文件页、目录项、Inodes 等各种缓存

echo 3 > /proc/sys/vm/drop_caches

5|0场景一:磁盘和文件写案例

5|1文件写场景

第一个终端运行 vmstat

vmstat 1 

结果分析

  • 输出界面里, 内存部分的 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

观察第一个终端的 vmstat 运行情况

结果分析

  • 从 dd 命令开始运行时,cache 不断增加,而 buff 基本不变(看蓝色向下箭头)
  • 在 cache 刚开始增长时,块设备 I/O 很少,bi、bo 都是 0KB,而在之后才出现大量的块设备写,bo 变成了 98384
  • 当 dd 命令结束后,cache 不再持续性增长,但块设备写还会持续一段时间,并且多次 I/O 写的结果加起来(bo 蓝色框),就是 dd 要写的 500M 的数据

5|2磁盘写场景

前提条件

  • 需要你的系统配置多块磁盘,并且磁盘分区 /dev/sdb1 还要处于未使用状态
  • 如果你只有一块磁盘,千万不要尝试,否则将会对你的磁盘分区造成损坏

第二个终端运行 dd

echo 3 > /proc/sys/vm/drop_caches# 然后运行 dd 命令向磁盘分区 /dev/sdb1 写入 2G 数据dd if=/dev/urandom of=/dev/sdb1 bs=1M count=2048

第一个终端运行 vmstat,观察内存和 I/O 的变化情况

结果分析

  • buff 和 cache 都在增长,但 buff 增长速度快很多
  • 说明写磁盘用到了大量的 Buffer

总结

  • 写文件时会用到 Cache 缓存数据,而写磁盘则会用到 Buffer 来缓存数据
  • 所以,虽然文档上只提到,Cache 是文件读的缓存,但实际上,Cache 也会缓存写文件时的数据

6|0场景二:磁盘和文件读案例

6|1文件读场景

第二个终端运行 dd 读取文件

echo 3 > /proc/sys/vm/drop_caches# 然后运行 dd 命令读取文件数据dd if=/dev/sda1 of=/dev/null bs=1M count=1024

第一个终端运行 vmstat 观察内存和 I/O 变化情况

结果分析

  • 读取文件时(也就是 bi 大于 0 时),Buffer 保持不变,而 Cache 则在不停增长
  • 这跟查到的定义【Cache 是对文件读的页缓存】是一致的

6|2磁盘读场景

第二个终端运行 dd 读取磁盘

echo 3 > /proc/sys/vm/drop_caches# 运行 dd 命令读取文件dd if=/dev/sda1 of=/dev/null bs=1M count=1024

第一个终端运行 vmstat 观察内存和 I/O 变化情况

结果分析

  • 读磁盘时(也就是 bi 大于 0 时),Buffer 和 Cache 都在增长,但显然 Buffer 的增长快很多
  • 这说明读磁盘时,数据缓存到了 Buffer 中

7|0总结 Buffer 和 Cache 的说明

  • Buffer 既可以用作将要写入磁盘数据的缓存,也可以用作从磁盘读取数据的缓存
  • Cache 既可以用作从文件读取数据的页缓存,也可以用作写文件的页缓存
  • 总结:Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读请求中,也会用在写请求

从读写角度总结 Buffer 和 Cache 缓存磁盘和文件系统的读写数据

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

linux buffer cache 过高_怎么理解内存中的Buffer和Cache?相关推荐

  1. 怎么理解内存中的Buffer和Cache

    本文是通过学习倪朋飞老师的<Linux性能优化实战> :怎么理解内存中的Buffer和Cache? 怎么理解内存中的Buffer和Cache? free 数据的来源 proc 文件系统 案 ...

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

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

  3. Linux内存中的 buffer 和 cache

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

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

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

  5. linux buffer cache 过高_你真的理解Linux的内存监控吗?

    如果你平时工作使用Windows系统,对Windows的内存监控应该不陌生,在"任务管理器"中显示90%的内存占用,这些内存就全部由进程占用了,如果这时产生了新的进程,没有内存可用 ...

  6. linux buffer cache 过高_工作中经常用的linux命令 free

    free命令可以显示当前系统未使用的和已使用的内存数目,还可以显示被内核使用的内存缓冲区,不带参数默认将会以kb单位展示 CentOS 7.6上显示如下 free -m 以M为单位显示 total:表 ...

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

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

  8. 内存中的Buffer和Cache

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

  9. java的弱引用_深入理解Java中的弱引用

    不久之前,我面试了一些求职Java高级开发工程师的应聘者.我常常会面试他们说,"你能给我介绍一些Java中得弱引用吗?",如果面试者这样说,"嗯,是不是垃圾回收有关的?& ...

最新文章

  1. 中农植保-昆虫进化与基因组诚聘博后及科研助理-三亚中国农业大学研究院
  2. 自然语言模型算法太杂乱?国产统一 AI 开源框架来了
  3. 记一次MySQL AUTO_INCREMENT的故障
  4. Window.navigator
  5. 高中生计算机创新大赛作品,2017 第十届“英特尔杯”全国大学生软件创新大赛获奖作品...
  6. BZOJ3173 [TJOI2013]最长上升子序列
  7. pb通过对象名称调用对象_信号线名称自动关联Simulink信号对象
  8. 彻底删除SQL Server2005(转)
  9. java读取文件效率优化_java 读文件 性能
  10. ×××全功能邮件系统(3)
  11. 2020大学计算机答案,超星2020大学计算机基础答案 全
  12. XCode6如何创建Category
  13. 数据包络分析--Additive Model
  14. OceanBase可视化工具ODC2.3下载地址。
  15. 前端web实训——小米商城(第一天)
  16. 推荐2个适合程序员使用的显示器
  17. 安卓分屏神器_手机端必备神器,一经推出轻松拥有过千万用户下载量!
  18. 关于solidworks软件的显卡驱动
  19. 怎样防止ddos攻击呢?
  20. 多渔:赚快钱,就像慢性中毒

热门文章

  1. index.php s 1 last,Nginx常用rewrite跳转重定向实例
  2. win10电脑开机密码忘了怎么办_电脑开机密码忘了怎么办最简单的方法_windows7教程...
  3. python 随机数抽奖系统_python实现的简单抽奖系统实例
  4. 罗翔 ---- 理想主义的花
  5. JavaSE----常用类(String、StringBuilder、StringBuffer)
  6. 支持多分支语句吗_Go的条件判断语句
  7. python怎么查看网页编码格式_Python写爬虫时如果碰到以Request Payload格式传输数据怎么办?...
  8. windows批处理执行多条命令
  9. jar启动报错:org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputExcept
  10. OSChina 周一乱弹 —— 程序员的浪漫你不懂