linux buffer 与 cache 的区别。
A buffer is something that has yet to be "written" to disk.
A cache is something that has been "read" from the disk and stored for later use.
两者都是RAM中的数据。简单来说,buffer(缓冲)是即将要被写入磁盘的,而cache(缓存)是被从磁盘中读出来的
缓冲(buffers)
缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据
的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据 时,
速度快的设备的操作进程不发生间断
是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写磁盘),也可以通过sync命令手动清空缓冲。举个例子吧:我这里有一个ext2的U盘,我往里面cp一个3M的 MP3,但U盘的灯没有跳动,过了一会儿(或者手动输入sync)U盘的灯就跳动起来了。卸载设备时会清空缓冲,所以有些时候卸载一个设备时要等上几秒钟。
缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘
其实这缓存内存(Cache Memory)在你需要使用内存的时候会自动释放,所以你不必担心没有 内存可用。
如果你希望手动去释放Cache Memory也是可以的
如何手工释放Cache Memory(缓存内存), 用下面的命令可以释放Cache Memory:
To free pagecache
$sync; echo 1>/proc/sys/vm/drop_caches
To free dentries and inodes:
$sync; echo 2>/proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
$sync; echo 3>/proc/sys/vm/drop_caches
注意,释放前最好sync一下,防止丢失数据。
2. 解释 free 命令
free命令中的buffer和cache:(它们都是占用内存):
buffer : 作为buffer cache的内存,是块设备的读写缓冲区
cache: 作为page cache的内存, 文件系统的cache
#这个命令行用来调查谁在加数据入page_cache
[[email protected] ~]# stap -e ‘probe vfs.add_to_page_cache {printf("dev=%d, devname=%s, ino=%d, index=%d, nrpages=%d/n", dev, devname, ino, index, nrpages )}‘
...
dev=2, devname=N/A, ino=0, index=2975, nrpages=1777
$ free
total used free shared buffers cached
Mem: 255268 238332 16936 0 85540 126384
-/+ buffers/cache: 26408 228860
Swap: 265000 0 265000
Mem:表示物理内存统计
-/+ buffers/cached:表示物理内存的缓存统计
Swap:表示硬盘上交换分区的使用情况,这里我们不去关心。
系统的总物理内存:255268Kb(256M),但系统当前真正可用的内存b并不是第一行free 标记的 16936Kb,它仅代表未被分配的内存。
我们使用total1、used1、free1、used2、free2 等名称来代表上面统计数据的各值,1、2 分别代表第一行和第二行的数据。
total1:表示物理内存总量。
used1:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
free1:未被分配的内存。
shared1:共享内存,一般系统不会用到,这里也不讨论。
buffers1:系统分配但未被使用的buffers 数量。
cached1:系统分配但未被使用的cache 数量。buffer 与cache 的区别见后面。
used2:实际使用的buffers 与cache 总量,也是实际使用的内存总量。
free2:未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存。
可以整理出如下等式:
total1 = used1 + free1
total1 = used2 + free2
used1 = buffers1 + cached1 + used2
free2 = buffers1 + cached1 + free1
可见,used2 是真正使用的, 比used1 小, used1 包含分配但未使用内存。
free2 是真正可使用的。比free1 大,free1 未包含分配但未使用内存
实验:
读程序 看cache 会越来越大
写程序 看buffer 会越来越大