写点什么

Linux- 技术专题 -buffer/cache 理解

发布于: 2020 年 08 月 21 日
Linux-技术专题-buffer/cache理解

1.磁盘与文件的区别

介绍buffercache之前,先介绍磁盘和文件的区别。

磁盘是一个块设备,可划分为不同的分区;在分区之上再创建文件系统,挂载到某个目录,之后在这个目录中读写文件。

其实Linux中”一切皆为文件“,而文章中提到的“文件是普通文件磁盘是块设备文件

在读写普通文件之时,会经过文件系统,由文件系统负责与磁盘交互;而读写磁盘或者分区时,就会跳过文件系统,也是所谓的‘裸IO’。这两种读写方式所使用的缓存是不同的,也就是所要讲的CacheBuffer区别。

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

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

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

man命令查询free的文档,就可以找到对应指标的详细内容。

buffer Memory used by kernel buffers (Buffers in /proc/meminfo)
cache Memory used by the page cache and slabs (Cached and SReclaimable in /proc/meminfo)
buff/cache Sum of buffers and cache

free的手册中,你可以看到 buffer cache 的说明。

  • Buffers是内核缓冲区用到的内存,对应的是 /proc/meminfo 中的 Buffers 值。

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

这里的说明告诉我们,这些数值都来自 /proc/meminfo,但更具体的BuffersCachedSReclaimable 的含义,还是没有说清楚。

proc 文件系统

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

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

继续说回 /proc/meminfo,既然 Buffers、Cached、SReclaimable 这几个指标不容易理解,那我们

还得继续查 proc 文件系统,获取它们的详细定义。

执行 man proc ,你就可以得到 proc 文件系统的详细文档。

注意:这个文档比较长,你最好搜索一下(比如搜索 meminfo),以便更快定位到内存部分。

Buffers %lu
Relatively temporary storage for raw disk blocks that shouldn't get tremendously large(20MB or so).
Cached %lu
In-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 和 Cache 分别缓存磁盘和文件系统的读写数据。

  • 从写的角度来说,不仅可以优化磁盘和文件的写入,对应用程序也有好处,应用程序可以在数据真正落盘前,就返回去做其他工作。

  • 从读的角度来说,既可以加速读取那些需要频繁访问的数据,也降低了频繁 I/O 对磁盘的压力。

除了探索的内容本身,这个探索过程对你应该也有所启发。

在排查性能问题时,由于各种资源的性能指标太多,我们不可能记住所有指标的详细含义。那么,准确高效的手段——查文档,就非常重要了。你一定要养成查文档的习惯,并学会解读这些性能指标的详细含义。此外,proc 文件系统也是我们的好帮手。它为我们呈现了系统内部的运行状态,同时也是很多性能工具的数据来源,是辅助排查性能问题的好方法。



用户头像

我们始于迷惘,终于更高的迷惘. 2020.03.25 加入

一个酷爱计算机技术、健身运动、悬疑推理的极客狂人,大力推荐安利Java官方文档:https://docs.oracle.com/javase/specs/index.html

评论

发布
暂无评论
Linux-技术专题-buffer/cache理解