文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Linux 内存中的缓冲区(Buffer)与缓存(Cache)

2024-12-02 01:43

关注

Buffer 和 Cache 的定义:

但是让我问你,由于 Buffer 只是将写入磁盘的数据的缓存。反过来,它还会缓存从磁盘读取的数据吗?或者 Cache 是从文件中读取数据的缓存,那么它是否也为写入文件缓存数据呢?

如果你能回答以上两个问题,你可以跳过这篇文章,我想你已经对 Buffer 和 Cache 有了很好的理解。但如果你不能,请留下来看看我的进一步解释。

free 命令

要检查系统内存使用情况,您想到的第一个命令可能是 free ,例如:

$ free -h
total used free shared buff/cache available
Mem: 1.9G 1.0G 394M 2.6M 491M 728M
Swap: 0B 0B 0B

很明显,该输出包括了物理内存 Mem 和 Swap 的具体使用情况(如总内存、已用内存、缓存、可用内存等)。缓存是 Buffer 和 Cache 两部分的总和。

让我们看一下 free 的手册页中的  Buffer 和 Cache 定义:


buffers
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 命令的源数据实际上存储在 proc/meminfo 文件中。正如我前面提到的,/proc 是 Linux 内核提供的一个特殊的文件系统,它就像一个用户与内核交互的接口。

/proc 文件系统也是许多性能工具的最终数据源。在 man proc 中,Buffers 和 Cached 的定义如下:

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.

至此,您可能认为您已经找到了我的问题的答案,“Buffer”只是用于将数据写入磁盘的缓存,“Cache”只是用于从文件中读取数据的缓存。但事实上,“Buffer”也可以用于读取,“Cache”也可以用于写入。

实验

我们将在这里做两个实验,写缓存和读缓存。

写入 Cache

让我们登录到我们的 Linux 主机并准备好两个终端。在终端 1,让我们先清理缓存:

这里 /proc/sys/vm/drop_caches 是一个通过 proc 文件系统修改内核行为的例子。写入 3 意味着清理各种缓存,例如文件页、目录条目和 Inode。

仍然在终端 1,让我们开启 vmstat 2 命令:

接下来,转移到终端 2 并运行以下命令:

现在切换回终端 1,并观察 buff 和 cache 的变化:

通过观察 vmstat 的输出,我们发现运行 dd 命令时,Cache 一直在增长,而 Buffer 基本没有变化。

读取 Buffer

现在,让我们做第二个实验。再次清除终端 1中的缓存:

同样在终端 1 中,再次启动 vmstat 2 命令:

您可以看到此时 buff 为 0。现在在终端 2 中,运行以下命令:

然后,回到终端 1 观察:

观察 vmstat 的输出,你会发现在读盘的时候(也就是 bi > 0 的时候),Buffer 和 Cache 都在增长,但是显然 Buffer 的增长要快很多。这意味着当从磁盘读取时,数据被缓存在 Buffer 中。

现在我们几乎可以得出结论:

读取文件时数据会缓存在 Cache 中,读取磁盘时数据会缓存在 Buffer 中。

结论

在这里您应该会发现,虽然本文对 Buffer 和 Cache 进行了描述,但仍然无法涵盖所有细节。我们如今学到了以下两点:

来源:马哥Linux运维内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