这是我不时看到的一个老问题。我对此的理解是有限的(很久以前就已经读过它们之间的差异,但是所涉及的事实从未真正陷入困境)。
据我了解,
缓冲液
由具有有效I / O操作的程序使用,即正在等待将数据写入磁盘的程序
快取
I / O操作完成的结果,即已刷新的缓冲区或从磁盘读取的数据以满足请求的结果。
我可以为后代获得清晰的解释吗?
这是我不时看到的一个老问题。我对此的理解是有限的(很久以前就已经读过它们之间的差异,但是所涉及的事实从未真正陷入困境)。
据我了解,
缓冲液
由具有有效I / O操作的程序使用,即正在等待将数据写入磁盘的程序
快取
I / O操作完成的结果,即已刷新的缓冲区或从磁盘读取的数据以满足请求的结果。
我可以为后代获得清晰的解释吗?
Answers:
“缓存”总数还将包括其他一些内存分配,例如任何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中的读/写块进行缓存的操作进行计数以节省将来的物理读操作”那样简单,尽管对于大多数目的而言,这种简单的描述可以做到。
棘手的问题。在计算可用空间时,您实际上需要添加缓冲区并同时缓存两者。这就是我所能找到的
缓冲区是尚未“写入”到磁盘的东西。缓存是从磁盘“读取”并存储以备后用的东西。
http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135
RedHat解释:
缓存页面:
高速缓存是内存中透明存储数据的一部分,以便可以更快地处理对该数据的将来请求。内核利用此内存来缓存磁盘数据并提高I / O性能。
Linux内核的构建方式是,它将使用尽可能多的RAM来缓存本地和远程文件系统和磁盘中的信息。随着时间的流逝,系统会执行各种读写操作,内核会尝试将存储在系统中的各种进程的数据或相关进程的数据存储在内存中,这些数据将在不久的将来使用。当进程停止/退出时,不会回收高速缓存,但是当其他进程需要更多的内存而不是可用的空闲内存时,内核将通过存储高速缓存数据并将该内存分配给新进程来运行启发式方法来回收内存。
当请求任何类型的文件/数据时,内核将查找用户正在操作的文件部分的副本,如果不存在该副本,它将分配一个新的高速缓存页并将其填充从磁盘中读出适当的内容。
缓存中存储的数据可能是较早计算出的值,也可能是存储在磁盘其他位置的原始值的重复。当请求某些数据时,首先检查缓存以查看其是否包含该数据。从缓存中检索数据要比从源中检索数据更快。
SysV共享内存段也被视为高速缓存,尽管它们不代表磁盘上的任何数据。可以使用ipcs -m命令并检查bytes列来检查共享内存段的大小。
缓冲区:
缓冲区是页面高速缓存下存储的数据的磁盘块表示。缓冲区包含位于页面高速缓存下的文件/数据的元数据。示例:当请求页面高速缓存中存在任何数据时,内核首先检查缓冲区中的数据,该数据中包含指向页面高速缓存中包含的实际文件/数据的元数据。一旦从元数据中知道了文件的实际块地址,内核便会对其进行处理。
警告这说明了不建议在生产服务器上使用的强大方法!因此请注意,如果出现问题,请不要怪我。
为了理解这一点,您可以强制系统委派尽可能多的内存,而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
注意,我已经做到这一点的主机被广泛使用。在真正安静的计算机上,这将更为重要。