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

b6b638a57d9e0defa98fa1c979f7f44c.gif

更多专业文档请访问 www.itilzj.com

BufferCache 的定义:

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

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

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

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

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

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

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

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 中,BuffersCached 的定义如下:

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,让我们先清理缓存

f554fc07850cd57b113e457c8479140e.png

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

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

0add5bde02caccc265925fb466138e7d.png
  • buffcache 就是我们前面看到的 BufferCache,单位是 KB。

  • bibo 分别表示块设备读取和写入的大小,以块/s 为单位。由于 Linux 中的块大小为 1KB,因此这个单位相当于 KB/s。

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

d3ad0e7695b415a0781a026570859279.png

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

d3f4cced2148a6412d731e6d531aff59.png

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

读取 Buffer

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

2db60266602d329a6d902612f8110ae3.png

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

b9147f5beb78f4fb63a6e148d4add174.png

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

1fe30bfc1a7d6904f9d7d76543f34a66.png

然后,回到终端 1 观察:

697c9105a257a73ca792e7647aa4fb3b.png

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

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

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

结论

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

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

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

福利

系统/网络/应用运维人员的交流圈子,不定期为您提供运维技术领域前沿资讯/培训课程/独家技术手册/运维工具/文档模板等,行业大咖分享交流/同行经验分享互动,期待你的加入!扫码即可加入。

随着材料不断增多社群会不定期涨价早加入更优惠

c5a5e4d4ebbee78e30af164b1319176a.png

公众号发送如下关键字获取免费资料:

1.网络安全技术资料--回复"1"

2.容器云运维资料包--回复"2"

3.Python学习资料--回复"3"

4.Devops学习视频课件--回复"4"

5.Linux运维技术资料--回复"5"

免责声明:

本公众号部分分享的资料来自网络收集和整理,所有文字和图片版权归属于原作者所有,且仅代表作者个人观点,与本公众号无关,文章仅供读者学习交流使用,并请自行核实相关内容,如文章内容涉及侵权,请联系后台管理员删除。

70bf4cc20c8cec7b1d1e6621f2864a1f.png

更多推荐

           

如何用 10 行 bash shell 脚本监控 Linux?

如何监测 Linux 的磁盘 I/O 性能

Linux的10个最危险命令

100个Linux Shell脚本经典案例(附PDF)

探讨 DNS 解析

       
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Linuxbuffer cache内存是指用于缓存磁盘数据的一块内存区域。当应用程序需要读取磁盘上的数据时,操作系统会将数据读入buffer cache,以便下次读取时可以直接从内存获取,避免频繁的磁盘访问,提高系统性能。同时,当应用程序需要写入数据时,操作系统也会将数据写入buffer cache,然后再异步地将数据写入磁盘,以提高写入效率。buffer cache内存的大小可以通过系统参数进行配置,一般情况下会根据系统内存大小和磁盘访问情况进行调整。 ### 回答2: 在Linux操作系统buffer cache缓冲区高速缓存)是用来提高文件系统性能的一种机制,是内核将经常访问的数据缓存内存的一部分。它的主要作用是降低磁盘I/O操作的延迟,提高文件系统的读取和写入速度。 Buffer cache是由内核维护的一块内存区域,它存储了最近被读取或写入的文件块数据。当应用程序需要读取文件时,内核会首先查找buffer cache,如果要读取的文件块在cache,则直接从cache读取数据,避免了磁盘I/O操作。如果要写入数据到文件,内核会将数据写入buffer cache,并在适当的时机将数据同步到磁盘上。 buffer cache的大小是动态调整的,根据系统的负载和需求进行自动调整。内核会根据当前系统内存的可用情况和其它进程的需求来判断是否需要释放部分buffer cache内存。如果系统内存紧张,内核会减少buffer cache的大小,以释放内存供其它进程使用;如果系统内存较为充足,内核会增加buffer cache的大小,以提高文件系统的性能。 使用buffer cache可以大幅提高文件系统的性能,尤其是对于频繁的读取和写入操作。通过将经常访问的数据缓存内存,可以减少对磁盘的访问次数,大大降低了I/O延迟带来的性能损耗。同时,缓存内存的数据可以更快地供应给应用程序,提高了文件系统的响应速度。 总之,buffer cacheLinux操作系统的一种内存机制,用来提高文件系统的性能。它通过将经常访问的数据缓存内存,减少磁盘I/O操作,提高文件系统的读取和写入速度。同时,buffer cache的大小会根据系统的负载和需求进行动态调整,以确保系统内存使用和性能的平衡。 ### 回答3: 在Linux操作系统buffer cache是一种磁盘I/O缓存机制,用于提高文件系统的访问性能。 当应用程序读取文件时,操作系统将文件的内容从磁盘读取到内存buffer cache。如果下次再次读取同样的文件内容,操作系统可以直接从buffer cache读取,而不需要再次去磁盘访问。这样可以显著减少磁盘I/O操作,提高读取文件的速度。 类似地,当应用程序对文件进行写入时,数据首先被写入到buffer cache,然后操作系统可以根据需要决定何时将数据刷新到磁盘。这样可以将多个小的写入操作合并为一个大的写入操作,减少了磁盘I/O的负担,并提高了写入文件的效率。 Buffer cache内存的大小是动态分配的,它根据系统的需要自动增加或减少。当文件系统需要更多的内存时,它会从系统获取一部分内存作为buffer cache,用于缓存更多的文件内容。当内存不足时,buffer cache会释放一部分内存,以便为其他系统组件提供更多的内存。 使用buffer cache机制可以显著提高文件系统的性能,比如读取和写入文件的速度。然而,buffer cache的使用也存在一些风险,比如在系统发生意外关机的情况下,尚未被写入磁盘的数据将会丢失。因此,在使用buffer cache时需要注意数据的持久性与一致性的问题,确保数据的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值