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

    文章

    401

    浏览量

    26592
  • buffer
    +关注

    关注

    2

    文章

    120

    浏览量

    31184
  • 命令
    +关注

    关注

    5

    文章

    759

    浏览量

    23924

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    DPA2 DPSW 端口报告 dpsw_cnt_ing_no_buffer_discard:xxxx 错误怎么解决?

    我们发现DPSW能达到的max_rate只有900Mps, 使用 Restool 我们找到 DPSW 报告 dpsw_cnt_ing_no_buffer_discard:22262XXX DPSW
    发表于 04-16 08:00

    失调电压的定义、测量与校正办法

    失调电压的定义、测量与校正办法
    的头像 发表于 04-10 16:08 103次阅读
    失调电压的<b class='flag-5'>定义</b>、测量与校正办法

    忆联自研芯片以压缩技术重塑KV Cache存储效率

    2026年3月,谷歌研究院发布TurboQuant压缩算法技术,迅速在存储与AI基础设施领域引发热议。该算法能够压缩KV缓存,实现内存占用降低6倍、推理速度提升8倍的潜力。这一技术突破的背后,折射出大模型推理时代最核心的硬件瓶颈:KV Cache正成为制约AI部署规模的“内存吞金兽”。
    的头像 发表于 04-10 14:10 401次阅读

    在GUI GUIDER中如何启用eSingle Buffer

    这一问题,行业长期依赖双缓冲(Ping-pong Buffer) 或 多缓冲(Multi Buffer),用更多显存换来更稳定的刷新体验。
    的头像 发表于 02-09 09:43 874次阅读
    在GUI GUIDER中如何启用eSingle <b class='flag-5'>Buffer</b>

    请问030系列集成的PreFetch 和 Cache怎么用呀?

    各位大佬,030系列集成的PreFetch 和 Cache怎么用呀?有这方面的demo或者pdf操作流程么?
    发表于 01-19 07:07

    深入解析DS25MB100:2.5 Gbps 2:1/1:2 CML Mux/Buffer的卓越性能与应用

    深入解析DS25MB100:2.5 Gbps 2:1/1:2 CML Mux/Buffer的卓越性能与应用 一、引言 在高速数据通信领域,信号的高效传输和处理至关重要。DS25MB100作为一款
    的头像 发表于 12-27 14:10 786次阅读

    瑞萨RA系列FSP库开发实战指南之定义传输源和目标存储器

    首先,要使用DMA传输,就肯定要有一个源地址和一个目标地址,这里我们定义SRC_Buffer数组的首地址作为源地址,DST_Buffer数组的首地址作为DMAC传输的目标地址。SRC_Buff
    的头像 发表于 12-15 11:09 4377次阅读
    瑞萨RA系列FSP库开发实战指南之<b class='flag-5'>定义</b>传输源和目标存储器

    采用Prefetch+Cache架构有什么优势?

    我看官方说,采用Prefetch+Cache架构同频CoreMark 计算力/功耗比超越同类产品,这优势就是低功耗么?要是具体芯片比较的话,应该怎么比?
    发表于 12-11 07:35

    单片机内部FLASH字节操作

    buff [*][i]{ [*][i]cache.u32data=FLSAH_ReadWord(pageaddr+i); [*][i]buffer[i]=cache.buf[0]; [*][i][i
    发表于 11-24 06:40

    STM32H7使用Serial V2框架配合DMA,可以修改DMA的buffer内存位置吗?

    因为主内存设置在了dtcm,不能被dma访问,然而serial v2框架开启dma,缓存使用的是动态分配的内存,要如何修改buffer位置呢
    发表于 10-09 07:04

    USB读RAM buffer使用规范建议

    Questions:硬件和软件同时去访问 USB RAM buffer 造成数据乱掉或丢失 造成乱码流程: 软件设置 USB Valid 关总中断,USB 收数据到 RAM Buffer,此时
    发表于 09-22 17:27

    gd32h737 开启cache程序跑飞是哪里的问题?

    gd32h737 在rtthread 4.1.1版本上运行,开启cache功能,程序跑飞,JLink连接失败的。错误信息没有。配置方式的说明吗? /*! briefenable the CPU
    发表于 09-11 08:28

    什么情况会导致BUFFER_RYD一直为低电平?

    ,在c++ streamer中检测是否成接收到USB_BULK数据,结果显示4014可以接收到USB_BULK数据,4024不能接收到USB_BULK数据。结果如下图: 2、BUFFER_RDY信号
    发表于 08-14 06:21

    STM32H7的MPU配置与D-Cache冲突如何解决?​​

    现象​​: STM32H743 MPU 与 D-Cache 冲突问题详细描述** 硬件环境 MCU 型号 :STM32H743VIT6 开发板 :自定义板(或 STM32H743I-EVAL 等
    发表于 06-23 17:32

    HarmonyOS应用自定义键盘解决方案

    定义键盘是一种替换系统默认键盘的解决方案,可实现键盘个性化交互。允许用户结合业务需求与操作习惯,对按键布局进行可视化重构、设置多功能组合键位,使输入更加便捷和舒适。在安全防护层面,自定义键盘可以
    的头像 发表于 06-05 14:19 2619次阅读