在Linux中,缓冲区与缓存之间有什么区别?


179

对我来说,尚不清楚两个Linux内存概念buffer和之间有什么区别cache。我已经阅读了这篇文章,在我看来,它们之间的区别在于有效期政策:

  1. 缓冲区的策略是先进先出
  2. 缓存的策略是“最近最少使用”。

我对吗?

特别是,我正在查看两个命令: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

您应该给我们更多上下文,两个术语的含义不同。您是否在参考free命令输出?
leonbloy 2011年

3
没错,我正在查看两个命令:free,vmstat。查看我的更新。
James.Xu 2011年

1

Answers:


69

“缓冲区”表示有多少RAM专用于缓存磁盘块。“缓存”类似于“缓冲区”,只是这次它缓存文件读取中的页面。

引用自:


3
我已经使用编写大量块的简单python程序对此进行了测试。发生的情况是,而不是该列cache填入了。我认为该列同时计算磁盘写入和磁盘读取,并用于其他用途。free -w -hbufferscachebuffers
CMCDragonkai

@CMCDragonkai感谢您提供的实验证据。有趣的问题是您写的速度是否快于磁盘可能弹出的速度。(例如,同步需要很长时间),这将告诉我们脏块的计数与干净块的计数是否不同。Linux当然会缓存这两种类型(如问题中提到的lru),但是就内存压力而言,其中一种更为严重。
塞斯·罗伯逊

179

缓冲区与特定的块设备关联,并覆盖文件系统元数据的缓存以及跟踪运行中的页面。缓存仅包含驻留的文件数据。也就是说,缓冲区记住目录中的内容,文件权限是什么,并跟踪从特定块设备写入或读取的内存。缓存仅包含文件本身的内容。

报价链接


1
简短且说明充分。谢谢。
curiousguy

84

引用答案(供参考):

简短答案:高速缓存是页面高速缓存的大小。缓冲区是内存中块I / O缓冲区的大小。缓存的事项;缓冲区在很大程度上无关紧要。

长答案:缓存是Linux页面缓存的大小减去交换缓存中的内存,它由SwapCached表示(因此总页面缓存大小为Cached + SwapCached)。Linux通过页面缓存执行所有文件I / O。写操作的实现是简单地将页面缓存中的相应页面标记为脏。然后,刷新程序线程会定期将所有脏页写回到磁盘。通过从页面缓存返回数据来实现读取。如果数据尚未在高速缓存中,则首先填充它。在现代Linux系统上,“缓存”可以轻松达到数GB。它只会响应内存压力而缩小。系统将清除页面缓存以及将数据交换到磁盘上,以根据需要提供更多的内存。

缓冲区是内存中的块I / O缓冲区。他们是相对短暂的。在Linux内核版本2.4之前,Linux具有单独的页面和缓冲区高速缓存。从2.4开始,页面和缓冲区高速缓存是统一的,缓冲区是未在页面高速缓存中表示的原始磁盘块,即不是文件数据。因此,“缓冲区”度量标准的重要性最低。在大多数系统上,缓冲区通常只有几十兆字节。


7
“缓冲区基本上无关紧要”-否。在很多情况下,文件内容缓存不相关,但是将元数据保留在缓存中可以加快处理速度。例如,视频流NAS服务器。
Gunther Piez'6

任何执行大量I / O的系统都会将大量内存用于缓冲区。我正在批量加载一个100GB的MySQL / InnoDB数据库,并且缓冲区一直都超过2GB。
Marcelo Pacheco

21

它并不像这样简单,但是可能有助于理解:

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

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


5
IOW,缓冲区=元数据;缓存=数据;
Freedom_Ben 2014年

13

RedHat解释:

缓存页面:

高速缓存是内存中透明存储数据的部分,以便可以更快地处理对该数据的将来请求。内核利用此内存来缓存磁盘数据并提高I / O性能。

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

当请求任何类型的文件/数据时,内核将寻找用户正在操作的文件部分的副本,如果不存在该副本,它将分配一个新的高速缓存页并将其填充从磁盘中读出适当的内容。

