from : http://hi.baidu.com/hunter6536/item/e18f6a4b3e1fc507c0161309
root@emos ~]# top
Tasks: 131 total, 1 running, 130 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 4138480k total, 3368264k used, 770216k free, 156800k buffers
Swap: 10241428k total, 0k used, 10241428k free, 2783368k cached
我是4G的内存,使用了3个多G,很费解,接着free看看。
[root@emos ~]# free -m
total used free shared buffers cached
Mem: 4041 3288 752 0 153 2718
-/+ buffers/cache: 417 3623
Swap: 10001 0 10001
蓝色部分:
total 内存总数: 4041M;
used 已经使用的内存数: 3288M;
free 空闲的内存数: 752M
shared 不同进程间用来进行数据交换,一般都是0(多个进程共享的内存总额)
buffers 是由各种进程分配的,被用在如输入队列等方面,一个简单的例子如某个进程要求有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存。: 153M
cached 经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被做成cache以方便下次被访问,这样可提供系统性能。:2718M
绿色部分:
(-buffers/cache) used内存数:417M (指的第一部分Mem行中的used – buffers – cached)
( buffers/cache) free内存数: 3623M (指的第一部分Mem行中的free buffers cached)
黄色部分:
交换分区,就不说了,自己也会明白。
我们可能会纳闷儿,蓝色部分(Mem)与绿色部分(-/+ buffers/cache)的结果中,有关used和free为什么这么奇怪?我们可以从二个方面来解释:
对操作系统来讲是Mem的参数buffers和cached 都是属于被使用,它认为free只有752M。
对应用程序来讲是(-/+ buffers/cach),buffers和cached 是等同可用的,buffer和cached是为了提高程序执行的性能,当程序使用内存时,buffer和cached会很快地被使用。
以应用来看看,以(-/+ buffers/cache)的free和used为主.我们看这个就好了.Linux为了提高磁盘和内存存取效率, 开发人员做了很多精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache.前者针对磁盘块的读写,后者针对文件inode的读写.这些Cache能有效缩短了 I/O系统调用(比如read,write,getdents)的时间.
内存是拿来用的,不是拿来看的。不像windows,无论你的真实物理内存有多少,他都要拿硬盘交换文件来读。这也就是windows为什么有时会提示虚拟空间不足的原因。在内存还有大部分的时候,拿出一部分硬盘空间来充当内存,硬盘怎么会快过内存?我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了,这也是linux看内存是否够用的标准。
那么有人说过段时间linux会自动释放掉所用的内存,我们使用free再来试试,看看是否有释放:
[root@emos ~]# free -m
total used free shared buffers cached
Mem: 4041 3288 752 0 153 2718
-/+ buffers/cache: 417 3623
Swap: 10001 0 10001
没有任何变化,那么我们就需要手动释放内存。
/proc是一个虚拟文件系统,我们可以通过对它的读写操作做为与kernel实体间进行通信的一种手段,也就是说可以通过修改/proc中的文件来对当前kernel的行为做出调整。我们可以通过调整/proc/sys/vm/drop_caches来释放内存:
[root@emos ~]# cat /proc/sys/vm/drop_caches //默认为0
0
[root@emos ~]# sync //sync 命令运行 sync 子例程。如果必须停止系统,则运行 sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)
[root@emos ~]# echo 3 > /proc/sys/vm/drop_caches
[root@emos ~]# free -m
total used free shared buffers cached
Mem: 4041 381 3659 0 0 18 //cached被释放
-/+ buffers/cache: 362 3678
Swap: 10001 0 10001
[root@emos ~]# cat /proc/sys/vm/drop_caches //再次查看内核参数变为3了。
3
有效的释放了buffer和cache
有关/proc/sys/vm/drop_caches的用法:
/proc/sys/vm/drop_caches (since Linux 2.6.16)
Writing to this file causes the kernel to drop clean caches,dentries and inodes from memory, causing that memory to becomefree.
To free pagecache, use echo 1 > /proc/sys/vm/drop_caches;
To free dentries and inodes, use echo 2 > /proc/sys/vm/drop_caches;
To free pagecache, dentries and inodes, use echo 3 >/proc/sys/vm/drop_caches.Because this is a non-destructive operation and dirty objects
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.
更详细的解释参考:Difference Between Buffer and Cache
对于共享内存(Shared memory),主要用于在UNIX 环境下不同进程之间共享数据,是进程间通信的一种方法,一般的应用程序不会申请使用共享内存,如果你有兴趣,请参考:What is Shared Memory?
cache 和 buffer的区别:
Cache: 高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。
Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。
Free中的buffer和cache:(它们都是占用内存):
buffer: 作为buffer cache的内存,是块设备的读写缓冲区
cache: 作为page cache的内存, 文件系统的cache
如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的IO会非常小。
Buffer和Cache的区别
缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就无需去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。
缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写如磁盘),也可以通过sync命令手动清空缓冲。