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

这是我经常看到的一个老问题。 我对它的理解是相当有限的(很久以前已经读过了这些差异,但是涉及到的事实并没有真正停留)。

据我了解,

我可以得到一个明确的后代解释?

    “caching”总数还将包括一些其他内存分配,如任何tmpfs filesytems。 要看到这个效果尝试:

    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的“caching”值下降(假设有足够的可用RAM,如果机器已经过度提交,可能会发现其中一部分以交换方式结束的内存使用)。 在每次免费调用之前,“sync; echo 3> / proc / sys / vm / drop_caches”应该在所有写入缓冲区(同步)中写入任何挂起的内容,并从内存中清除所有caching/缓冲的磁盘块, “caching”值中的分配。

    虚拟机(例如在VMWare下运行的)所使用的RAM也可以被计算在空闲的“caching”值中,就像当前打开的内存映射文件所使用的RAM一样(这将取决于正在使用的pipe理程序/版本和也可能在内核版本之间)。

    所以它不像“缓冲器计数待处理文件/networking写入和caching最近读取/写入的块保存在RAM中以保存未来的物理读取”那样简单,尽pipe对于大多数目的而言,这个更简单的描述将会这样做。

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

    缓冲区是还没有被写入磁盘的东西。 caching是从磁盘“读取”并存储起来以备后用的东西。

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

    我在寻找更为清晰的关于缓冲区的描述,并且在"Professional Linux® Kernel Architecture 2008"

    第16章:页面和缓冲区caching

    相互作用

    如果对内核的其他部分没有任何好处,在页面和缓冲区之间build立链接几乎没有什么用处。 如前所述,一些块设备之间的传输操作可能需要以大小取决于底层设备的块大小的单元来执行,而内核的许多部分则倾向于使用页面粒度来执行I / O操作,因为这样做使事情变得更容易 – 特别是在内存pipe理方面。 在这种情况下,缓冲区充当了两个世界之间的中介。

    释放缓冲区/caching

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

    为了理解,你可以强制你的系统把尽可能多的内存委托给cache不是放下caching的文件:

    前言

    在做testing之前,你可以打开另一个窗口:

     $ vmstat -n 1 procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu---- rb 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,我已经做了这个主机是强烈使用。 这将是一个非常安静的机器上更重要。

    RedHat解释说:

    caching页面:

    caching是透明地存储数据的存储器的一部分,以便将来对该数据的请求可以更快地被服务。 该内存被内核用来caching磁盘数据并提高I / O性能。

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

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

    存储在caching中的数据可能是先前计算的值,或者存储在磁盘其他位置的原始值的重复值。 当请求某些数据时,首先检查caching是否包含该数据。 数据可以从caching中获取,而不是从源头获取。

    SysV共享内存段也被认为是caching,尽pipe它们并不代表磁盘上的任何数据。 可以使用ipcs -m命令检查共享内存段的大小并检查字节列。

    缓冲区:

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