Jam*_*.Xu 166 linux memory buffer caching
对我来说,目前尚不清楚两种Linux内存概念之间的区别是什么:buffer和cache.我已经阅读了这篇文章,在我看来,它们之间的区别在于过期政策:
我对吗?
特别是,我正在看两个命令:free和vmstat
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
Run Code Online (Sandbox Code Playgroud)
soc*_*air 79
简短回答:缓存是页面缓存的大小.缓冲区是内存块I/O缓冲区的大小.缓存事项; 缓冲区在很大程度上无关紧要.
答案很长:缓存是Linux页面缓存的大小,减去交换缓存中的内存,由SwapCached表示(因此总页面缓存大小为Cached + SwapCached).Linux通过页面缓存执行所有文件I/O. 写入被实现为简单地将页面缓存中的相应页面标记为脏; 然后,刷新线程会定期将任何脏页写回磁盘.通过从页面缓存返回数据来实现读取; 如果数据尚未在缓存中,则首先填充它.在现代Linux系统上,Cached可以很容易地达到几千兆字节.它只会因内存压力而缩小.系统将清除页面缓存以及将数据交换到磁盘,以根据需要提供更多内存.
缓冲区是内存块I/O缓冲区.它们的寿命相对较短.在Linux内核版本2.4之前,Linux具有单独的页面和缓冲区缓存.从2.4开始,页面和缓冲区缓存是统一的,Buffers是未在页面缓存中表示的原始磁盘块,即不是文件数据.因此,缓冲区度量具有最小的重要性.在大多数系统上,缓冲区通常只有几十兆字节.
Set*_*son 64
"缓冲区"表示有多少RAM专用于缓存磁盘块."缓存"类似于"缓冲区",只是这次它从文件读取中缓存页面.
引用自:
n00*_*ber 20
它不是那么简单,但它可能有助于理解:
缓冲区用于存储文件元数据(权限,位置等).每个内存页面都在这里跟踪.
缓存用于存储实际文件内容.
小智 11
缓冲区和缓存.
缓冲区是尚未"写入"磁盘的东西.
缓存是从磁盘"读取"并存储以供以后使用的东西.
Ija*_*han 10
由RedHat解释:
缓存页面:
缓存是内存的一部分,它透明地存储数据,以便可以更快地提供对该数据的未来请求.内核利用此内存来缓存磁盘数据并提高I/O性能.
Linux内核以这样的方式构建,即它将使用尽可能多的RAM来缓存来自本地和远程文件系统和磁盘的信息.随着时间的推移,在系统上执行各种读写操作,内核会尝试将数据存储在内存中,以用于系统上运行的各种进程或将在不久的将来使用的相关进程的数据.缓存是不是在当时回收的时候处理得停止/退出,但是当其他进程需要更多的内存,则免费可用内存,内核将运行启发式通过存储高速缓存数据和分配内存以新工艺回收内存.
当请求任何类型的文件/数据时,内核将查找用户正在操作的文件部分的副本,如果不存在此类副本,它将分配一个新页面的高速缓存并填充它从磁盘中读出适当的内容.
存储在高速缓存中的数据可能是先前已计算的值,也可能是存储在磁盘中其他位置的原始值的副本.当请求某些数据时,首先检查缓存以查看它是否包含该数据.可以从缓存中更快地检索数据,而不是从源源检索数据.
SysV共享内存段也被视为缓存,但它们不代表磁盘上的任何数据.可以使用ipcs -m命令检查共享内存段的大小并检查bytes列.
缓冲区:
缓冲区是存储在页面缓存下的数据的磁盘块表示.缓冲区包含驻留在页面缓存下的文件/数据的元数据.示例:当页面缓存中存在任何数据请求时,首先内核检查缓冲区中的数据,这些数据包含指向页面缓存中包含的实际文件/数据的元数据.一旦从元数据中知道文件的实际块地址,就由内核拾取它以进行处理.
我认为这个页面将有助于深入理解缓冲区和缓存之间的区别.http://www.tldp.org/LDP/sag/html/buffer-cache.html
与访问(真实)内存相比,从磁盘读取速度非常慢.另外,通常在相对较短的时间段内多次读取磁盘的相同部分.例如,可能首先阅读电子邮件消息,然后在回复时将该字母读入编辑器,然后使邮件程序在将其复制到文件夹时再次读取它.或者,考虑ls在具有许多用户的系统上运行命令的频率.通过仅从磁盘读取信息一次然后将其保留在内存中直到不再需要为止,可以加速除第一次读取之外的所有信息.这称为磁盘缓冲,用于此目的的内存称为缓冲区缓存.
不幸的是,由于内存是一种有限的,不可靠的稀缺资源,缓冲区缓存通常不够大(它无法容纳所有想要使用的数据).当高速缓存填满时,丢弃最长时间未使用的数据,并将由此释放的存储器用于新数据.
磁盘缓冲也适用于写入.一方面,写入的数据通常很快就会再次读取(例如,源代码文件保存到文件中,然后由编译器读取),因此将写入缓存的数据放在缓存中是个好主意.另一方面,通过仅将数据放入缓存中,而不是立即将其写入磁盘,写入的程序运行得更快.然后可以在后台完成写入操作,而不会减慢其他程序的速度.
缓存
我们希望在内存中保留尽可能多的数据,尤其是那些我们需要经常访问的数据。我们将这种将经常使用的磁盘数据保存在主内存中的技术称为缓存。
缓冲
操作系统通常读取和写入整个块。因此,从磁盘读取单个字节所花费的时间与读取整个块所花费的时间一样多。常见的块大小为 8、16、32 和 64 KB。我们将主存中存储正在读取或写入的块的部分称为缓冲区。
小智 5
缓冲区是一块内存区域,用于在数据从一个地方移动到另一个地方时临时存储数据。
缓存是一个临时存储区域,用于存储经常访问的数据以实现快速访问。一旦数据存储到缓存中,以后的使用就可以通过访问缓存的副本来完成,而不是重新获取原始数据,从而平均访问时间更短。
注意:缓冲区和缓存也可以在磁盘上分配
小智 5
Seth Robertson 的 Link 2 说“要彻底理解这些术语,请参阅 Linux 内核书籍,例如 Robert M. Love 的 Linux Kernel Development”。
我在本书的第二版中找到了一些关于“缓冲”的内容。
尽管物理设备本身可以在扇区级别进行寻址,但内核以块的形式执行所有磁盘操作。
当一个块存储在内存中时(例如,在读取或挂起写入之后),它存储在“缓冲区”中。每个“缓冲区”都与一个块相关联。“缓冲区”用作表示内存中磁盘块的对象。
“缓冲区”是单个物理磁盘块的内存表示。
块 I/O 操作一次操作一个磁盘块。一个常见的块 I/O 操作是读取和写入 inode。内核提供了bread() 函数来执行从磁盘的单个块的低级读取。通过“缓冲区”,磁盘块被映射到它们相关的内存页面。”