在Linux中,free命令报告的“缓冲区”和“缓存”之间有什么区别?


73

这是我不时看到的一个老问题。我对此的理解是有限的(很久以前就已经读过它们之间的差异,但是所涉及的事实从未真正陷入困境)。

据我了解,

  • 缓冲液

    由具有有效I / O操作的程序使用,即正在等待将数据写入磁盘的程序

  • 快取

    I / O操作完成的结果,即已刷新的缓冲区或从磁盘读取的数据以满足请求的结果。

我可以为后代获得清晰的解释吗?



它更像是您在缓冲区中找到的元数据,它与io缓冲区无关。一些内核缓冲区在slab分配器中说明,但根本不计入缓冲区或高速缓存中。
eckes

Answers:


42

“缓存”总数还将包括其他一些内存分配,例如任何tmpfs文件系统。要查看此效果,请尝试:

mkdir t
mount -t tmpfs none t
dd if=/dev/zero of=t/zero.file bs=10240 count=10240
sync; echo 3 > /proc/sys/vm/drop_caches; free -m
umount t
sync; echo 3 > /proc/sys/vm/drop_caches; free -m

并且您会看到复制到基于ram的文件系统的“缓存”值下降了100Mb(假设有足够的可用RAM,如果机器已经在使用方面过度使用,您可能会发现其中一些最终以交换方式结束了内存使用情况)。每次调用free之前,“ sync; echo 3> / proc / sys / vm / drop_caches”应在所有写缓冲区(同步)中写入所有未决的内容,并从内存中清除所有缓存/缓冲的磁盘块,因此free只会读取其他分配在“已缓存”值中。

虚拟机(例如在VMWare下运行的虚拟机)使用的RAM也可能计入free的“缓存”值中,当前打开的内存映射文件使用的RAM也将计入其中(这取决于您所使用的虚拟机管理程序/版本,以及也可能在内核版本之间)。

因此,它并不像“缓冲区对未决的文件/网络写操作进行计数,而对最近保存在RAM中的读/写块进行缓存的操作进行计数以节省将来的物理读操作”那样简单,尽管对于大多数目的而言,这种简单的描述可以做到。


1
+1为有趣的细微差别。这是我正在寻找的信息。实际上,我怀疑这些数字太复杂了,参与了许多不同的活动,因此它们充其量只是一般的指标。
艾利·佩恩

我不认为虚拟机使用的RAM至少在qemu-kvm中算作“缓存”。我注意到,在我的KVM主机上,缓存值不仅太小而无法正确(为1.9 Gig),而且如果我销毁/启动我的一台VM,它的缓存值也不会改变。如果我在其中一台VM上执行tmpfs安装技巧,它也不会改变。我在那里创建了一个800Meg tmpfs分区,“缓存”在VM上显示了正确的值,但在VM主机上没有更改。但是,当我销毁/启动虚拟机时,“使用的”值确实缩小/增长。
迈克S

...我在运行内核3.10.0-327的Centos 7.2.1511 VM主机上进行了测试。
迈克S

@MikeS:不同的虚拟化解决方案如何处理内存可能会有所不同,实际上内核在各种版本之间衡量内存使用的方式可能会有所不同。
David Spillett

@MikeS:关于“在其中一台VM上执行tmpfs挂载技巧”-如果它们未显示VM使用的其他内存,则不会影响主机读数。我确实看到了KVM VM本身的影响:dd free = 2020之前,dd free = 1899之后,drop fs free = 2001之后(19Mb的差异将归因于VM上的其他进程,当我运行时它不是空闲的)考试)。主机可能看不到更改:即使VM中的进程可以免费使用该内存,也可能仍将其分配给VM。
David Spillett


5

我一直在寻找有关缓冲区的更清晰的描述,我发现 "Professional Linux® Kernel Architecture 2008"

第16章:页面和缓冲区高速缓存

相互作用

如果内核的其他部分没有好处,则在页面和缓冲区之间建立链接几乎没有用。如前所述,某些往返于块设备的传输操作可能需要以其大小取决于基础设备的块大小的单位执行,而内核的许多部分更喜欢以页面粒度执行I / O操作,因为使事情变得容易得多-特别是在内存管理方面。在这种情况下,缓冲区充当两个世界之间的中介。


3

RedHat解释:

缓存页面:

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

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

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

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

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

缓冲区:

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


2

释放缓冲区/缓存

警告这说明了不建议在生产服务器上使用的强大方法!因此请注意,如果出现问题,请不要怪我。

为了理解这一点,您可以强制系统委派尽可能多的内存,而cache不是删除缓存的文件:

前言

在进行测试之前,您可以打开另一个窗口:

$ vmstat -n 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  1  39132  59740  39892 1038820    0    0     1     0    3    3  5 13 81  1
 1  0  39132  59140  40076 1038812    0    0   184     0 10566 2157 27 15 48 11
...

用于实时跟踪交换情况。

注意:您必须在当前目录中处置尽可能多的可用磁盘,并且具有mem + swap

演示
$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    2004320      60076          0      90740     945964
-/+ buffers/cache:     967616    1096780
Swap:      3145720      38812    3106908

$ tot=0
$ while read -a line;do
      [[ "${line%:}" =~ ^(Swap|Mem)Total$ ]] && ((tot+=2*${line[1]}))
    done </proc/meminfo
$ echo $tot
10420232

$ dd if=/dev/zero of=veryBigFile count=$tot
10420232+0 records in
10420232+0 records out
5335158784 bytes (5.3 GB) copied, 109.526 s, 48.7 MB/s

$ cat >/dev/null veryBigFile

$ free
             total       used       free     shared    buffers     cached
Mem:       2064396    2010160      54236          0      41568    1039636
-/+ buffers/cache:     928956    1135440
Swap:      3145720      39132    3106588

$ rm veryBigFile 

$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    1005104    1059292          0      41840      48124
-/+ buffers/cache:     915140    1149256
Swap:      3145720      39132    3106588

注意,我已经做到这一点的主机被广泛使用。在真正安静的计算机上,这将更为重要。


1
-1,如果可以的话。这既(A)与提出的问题无关,又(B)触发缓存清除的可怕钝器。存在直接的方法来执行后者,因此,通过向系统发送数据垃圾邮件来欺骗系统,直到其被刷新为副作用,这是不可行的
underscore_d 2015年

天啊!请永远不要在真实服务器上这样做!
tamerlaha

@Tamerlaha我同意,但是请重新阅读第一段: 警告您,不要怪我!目的是显示缓冲区/缓存的含义。
F. Hauri '18
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.