缓存
从 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 是 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 3 > /proc/sys/vm/drop_caches
例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 的数据;
磁盘写场景
前提条件
需要你的系统配置多块磁盘,并且磁盘分区 /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 也会缓存写文件时的数据
例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 则在不停增长
这跟查到的定义【Cache 是对文件读的页缓存】是一致的
磁盘读场景
第二个终端运行 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 中;
总结 Buffer 和 Cache 的说明
Buffer 既可以用作将要写入磁盘数据的缓存,也可以用作从磁盘读取数据的缓存;
Cache 既可以用作从文件读取数据的页缓存,也可以用作写文件的页缓存;
Buffer 是对磁盘数据的缓存,而 Cache 是文件数据的缓存,它们既会用在读请求中,也会用在写请求;
从读写角度总结 Buffer 和 Cache 缓存磁盘和文件系统的读写数据;
从写的角度来说,不仅可以优化磁盘和文件的写入,对应用程序也有好处,应用程序可以在数据真正落盘前,就返回去做其他工作;
从读的角度来说,既可以加速读取那些需要频繁访问的数据,也降低了频繁 I/O 对磁盘的压力;
下面是我整理的2023年最全的软件测试工程师学习知识架构体系图 |
生活不止眼前的苟且,奋斗是我们的座右铭;努力追求梦想的路上,坚持才会有收获;困难不可怕,勇敢面对每一次挑战;相信自己,你一定可以超越自我;积极奋斗,未来必将辉煌!
勇往直前,不惧困难;追求卓越,超越自我;坚持不懈,奋力拼搏;每一步都是进步,每一天都创造辉煌;相信自己,实现梦想;只有努力,才能成就未来。
只要心中有梦想,你就能超越极限。努力不是一时的热情,而是持久的奋斗。每一次坚持,都是向成功迈出的一步。相信自己,勇敢前行,终将成就非凡!