据我所知,
缓冲区
被具有有效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
,您将看到复制到基于ram的文件系统的“ cache”值下降了100Mb(假设存在足够的可用RAM,如果计算机在内存使用方面已被过度使用,则可能会发现其中一些最终被交换掉了)。每次调用free之前,“ sync; echo 3> / proc / sys / vm / drop_caches”应在所有写缓冲区(同步)中写入所有未决的内容,并从内存中清除所有缓存/缓冲的磁盘块,因此free只会读取其他虚拟机(例如,在VMWare下运行的虚拟机)使用的RAM也可以计入free的“缓存”值中,当前打开的内存使用的RAM也会映射文件(这取决于您使用的虚拟机管理程序/版本以及内核版本之间的差异。)
因此,它不像“缓冲区计数待处理的文件/网络写入和缓存的计数那样简单”最近保存在RAM中的最近读取/写入的块,以节省将来的物理读取。”尽管对于大多数目的来说,这种简单的描述也可以。
评论
+1为有趣的细微差别。这是我正在寻找的信息。实际上,我怀疑这些数字是如此复杂,涉及许多不同的活动,因此它们充其量只是一般的指标。
–艾琳·佩恩(Avery Payne)
09年10月10日在17:49
我不认为虚拟机使用的RAM至少在qemu-kvm中算作“缓存”。我注意到,在我的KVM主机上,缓存值不仅太小而不能正确(为1.9 Gig),而且如果我销毁/启动我的一台VM,它的缓存值也不会改变。如果我在其中一台VM上执行tmpfs安装技巧,它也不会改变。我在那里创建了一个800Meg tmpfs分区,“缓存”在VM上显示了正确的值,但在VM主机上没有更改。但是,当我销毁/启动虚拟机时,“使用的”值确实缩小/增长。
– Mike S
16-10-31在14:51
...我在运行内核3.10.0-327的Centos 7.2.1511 VM主机上进行了测试。
– Mike S
16-10-31在14:56
@MikeS:不同的虚拟化解决方案处理内存的方式可能会有所不同,实际上内核在各种版本之间衡量内存使用的方式可能会有所不同。
– David Spillett
16年11月1日在11:23
@MikeS:关于“在其中一台VM上执行tmpfs挂载技巧”-如果主机未显示VM使用的其他内存,则不会影响主机读数。我确实看到了KVM VM本身的影响:dd free = 2020之前,dd free = 1899之后,drop fs free = 2001之后(19Mb的差异将归因于VM上的其他进程,当我运行时它不是空闲的)考试)。主机可能看不到更改:即使VM中的进程可以自由使用内存,内存也可能仍分配给VM。
– David Spillett
16年11月1日在12:04
#2 楼
棘手的问题。计算可用空间时,您实际上需要添加缓冲区并同时缓存两者。我可以找到这
缓冲区是尚未“写入”到磁盘的内容。高速缓存是已从磁盘“读取”并存储以备后用的东西。
http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135
评论
至少在Linux中,这个答案会产生误导。
– petertc
20-2-12在1:57
#3 楼
我一直在寻找有关缓冲区的更清晰描述,并且在"Professional Linux® Kernel Architecture 2008"
中找到了第16章:页面和缓冲区高速缓存
交互作用
如果对内核的其他部分没有好处,则在页面和缓冲区之间建立链接就没有什么用处。如前所述,
某些往返于块设备的传输操作可能需要
,其大小取决于基础设备的块大小,而内核的许多部分更喜欢用页面粒度执行I / O操作,因为这使事情变得更容易
-特别是在内存管理方面。在这种情况下,缓冲区充当两个世界之间的中介。
#4 楼
由RedHat解释:缓存页:
缓存是内存的一部分,透明地存储数据,以便可以更快地处理对该数据的将来请求。内核利用此内存来缓存磁盘数据并提高I / O性能。
Linux内核的构建方式是,它将使用尽可能多的RAM来缓存您的信息。本地和远程文件系统和磁盘。随着时间的流逝,系统会执行各种读写操作,内核会尝试将存储在系统中的各种进程的数据存储在内存中,或将在不久的将来使用的相关进程的数据存储在内存中。进程停止/退出时不会回收高速缓存,但是当其他进程需要更多的内存而不是可用的空闲内存时,内核将通过存储高速缓存数据并将该内存分配给新进程来运行启发式方法来回收内存。
当请求任何类型的文件/数据时,内核将查找用户正在操作的文件部分的副本,如果不存在该副本,则它将分配一个新的高速缓存存储器的页面,并用从磁盘中读出的适当内容填充它。
存储在高速缓存中的数据可能是较早计算出的值,也可能是存储在其他位置的原始值的重复项在磁盘中。当请求某些数据时,首先检查缓存以查看其是否包含该数据。从缓存中检索数据比从源中检索数据更快。
SysV共享内存段也被视为缓存,尽管它们不代表磁盘上的任何数据。可以使用ipcs -m命令并检查bytes列来检查共享内存段的大小。
缓冲区:
缓冲区是页面高速缓存下存储的数据的磁盘块表示。缓冲区包含驻留在页面高速缓存下的文件/数据的元数据。
示例:当请求页面高速缓存中存在任何数据时,首先内核检查包含以下内容的缓冲区中的数据:指向页面缓存中包含的实际文件/数据的元数据。一旦从元数据中知道了文件的实际块地址,内核便会对其进行处理。
#5 楼
释放缓冲区/缓存警告这解释了一种不建议在生产服务器上使用的强方法!
因此请注意,如果出现问题,请不要怪我。
为了理解这一点,您可以强制系统将尽可能多的内存委派给
cache
,而不是删除缓存的文件:Preamble
进行测试之前,您可以打开另一个窗口,点击一下:
$ 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
demo
$ 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,这台主机我已经完成了强烈使用。在真正安静的计算机上,这将更为重要。
评论
-1,如果可以的话。这既(A)与提出的问题无关,又(B)是触发缓存清除的可怕钝器。存在直接的方法来执行后者,因此,通过向其发送数据直到其被冲洗为副作用,诱使系统遵从该规则是不可行的
– underscore_d
2015年10月5日在21:17
天啊!请永远不要在真实服务器上这样做!
– Tamerlaha
18年8月30日在19:08
@Tamerlaha我同意,但是请重新阅读第一段:警告您,不要怪我!目的是显示缓冲区/缓存的含义。
– F. Hauri
18年8月31日在6:30
评论
stackoverflow.com/questions/6345020/…它更像是您在缓冲区中找到的元数据,它与io缓冲区无关。某些内核缓冲区在slab分配器中被占用,但根本不计入缓冲区或高速缓存中。