Linux中缓冲区和高速缓存的区别是什么?

201

对我来说,Linux内存概念中的buffercache之间的区别不是很清楚。我阅读了这篇文章,我认为它们之间的区别是到期策略:

  1. buffer的策略是先进先出
  2. cache的策略是最近最少使用。

我理解的对吗?

特别地,我正在研究两个命令:freevmstat

james@utopia:~$ vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
5  0      0    173     67    912    0    0    19    59   75 1087 24  4 71  1
james@utopia:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2007       1834        172          0         67        914
-/+ buffers/cache:        853       1153
Swap:         2859          0       2859

1
你也可以访问http://unix.stackexchange.com/。 - leonbloy
14个回答

200
缓存区(Buffers)与特定块设备相关联,涵盖了文件系统元数据的缓存和在途页面的跟踪。缓存仅包含停放的文件数据,即缓存区记住目录中有什么,文件权限是什么,并跟踪写入或读取特定块设备的内存。缓存仅包含文件本身的内容。
参考链接:quote link

90

引用答案(供参考):

简短回答:Cached是页面缓存的大小。Buffers是内存中块I/O缓冲区的大小。 Cached很重要; Buffers几乎不重要。

长回答:Cached是Linux页面缓存的大小,减去交换缓存中的内存,由SwapCached表示(因此总页缓存大小为Cached + SwapCached)。 Linux通过页面缓存执行所有文件I/O。 写入操作仅将页面缓存中相应页面标记为脏,然后刷新线程定期将任何脏页面写回磁盘。 读取操作通过从页面缓存返回数据实现。 如果数据尚未在缓存中,则首先填充数据。在现代Linux系统上,Cached可以很容易地达到数GB。 它只会在有内存压力时才会缩小。 系统将清除页面缓存以及交换数据到磁盘以释放更多内存。

Buffers是内存中的块I/O缓冲区。它们寿命相对较短。在Linux内核版本2.4之前,Linux具有单独的页面和缓冲区缓存。自从2.4以来,页面和缓冲区缓存已统一,Buffers是未在页面缓存中表示的原始磁盘块,即不是文件数据。 Buffers指标因此几乎不重要。 在大多数系统上,Buffers通常只有几十MB。


8
“缓冲区在很大程度上是无关紧要的” - 不对。在许多情况下,文件内容缓存可能无关紧要,但保留元数据缓存可以加快速度。例如视频流媒体NAS服务器。 - Gunther Piez
任何执行大量I/O操作的系统都会使用大量内存进行缓冲。我正在批量加载一个100GB的MySQL/InnoDB数据库,缓冲区始终超过2GB。 - Marcelo Pacheco

74

4
我已经使用一个简单的Python程序进行了测试,它可以写入大量数据块。结果是cache被填满了,如free -w -h所报告的那样,而不是buffers列。我认为cache列计算了磁盘读写,而buffers用于其他用途。 - CMCDragonkai
@CMCDragonkai 感谢您提供的实验证据。有趣的问题是,您是否比磁盘刷新速度更快地写入了数据。(例如,sync 命令需要很长时间)这将告诉我们脏块和干净块是否被不同地计算。Linux 肯定会缓存这两种类型的块(如问题中提到的 LRU),但其中一种在内存压力方面更为严重。 - Seth Robertson

26

这并不是'完全'简单,但可能有助于理解:

缓冲区用于存储文件元数据(权限、位置等),每个内存页都在此处跟踪。

缓存用于存储实际的文件内容。


7
换言之,缓冲区等同于元数据;高速缓存等同于数据。 - Freedom_Ben

25

Red Hat 解释:

缓存页:

缓存是内存的一部分,可以透明地存储数据,以便将来请求该数据时可以更快地提供服务。内核利用这个内存来缓存磁盘数据并提高 I/O 性能。

Linux 内核构建成这样的方式,它会尽可能利用 RAM 缓存本地和远程文件系统和磁盘中的信息。随着时间的推移,在系统上执行各种读写操作时,内核会尝试将数据存储在内存中,这些数据是正在运行或将在不久的将来使用的相关进程的数据。缓存不会在进程停止/退出时被回收,但是当其他进程需要更多内存时,内核将运行启发式算法通过存储缓存数据并将该内存分配给新进程来回收内存。

当请求任何类型的文件/数据时,内核将查找用户所操作的文件的一部分的副本,如果没有这样的副本,则会分配一个新的页面缓存内存,并将适当的内容从磁盘中读取到其中。

