0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Buffer和Cache的定义

马哥Linux运维 来源:马哥Linux运维 作者:马哥Linux运维 2022-05-13 09:53 次阅读

BufferCache 的定义:

  • Buffer:是原始磁盘块的临时存储,即将缓存数据写入磁盘。它通常不会很大(大约 20MB)。这样,内核就可以将分散的写入集中起来,从而对磁盘写入进行统一优化。例如,多个小的写入可以合并为一个大的写入等。

  • Cache:是用于从磁盘读取文件的页面缓存,用于缓存从文件中读取的数据。这样,下次访问这些文件数据时,可以直接从内存中快速取回,而无需再次访问缓慢的磁盘。

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

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

free 命令

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

$free-h
totalusedfreesharedbuff/cacheavailable
Mem:1.9G1.0G394M2.6M491M728M
Swap:0B0B0B

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

让我们看一下 free 的手册页中的 BufferCache 定义:

buffers
Memoryusedbykernelbuffers(Buffersin/proc/meminfo)
cacheMemoryusedbythepagecacheandslabs(CachedandSReclaimablein/proc/meminfo)
buff/cache
Sumofbuffersandcache

我们可以看到 free 命令的源数据实际上存储在 proc/meminfo 文件中。正如我前面提到的,/procLinux 内核提供的一个特殊的文件系统,它就像一个用户与内核交互的接口

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

Buffers%lu
Relativelytemporarystorageforrawdiskblocksthatshouldn'tgettremendouslylarge(20MBorso).
Cached%lu
In-memorycacheforfilesreadfromthedisk(thepagecache).Doesn'tincludeSwapCached.
...
SReclaimable%lu(sinceLinux2.6.19)
PartofSlab,thatmightbereclaimed,suchascaches.

SUnreclaim%lu(sinceLinux2.6.19)
PartofSlab,thatcannotbereclaimedonmemorypressure.

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

实验

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

写入 Cache

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

c2f2f4ae-d25e-11ec-bce3-dac502259ad0.png

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

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

c3058236-d25e-11ec-bce3-dac502259ad0.png
  • buffcache 就是我们前面看到的 BufferCache,单位是 KB。
  • bibo 分别表示块设备读取和写入的大小,以块/s 为单位。由于 Linux 中的块大小为 1KB,因此这个单位相当于 KB/s。

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

c31a58e6-d25e-11ec-bce3-dac502259ad0.png

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

c32ecd6c-d25e-11ec-bce3-dac502259ad0.png

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

读取 Buffer

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

c34774d4-d25e-11ec-bce3-dac502259ad0.png

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

c36567fa-d25e-11ec-bce3-dac502259ad0.png

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

c37f4dc8-d25e-11ec-bce3-dac502259ad0.png

然后,回到终端 1 观察:

c3991460-d25e-11ec-bce3-dac502259ad0.png

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

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

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

结论

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

  • Buffer:既可以用作“要写入磁盘的数据缓存”,也可以用作“读取磁盘读的数据缓存”。
  • Cache:既可以用作“从读取文件的页面缓存”,也可以用作“写入文件的页面缓存”。

审核编辑 :李倩


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 磁盘
    +关注

    关注

    1

    文章

    365

    浏览量

    25176
  • buffer
    +关注

    关注

    2

    文章

    120

    浏览量

    30015
  • 命令
    +关注

    关注

    5

    文章

    678

    浏览量

    21981

