性能测试必备知识(11)- 怎么理解内存中的Buffer和Cache?
做性能测试的必备知识系列,可以看下面链接的文章哦
https://www.cnblogs.com/poloyy/category/1806772.html
缓存
- 从 free 命令可以看到,缓存其实就是 Buffer 和 Cache 两部分的总和
- 字面意思,Buffer 是缓存区,Cache 是缓存,两者都是数据再内存中的临时存储
Buffer 和 Cache 的区别
man free
执行上面的命令,可以从帮助手册中看到 buffer 和 cache 说明
- Buffers:内核缓冲区用到的内存,对应的是 /proc/meminfo 中的 Buffers 值
- Cache:内核页缓存和 Slab 用到的内存,对应的是 /proc/meminfo 中的 Cached 与 SReclaimable 之和
注意事项
- 同一个指标的具体含义,就可能因为内核版本、性能工具版本的不同而有挺大差别
- 所以百度 Buffer 和 Cache 什么意思可能并不适用于你当前的环境
- 所以可以通过下面说的 proc 文件系统来确认它们的含义
proc 文件系统
再次回顾 proc
- /proc 是 Linux 内核提供的一种特殊文件系统,是用户跟内核交互的接口
- 比方说,用户可以从 /proc 中查询内核的运行状态和配置选项, 查询进程的运行状态、统计数据等,也可以通过 /proc 来修改内核的配置
- proc 文件系统同时也是很多性能工具的最终数据来源
了解 Buffer 和 Cache
查看帮助文档,找到它们
man proc
Buffers
- 对原始磁盘块的临时存储,也就是用来缓存磁盘的数据,通常不会特别大 (20MB 左右)
- 内核就可以把分散的写集中起来,统一优化磁盘的写入,比如,可以把多次小的写合并成单次大的写等等
Cached
- 从磁盘读取文件的页缓存,也就是用来缓存从文件读取的数据
- 这样,下次访问这些文件数据时,就可以直接从内存中快速获取,而不需要再次访问缓慢的磁盘。
SReclaimable
- 是 Slab 的一部分
- Slab 包括两部分,其中的可回收部分,用 SReclaimable 记录;而不可回收部分,用 SUnreclaim 记录
灵魂拷问
- Buffers 能不能缓存磁盘中读的数据?
- Cached 能不能缓存磁盘中写的数据?
为了验证上面的问题,会通过案例来展开描述
Buffer 和 Cache 在不同场景下的使用情况
系统配置
- 操作系统:Ubuntu 18.04
- 机器配置:2 CPU,8GB 内存
- 预先安装 sysstat 包 apt install sysstat
- 打开两个终端连接到 Ubuntu 系统上
前期准备
为了减少缓存的影响,在第一个终端中,运行下面的命令来清理文件页、目录项、Inodes 等各种缓存
echo > /proc/sys/vm/drop_caches
场景一:磁盘和文件写案例
文件写场景
第一个终端运行 vmstat
vmstat
结果分析
- 输出界面里, 内存部分的 buff 和 cache ,以及 io 部分的 bi 和 bo 就是要关注的重点
- buff 和 cache 就是我们前面看到的 Buffers 和 Cache,单位是 KB
- bi 和 bo 则分别表示块设备读取和写入的大小,单位为块 / 秒,因为 Linux 中块的大小是 1KB,所以这个单位也就等价于 KB/s
- 正常情况下,空闲系统中,你应该看到的是,这几个值在多次结果中一直保持不变
第二个终端运行 dd
dd if=/dev/urandom of=/tmp/file bs=1M count=
观察第一个终端的 vmstat 运行情况
结果分析
- 从 dd 命令开始运行时,cache 不断增加,而 buff 基本不变(看蓝色向下箭头)
- 在 cache 刚开始增长时,块设备 I/O 很少,bi、bo 都是 0KB,而在之后才出现大量的块设备写,bo 变成了 98384
- 当 dd 命令结束后,cache 不再持续性增长,但块设备写还会持续一段时间,并且多次 I/O 写的结果加起来(bo 蓝色框),就是 dd 要写的 500M 的数据
磁盘写场景
前提条件
- 需要你的系统配置多块磁盘,并且磁盘分区 /dev/sdb1 还要处于未使用状态
- 如果你只有一块磁盘,千万不要尝试,否则将会对你的磁盘分区造成损坏
第二个终端运行 dd
echo > /proc/sys/vm/drop_caches #然后运行 dd 命令向磁盘分区 /dev/sdb1 写入 2G 数据
dd if=/dev/urandom of=/dev/sdb1 bs=1M count=
第一个终端运行 vmstat,观察内存和 I/O 的变化情况
结果分析
- buff 和 cache 都在增长,但 buff 增长速度快很多
- 说明写磁盘用到了大量的 Buffer
总结
- 写文件时会用到 Cache 缓存数据,而写磁盘则会用到 Buffer 来缓存数据
- 所以,虽然文档上只提到,Cache 是文件读的缓存,但实际上,Cache 也会缓存写文件时的数据
场景二:磁盘和文件读案例
文件读场景
第二个终端运行 dd 读取文件
echo > /proc/sys/vm/drop_caches #然后运行 dd 命令读取文件数据
dd if=/dev/sda1 of=/dev/null bs=1M count=
第一个终端运行 vmstat 观察内存和 I/O 变化情况
结果分析
- 读取文件时(也就是 bi 大于 0 时),Buffer 保持不变,而 Cache 则在不停增长
- 这跟查到的定义【Cache 是对文件读的页缓存】是一致的
磁盘读场景
第二个终端运行 dd 读取磁盘
echo > /proc/sys/vm/drop_caches # 运行 dd 命令读取文件
dd if=/dev/sda1 of=/dev/null bs=1M count=
第一个终端运行 vmstat 观察内存和 I/O 变化情况
结果分析
- 读磁盘时(也就是 bi 大于 0 时),Buffer 和 Cache 都在增长,但显然 Buffer 的增长快很多
- 这说明读磁盘时,数据缓存到了 Buffer 中
总结 Buffer 和 Cache 的说明
- Buffer 既可以用作将要写入磁盘数据的缓存,也可以用作从磁盘读取数据的缓存
- Cache 既可以用作从文件读取数据的页缓存,也可以用作写文件的页缓存
- 总结:Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读请求中,也会用在写请求
从读写角度总结 Buffer 和 Cache 缓存磁盘和文件系统的读写数据
- 从写的角度来说,不仅可以优化磁盘和文件的写入,对应用程序也有好处,应用程序可以在数据真正落盘前,就返回去做其他工作
- 从读的角度来说,既可以加速读取那些需要频繁访问的数据,也降低了频繁 I/O 对磁盘的压力
性能测试必备知识(11)- 怎么理解内存中的Buffer和Cache?的更多相关文章
- Linux内存中的 buffer 和 cache 到底是个什么东东?
Linux 中的 free 命令,会输出: total 总量 used 已使用 free 空闲 shared 共享内存 buffers cached 前面四项都比较好理解,一看我也就知道啥意思了.但 ...
- 内存中的Buffer和Cache的区别
Reference:https://time.geekbang.org/column/article/74633 磁盘是一个块设备,可以划分为不同的分区:在分区之上再创建文件系统,挂载到某个目录,之后 ...
- Free中的buffer和cache理解
吐血推荐文章: Linux内存中的Cache真的能被回收么? free中的buffer和cache: redhat对free输出的解读 两者都是RAM中的数据.简单来说,buffer是即将要被写入磁盘 ...
- 性能测试必备知识(5)- 深入理解“CPU 上下文切换”
做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 前言 上一篇文章中,举例了大量进程等待 CP ...
- 性能测试必备知识(7)- 深入理解“CPU 使用率”
做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 回顾 CPU 使用率是单位时间内 CPU 使 ...
- 性能测试必备知识(10)- Linux 是怎么管理内存的?
做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 内存映射 日常生活常说的内存是什么 比方说, ...
- 性能测试必备知识(4)- 使用 stress 和 sysstat
做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html stress 介绍 Linux 系统压力测试 ...
- 性能测试必备知识(6)- 如何查看“CPU 上下文切换”
做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 课前准备,安装 sysbench 下载 sy ...
- 性能测试必备知识(2)- 查看 Linux 的 CPU 相关信息
做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 查看系统 CPU 信息 cat /proc/ ...
随机推荐
- 用x种方式求第n项斐波那契数,99%的人只会第一种
大家好啊,我们又见面了.听说有人想学数据结构与算法却不知道从何下手?那你就认真看完本篇文章,或许能从中找到方法与技巧. 本期我们就从斐波那契数列的几种解法入手,感受算法的强大与奥妙吧. 原文链 ...
- 分布式锁(3) ----- 基于zookeeper的分布式锁
分布式锁系列文章 分布式锁(1) ----- 介绍和基于数据库的分布式锁 分布式锁(2) ----- 基于redis的分布式锁 分布式锁(3) ----- 基于zookeeper的分布式锁 代码:ht ...
- @Autowired @Qualifier
spring2.1中允许用户通过@Autowired注解对Bean的属性变量.属性Setter方法以及构造函数进行标注,配合AutowiredAnnotationBeanProcessor完成Bean ...
- Spring+hibernate+JSP实现Piano的数据库操作---4.配置文件
1.applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <beans ...
- CF R 632 div2 1333F Kate and imperfection
赛后看了半天题 才把题目看懂 英语水平极差. 意思:定义一个集合S的权值为max{gcd(a,b)};且\(a\neq b\) 这个集合可以从1~n中选出一些数字 求出当集合大小为k时的最小价值. 无 ...
- MySQL(版本8.0.19)服务的启动/停止、登录/登出、修改密码
[先说明一点 ,windows系统下,英文字母不分大小写.] MySQL 服务的 启动 / 停止 方式一: (我的系统是windows10) 找到 此电脑 图标 右键点击,选择"管理&q ...
- IntelliJIDEA的安装、配置与使用
引言: IDEA,全称 IntelliJ IDEA,是 Java 语言的集成开发环境,IDEA 在业界被公认为是 最好的 java 开发工具之一,尤其在智能代码助手.代码自动提示.重构.J2EE 支持 ...
- 新老版本vue-cli的安装及创建项目等方式的比较
vue-cli 3.0 正式版于2018年8月发布,截至到2020年08月05日版本已经更新到4.4.6.Vue CLI 的包名称由 vue-cli 改成了 @vue/cli,目前网上很多的Vue项目 ...
- 8道python练习题,能做出来的没几个
变量的定义 程序就是用来处理数据的,而变量就是用来存储数据的 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道 ...
- ES6 面向对象笔记
JS面向对象两大编程思想 面向过程 面向对象 面向过程编程POP 面向过程就是分析出问题的需要步骤,然后用函数一步一步的实现,使用的时候一个一个调用就可以了 面向对象编程OOP ...