题 在Linux中,free命令报告的“buffers”和“cache”之间有什么区别?


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

据我了解,

  • 缓冲区

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

  • 高速缓存

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

我可以为后代得到明确的解释吗?


68
2018-06-10 15:46




stackoverflow.com/questions/6345020/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
它更像是在缓冲区中找到的元数据,它与io缓冲区无关。一些内核缓冲区在slab分配器中被考虑,但根本不计入缓冲区或高速缓存内存。 - eckes


答案:


“缓存”总计还将包括一些其他内存分配,例如任何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”应该在所有写入缓冲区(同步)中写入任何待处理的内容,并清除内存中所有缓存/缓冲的磁盘块,这样只有其他内容才会读取其他内容“缓存”值中的分配。

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

因此,它不像“缓冲区计数暂挂文件/网络写入和缓存计数最近读取/写入RAM中保存的块以保存未来的物理读取”一样简单,但是对于大多数目的,这个更简单的描述都可以。


41
2018-06-10 16:26



+1有趣的细微差别。这是我正在寻找的那种信息。事实上,我怀疑这些数字是如此令人费解,因此参与了许多不同的活动,它们至多是一般指标。 - Avery Payne
我不认为虚拟机使用的RAM被视为“缓存”,至少对于qemu-kvm而言。我注意到在我的KVM主机上,缓存值不仅太小而且不能正确(1.9 Gig),但如果我销毁/启动其中一个VM,它不会改变。如果我在其中一个VM上执行tmpfs挂载技巧,它也不会改变。我在那里创建了一个800Meg的tmpfs分区,“缓存”在VM上显示了正确的值,但它在VM主机上没有变化。但是当我销毁/启动我的VM时,“使用”值确实缩小/增长。 - Mike S
...我在运行内核3.10.0-327的Centos 7.2.1511 VM主机上运行测试。 - Mike 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


棘手的问题。计算可用空间时,实际上需要添加缓冲区和缓存。 这是我能找到的

缓冲区是尚未“写入”磁盘的东西。缓存是从磁盘“读取”并存储以供以后使用的东西。

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


8
2018-06-11 12:01





我正在寻找关于缓冲区的更清晰的描述,我找到了 "Professional Linux Kernel Architecture 2008"

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

相互作用

如果设置页面和缓冲区之间的链接没有什么用处   内核的其他部分没有任何好处。如前所述,   可能需要对块设备进行一些传输操作   以大小取决于块大小的单位执行   底层设备,而内核的许多部分更喜欢携带   通过页面粒度进行I / O操作,因为这会使事情变得更加重要   更容易 - 特别是在内存管理方面。在这   情景,缓冲充当两个世界之间的中间人。


5
2018-01-23 08:07





释放缓冲区/缓存

警告 这解释了生产服务器上不推荐的强大方法! 所以你被警告,如果出现问题,不要怪我。

为了理解,你可以  您的系统要尽可能多地委托内存 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

Nota,我做过这件事的主持人是强烈使用的。这对于非常安静的机器来说会更加重要。


2
2018-02-25 13:41



-1如果可以的话。这是(A)与所提出的问题无关,以及(B)触发缓存清除的可怕的钝力方式。存在直接的方法来做后者,因此通过用数据发送垃圾邮件来欺骗系统直到它作为副作用冲洗它是不可辩解的。 - underscore_d
天啊!请永远不要在真正的服务器上这样做! - tamerlaha
@Tamerlaha我是委托人,但请重新阅读第1段: 你被警告过,不要怪我!这样做的目的是显示缓冲区/缓存含义。 - F. Hauri


解释说 红帽

缓存页面:

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

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

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

存储在高速缓存中的数据可能是先前已计算的值,也可能是存储在磁盘其他位置的原始值的副本。当请求某些数据时,首先检查缓存以查看它是否包含该数据。可以从缓存中更快地检索数据,而不是从源源检索数据。

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

缓冲区:

缓冲区是存储在页面缓存下的数据的磁盘块表示。缓冲区包含驻留在页面缓存下的文件/数据的元数据。 示例:当页面缓存中存在任何数据请求时,首先内核检查缓冲区中的数据,这些数据包含指向页面缓存中包含的实际文件/数据的元数据。一旦从元数据中获知文件的实际块地址,内核就会将其拾取以进行处理。


2
2017-10-14 20:36