缓存中存储的数据可能是较早计算出的值,也可能是存储在磁盘其他位置的原始值的重复。当请求某些数据时,首先检查缓存以查看其是否包含该数据。从缓存中检索数据要比从源中检索数据更快。

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

缓冲区:

缓冲区是存储在页面缓存下的数据的磁盘块表示。缓冲区包含位于页面缓存下的文件/数据的元数据。示例:当请求页面高速缓存中存在任何数据时,内核首先检查缓冲区中的数据,该数据中包含指向页面高速缓存中包含的实际文件/数据的元数据。一旦从元数据中知道了文件的实际块地址,内核便会对其进行处理。


12

缓冲区和缓存。

缓冲区是尚未“写入”到磁盘的东西。

高速缓存是已从磁盘“读取”并存储以备后用的东西。


2
新用户提示:尽可能使您的答案与问题明确相关。如果我是您,我会在您的答案中添加一个以“所以,以您的示例...”开头的部分,并对此进行详细说明。
Piotr Wadas 2012年

25
我不认为这个答案在相同的上下文,这个问题(即是真实什么Linux内核手段“缓冲区”和“高速缓存”
Freedom_Ben

8

我认为此页面将有助于深入了解缓冲区和缓存之间的区别。http://www.tldp.org/LDP/sag/html/buffer-cache.html

与访问(实际)内存相比,从磁盘读取非常慢。另外,通常在相对较短的时间内多次读取磁盘的同一部分。例如,您可能首先阅读一封电子邮件,然后在回复该信件时将其读入编辑器,然后使该邮件程序在将其复制到文件夹中时再次对其进行阅读。或者,考虑该命令ls在具有许多用户的系统上运行的频率。通过仅从磁盘读取一次信息,然后将其保留在内存中直到不再需要,人们可以加快除第一次读取以外的速度。这称为磁盘缓冲,用于此目的的内存称为缓冲区高速缓存。

不幸的是,由于内存是一种有限的,没有资源的稀缺资源,因此缓冲区高速缓存通常无法足够大(它无法容纳一个人想要使用的所有数据)。当高速缓存已满时,将丢弃最长时间未使用的数据,并将由此释放的内存用于新数据。

磁盘缓冲也适用于写入。一方面,写入的数据通常很快就会再次读取(例如,将源代码文件保存到文件中,然后由编译器读取),因此将写入的数据放入高速缓存是个好主意。另一方面,通过仅将数据放入缓存,而不是立即将其写入磁盘,可以更快地运行写入程序。然后可以在后台完成写操作,而不会降低其他程序的速度。


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

4

塞斯·罗伯森(Seth Robertson)的Link 2说:“要全面理解这些术语,请参阅Linux内核书,例如Robert M. Love的Linux Kernel Development。”

我在本书的第二版中找到了一些有关“缓冲区”的内容。

尽管物理设备本身可在扇区级别寻址,但内核会按块执行所有磁盘操作。

当一个块存储在内存中时(例如,在读取或待写之后),它被存储在“缓冲区”中。每个“缓冲区”都与一个块正好关联。“缓冲区”用作代表内存中磁盘块的对象。

“缓冲区”是单个物理磁盘块的内存中表示。

块I / O操作一次操作一个磁盘块。常见的块I / O操作是读写索引节点。内核提供了Bread()函数,以从磁盘执行低级读取单个块的操作。通过“缓冲区”,磁盘块被映射到其关联的内存页面。”


2

缓冲区包含有助于提高写入性能的元数据

缓存包含文件内容本身(有时尚未写入磁盘),从而提高了读取性能


1

从书中引用: 信息检索简介

快取

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

缓冲

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


0

缓冲区是用于在计算机中将数据从一个位置移动到另一个位置时临时保存数据的内存区域。而高速缓存是一个临时存储区域,可以在其中存储经常访问的数据以进行快速访问。一旦将数据存储在缓存中,就可以通过访问缓存的副本而不是重新获取原始数据来进行将来使用,因此平均访问时间较短。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.