存储在缓存中的数据可能是先前计算过的值或存储在磁盘其他位置上的原始值的副本。当请求某些数据时,首先检查缓存是否包含该数据。从缓存中检索数据比从其源起点更快。

SysV 共享内存段也被视为一种缓存,尽管它们不代表磁盘上的任何数据。可以使用 ipcs -m 命令并检查字节列来检查共享内存段的大小。

缓冲区:

缓冲区是存储在页面缓存下的数据的磁盘块表示形式。缓冲区包含存储在页面缓存下的文件/数据的元数据。

当请求页面缓存中存在的数据时,内核首先检查包含元数据(指向实际文件/数据所在的页面缓存中)的缓冲区中的数据。一旦从元数据中得知了文件的实际块地址,内核就会将其选取进行处理。

5
你有 Red Hat 关于这个内容的来源吗? - Matthias Braun

12

缓冲区和缓存。

缓冲区是指尚未“写入”磁盘的内容。

缓存是指已经从磁盘中“读取”并存储以供以后使用的内容。


2
新用户提示:尽可能清晰地将您的答案与问题相关联。如果我是你,我会在你的答案中添加一个以“所以,根据你的例子…”开头的部分,并稍微详细解释一下。 - Piotr Wadas
25
我认为在相同的语境下,这个回答并不正确(即Linux内核对“缓冲区”和“缓存”的含义)。 - Freedom_Ben

8
Seth Robertson的Link 2说:“要全面了解这些术语,请参考像Robert M. Love的《Linux内核开发》这样的Linux内核书籍。”
我在第二版的书中找到了一些关于'buffer'的内容。
“尽管物理设备本身是可寻址的扇区级别,但内核以块为单位执行所有磁盘操作。”
“当一个块被存储在内存中(例如,在读取后或等待写入时),它被存储在'buffer'中。每个'buffer'都与一个块相关联。'buffer'用作表示内存中磁盘块的对象。”
“'buffer'是单个物理磁盘块的内存表示。”
“块I/O操作一次操作一个磁盘块。常见的块I/O操作是读写inode。内核提供bread()函数来执行从磁盘读取单个块的低级别读取。通过'buffers',将磁盘块映射到其关联的内存页面。”

8
我认为这个页面将有助于深入理解缓冲区和缓存之间的差异。从磁盘读取数据与访问(实际)内存相比非常慢。此外,在相对较短的时间内多次读取磁盘的同一部分是很常见的。例如,一个人可能先读取电子邮件消息,然后在回复时将信件读入编辑器中,然后在将其复制到文件夹时再次让邮件程序读取它。或者考虑在具有许多用户的系统上运行命令ls的频率。通过仅从磁盘读取信息一次,然后将其保留在内存中直到不再需要,可以加速除第一次读取以外的所有读取。这称为磁盘缓冲,用于此目的的内存称为缓冲区缓存。
由于内存是一种有限的、稀缺的资源,缓冲区缓存通常不能足够大(它无法容纳所有人想要使用的数据)。当缓存填满时,未使用时间最长的数据被丢弃,因此释放的内存用于新数据。
磁盘缓存也适用于写操作。一方面,写入的数据往往很快就会被再次读取(例如,源代码文件保存到文件中,然后由编译器读取),因此将写入的数据放入缓存是个好主意。另一方面,仅将数据放入缓存而不立即写入磁盘,可以使进行写入的程序运行更快。然后可以在后台执行写入操作,而不会减慢其他程序的运行速度。

1
这解释了缓冲高速缓存是什么,但并没有解释vmstat和free命令输出中缓冲区和高速缓存之间的区别。 - Roel Schroeven

7

书中引用:

《信息检索导论》

缓存

我们希望尽可能多地将数据保留在内存中,特别是那些需要频繁访问的数据。我们把在主内存中保留经常使用的磁盘数据的技术称为缓存。

缓冲区

操作系统通常会读取和写入整个块。因此,从磁盘读取一个字节所需的时间可能与读取整个块的时间相同。8、16、32和64千字节(KB)的块大小很常见。我们把正在读取或写入的块存储在主内存中的部分称为缓冲区。


5

缓冲区(Buffer)是用于在数据从一个地方移动到另一个地方时临时存储数据的内存区域。

缓存(Cache)是用于存储频繁访问的数据以实现快速访问的临时存储区域。一旦数据存储在缓存中,将来可以通过访问缓存副本而不是重新获取原始数据来进行使用,从而平均访问时间更短。

注意:缓冲区和缓存也可以分配在磁盘上。


数据从一个地方移动到另一个地方。您的意思是这些数据已经从磁盘中读取,现在正在被写入其他地方吗? - Radical Ed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接