it-swarm.cn

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

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

据我了解,

  • 缓冲液

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

  • 快取

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

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

73
Avery Payne

“缓存的”总数还将包括其他一些内存分配,例如任何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的“ cached”值中,因为RAM当前打开时使用的内存映射文件(这取决于您使用的虚拟机管理程序/版本,以及内核版本之间的差异)。

因此,它并不像“缓冲区计数待处理的文件/网络写操作和缓存的计数RAM来保存将来的物理读操作”那样缓存最近的读/写块)那样简单,尽管对于大多数目的来说,这种更简单的描述会做。

41
David Spillett

棘手的问题。在计算可用空间时,您实际上需要添加缓冲区并同时缓存两者。这就是我所能找到的

缓冲区是尚未“写入”到磁盘的东西。高速缓存是已从磁盘“读取”并存储以备后用的东西。

http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135

8
Viky

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

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

相互作用

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

5
c4f4t0r

RedHat解释

缓存页面:

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

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

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

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

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

缓冲区:

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

3
Ijaz Ahmad Khan

释放缓冲区/缓存

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

为了理解,您可以force您的系统将尽可能多的内存委派给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
...

用于实时跟踪交换情况。

Nota:您必须在当前目录中处置掉尽可能多的可用磁盘,并且具有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

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

2
F. Hauri