原文标题:Linux 内存中的缓冲区(Buffer)与缓存(Cache)

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Cache和内存有什么区别

    Cache(高速缓存)和内存(Memory,通常指主存储器或RAM)是计算机存储系统中两个重要的组成部分,它们在计算机的性能和数据处理中扮演着不同的角色。以下是对Cache和内存之间区别的详细解析。
    的头像 发表于 09-26 15:28 1001次阅读

    MSPM0 UART通信中DMA和Ring Buffer环形缓冲的应用

    电子发烧友网站提供《MSPM0 UART通信中DMA和Ring Buffer环形缓冲的应用.pdf》资料免费下载
    发表于 09-05 11:01 0次下载
    MSPM0 UART通信中DMA和Ring <b class='flag-5'>Buffer</b>环形缓冲的应用

    解析Arm Neoverse N2 PMU事件L2D_CACHE_WR

    有客户希望我们帮忙分析 Eigen gemm 基准测试的一些执行情况。具体来说是为什么 L1D_CACHE_WR 的值会低于 L2D_CACHE_WR,这种情况令人费解。
    的头像 发表于 09-03 11:42 1179次阅读
    解析Arm Neoverse N2 PMU事件L2D_<b class='flag-5'>CACHE</b>_WR

    Cortex R52内核Cache的具体操作(2)

    本节内容主要讲述CortexR52内核Cache的具体操作包括使缓存无效(invalidate)操作,清除(clean)缓存。有的时候客户可能需要对cache做一些清理,比如invalidate
    的头像 发表于 07-15 15:44 1232次阅读
    Cortex R52内核<b class='flag-5'>Cache</b>的具体操作(2)

    Cortex R52内核Cache的相关概念(1)

    在开始阅读本系列文章之前,请先参阅《有关CR52 MPU配置说明》。因为这篇文章讲述了,cache配置所涉及到的寄存器的设置和MPU的一些基本概念。如果读者都已经理解了上述内容,可以跳过。本章内容主要讲述cache属性的具体含意、注意事项、以及在RZ/T2M的性能测试。
    的头像 发表于 07-15 10:37 1330次阅读
    Cortex R52内核<b class='flag-5'>Cache</b>的相关概念(1)

    CortexR52内核Cache的具体操作

    本节内容主要讲述CortexR52内核Cache的具体操作包括使缓存无效(invalidate)操作,清除(clean)缓存。有的时候客户可能需要对cache做一些清理,比如invalidate
    的头像 发表于 07-15 10:32 1159次阅读
    CortexR52内核<b class='flag-5'>Cache</b>的具体操作

    OpenHarmony语言基础类库【@ohos.buffer (Buffer)】

    Buffer对象用于表示固定长度的字节序列,是专门存放二进制数据的缓存区。
    的头像 发表于 04-23 17:34 821次阅读
    OpenHarmony语言基础类库【@ohos.<b class='flag-5'>buffer</b> (<b class='flag-5'>Buffer</b>)】

    为什么HAL库在操作Flash erase的时候,需要把I-Cache和D-Cache关闭呢?

    请问为什么HAL库在操作Flash erase的时候,需要把I-Cache和D-Cache关闭呢? 这有什么原因呢? 有人可以解答吗?
    发表于 04-07 09:08

    STM32F429使用外部SPI flash,只要执行Bitmap::cache(id)就进入硬件错误怎么解决?

    ,就进入硬件错误。 执行Bitmap::cacheAll()函数也会进入硬件错误。 正常执行cache函数之后会进入TouchGFXHAL::blockCopy()函数,然后执行自定义的拷贝函数,但是
    发表于 03-27 07:39

    请问STM32MP13X的MMU和Cache如何使能?

    STM32MP13X的MMU和Cache如何使能?修改了hal_conf里的DATA_CACHE_ENABLE的宏console里还是显示没开,在设置里的Define symbols把NO_CACHE_USE删了好像还是不行。。
    发表于 03-12 06:46

    请问MINI54 SPI BUFFER怎么用?

    各位前辈,我想请问一下,MINI 54 SPI BUFFER 怎么使用?比如怎么定义,怎么引用。哪位可以告诉我一下,不胜感激。
    发表于 01-17 08:08

    时钟Buffer芯片是什么?其作用是啥?它被用在什么地方?

    时钟Buffer芯片是什么?其作用是啥?它被用在什么地方? 时钟Buffer芯片是一种用于管理和增强电子设备中的时钟信号的集成电路。时钟信号在数字电子设备中非常重要,它用于同步各个模块的工作,确保
    的头像 发表于 01-16 15:10 4052次阅读

    buffercache的区别

    buffercache的区别 缓冲区(Buffer)和缓存(Cache)是计算机系统中用于提高数据读写效率的两个关键概念,它们虽然功能有所重叠,但在实际应用中存在一些差异。在下文中,
    的头像 发表于 12-07 11:00 799次阅读

    CPU Cache是如何保证缓存一致性的?

    我们介绍`CPU Cache`的组织架构及其进行**读操作**时的寻址方式,但是缓存不仅仅只有读操作,还有 **写操作** ,这会带来一个新的问题
    的头像 发表于 12-04 15:05 1325次阅读
    CPU <b class='flag-5'>Cache</b>是如何保证缓存一致性的?

    什么是always on buffer?什么情况下需要插always on buffer

    相比普通的buffer cell,always on buffer(AOB)有secondary always on pin,可以让AOB即使在primary power off的情况下保持on的状态;AOB在secondary pg pin off的情况下也是off的。
    的头像 发表于 12-01 15:31 2361次阅读
    什么是always on <b class='flag-5'>buffer</b>?什么情况下需要插always on <b class='flag-5'>buffer</b>?