做性能测试的必备知识系列,可以看下面链接的文章哦

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 中的 CachedSReclaimable 之和

注意事项

  • 同一个指标的具体含义,就可能因为内核版本、性能工具版本的不同而有挺大差别
  • 所以百度 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?的更多相关文章

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

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

  2. 内存中的Buffer和Cache的区别

    Reference:https://time.geekbang.org/column/article/74633 磁盘是一个块设备,可以划分为不同的分区:在分区之上再创建文件系统,挂载到某个目录,之后 ...

  3. Free中的buffer和cache理解

    吐血推荐文章: Linux内存中的Cache真的能被回收么? free中的buffer和cache: redhat对free输出的解读 两者都是RAM中的数据.简单来说,buffer是即将要被写入磁盘 ...

  4. 性能测试必备知识(5)- 深入理解“CPU 上下文切换”

    做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 前言 上一篇文章中,举例了大量进程等待 CP ...

  5. 性能测试必备知识(7)- 深入理解“CPU 使用率”

    做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 回顾 CPU 使用率是单位时间内 CPU 使 ...

  6. 性能测试必备知识(10)- Linux 是怎么管理内存的?

    做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 内存映射 日常生活常说的内存是什么 比方说, ...

  7. 性能测试必备知识(4)- 使用 stress 和 sysstat

    做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html stress 介绍 Linux 系统压力测试 ...

  8. 性能测试必备知识(6)- 如何查看“CPU 上下文切换”

    做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 课前准备,安装 sysbench 下载 sy ...

  9. 性能测试必备知识(2)- 查看 Linux 的 CPU 相关信息

    做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 查看系统 CPU 信息 cat /proc/ ...

随机推荐

  1. 设计模式:Adapter模式

    目的:复用代码和兼容以前的代码 思想:提供一个中间层,做兼容 方法:“继承”的方式,“委托”的方式 继承关系图: 委托方式 继承方式 例子: //原来的打印 class Print { public: ...

  2. Shell基本语法---处理海量数据的sed命令

    sed命令 shell脚本三剑客之一 处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕.接着处理下一行,这样不断重复,直到 ...

  3. 获取DataGridview中某列的所有数据

    /// <summary> /// /// </summary> /// <typeparam name="T"></typeparam& ...

  4. es6 Proxy简单使用

    es6的Proxy是什么? 可以理解为,是在访问对象前的一层拦截.只要访问的该对象,就要通过这个一层拦截.这一层的拦截,可以进行数据的过滤和更改 比如下面这个 var p = new Proxy({} ...

  5. 第一课:Centos下配置java环境变量的两种方式(jdk1.8)

    配置java环境(yum安装) 1.查出java1.8的全部版本 yum list java-1.8* 2.安装你需要的java1.8 版本(安装的名字根据查询出来的结果输入这里只是举例) yum i ...

  6. 跟老刘学运维day03~新手必须掌握的Linux命令(3)

    第2章 Linux命令 今天已经跟老刘学习运维第三天了,前两天对虚拟机和Linux系统的安装进行了深入的学习,今天开始命令的学习 系统状态检测命令 1.ifconfig   2.uname:查看系统内 ...

  7. 第十章 函数式接口&Stream流

    10.1.函数式接口 10.1.1.概述 有且仅有一个抽象方法的接口,并且可以通过在类上标注@FunctionalInterface注解进行检测,建议自定义的函数式接口都加上这个注解 10.1.2.函 ...

  8. Linux最常用的基本操作复习

    .ctrl + shift + = 放大终端字体 .ctrl + - 缩小终端字体 .ls 查看当前文件夹下的内容 .pwd 查看当前所在的文件夹 .cd 目录名 切换文件夹 .touch 如果文件不 ...

  9. Flutter中的绘图(Canvas&CustomPaint)API

    本文是Flutter中Canvas和CustomPaint API的使用实例. 首先看一下我们要实现的效果: 结合动图演示,列出最终目标如下: 在程序运行后,显示一个小球: 每次程序启动后,小球的样式 ...

  10. luogu P4884 多少个1?

    LINK:多少个1? 题目要求:\(\sum_{i=0}^{n-1}10^i \equiv k \mod m\) 最小的n. 看起来很难求的样子 这个同余式 看起来只能暴力枚举. 不过既然是同余 我们 ...