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

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

这是我时不时看到的一个老问题。我对它的理解相当有限(很久以前就读过关于差异的文章,但所涉及的事实从未真正留下印象)。

据我了解,

  • 缓冲区

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

  • 缓存

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

我能为后人得到一个清晰的解释吗?

答案1

“缓存”总数还将包括一些其他内存分配,例如任何 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

您将看到“缓存”值减少了 100Mb,这是您复制到基于 RAM 的文件系统的(假设有足够的可用 RAM,如果机器在内存使用方面已经过度承诺,​​您可能会发现其中一些最终进入了交换区)。每次调用 free 之前的“sync; echo 3 > /proc/sys/vm/drop_caches”应该将所有待处理的内容写入所有写入缓冲区(同步),并从内存中清除所有缓存/缓冲的磁盘块,因此 free 将只读取“缓存”值中的其他分配。

虚拟机(例如在 VMWare 下运行的虚拟机)使用的 RAM 也可能计入 free 的“缓存”值中,当前打开的内存映射文件使用的 RAM 也是如此(这会根据您使用的虚拟机管理程序/版本而有所不同,也可能因内核版本而异)。

因此,它并不像“缓冲区计数待处理的文件/网络写入和缓存计数保存在 RAM 中的最近读取/写入的块以保存未来的物理读取”那么简单,尽管对于大多数目的来说,这个更简单的描述就可以了。

答案2

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

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

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

答案3

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

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

相互作用

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

答案4

释放缓冲区/缓存

警告这解释了一种不推荐在生产服务器上使用的强方法!所以你要注意了,如果出了问题,不要怪我。

为了理解这一点,你可以力量您的系统将尽可能多的内存分配给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
...

实时跟踪掉期的演变。

注意:您必须释放当前目录中尽可能多的可用磁盘空间,您有内存+交换空间

演示
$ 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

注意,我执行此操作的主机使用率很高。这在非常安静的机器上会更加重要。

相关内容