正确理解linux内存应用

下面转自:http://www.chinaunix.net/jh/4/615686.html

Linux的内存管理,实际上跟windows的内存管理有很相像的地方,都是用虚拟内存这个的概念,说到这里不得不骂MS,为什么在很多时候还有很大的物理内存的时候,却还是用到了pagefile. 所以才经常要跟一帮人吵着说Pagefile的大小,以及如何分配这个问题,在Linux大家就不用再吵什么swap大小的问题,我个人认为,swap设个512M已经足够了,如果你问说512M的SWAP不够用怎么办?只能说大哥你还是加内存吧,要不就检查你的应用,是不是真的出现了memory leak.
夜也深了,就不再说废话了。

在Linux下查看内存我们一般用command free
[root@nonamelinux ~]# free
         total       used       free     shared    buffers     cached
Mem:    386024     377116    8908      0      21280     155468
-/+ buffers/cache:     200368    185656
Swap:    393552        0      393552
下面是对这些数值的解释:
第二行(mem):
total:总计物理内存的大小。
used:已使用多大。
free:可用有多少。
Shared:多个进程共享的内存总额。
Buffers/cached:磁盘缓存的大小。
第三行(-/+ buffers/cached):
used:已使用多大。
free:可用有多少。
第四行就不多解释了。
区别:
第二行(mem)的used/free与第三行(-/+ buffers/cache) used/free的区别。
这两个的区别在于使用的角度来看,第一行是从OS的角度来看,因为对于OS,buffers/cached 都是属于被使用,所以他的可用内存是8908KB,已用内存是377116KB,其中包括,内核(OS)使用+Application(X,oracle,etc)使用的+buffers+cached. 
第三行所指的是从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。
所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached.
如上例:
185656=8908+21280+155468
接下来解释什么时候内存会被交换,以及按什么方交换。
当可用内存少于额定值的时候,就会开会进行交换.
如何看额定值(RHEL4.0):
#cat /proc/meminfo
交换将通过三个途径来减少系统中使用的物理页面的个数: 
1.减少缓冲与页面cache的大小,
2.将系统V类型的内存页面交换出去, 
3.换出或者丢弃页面。(Application 占用的内存页,也就是物理内存不足)。
事实上,少量地使用swap是不是影响到系统性能的。


 nonameboy 回复于:2005-09-22 00:54:46

下面是buffers与cached的区别。
buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages. 
cached是用来给文件做缓冲。
那就是说:buffers是用来存储,目录里面有什么内容,权限等等。
而cached直接用来记忆我们打开的文件,如果你想知道他是不是真的生效,你可以试一下,先后执行两次命令#man X ,你就可以明显的感觉到第二次的开打的速度快很多。
实验:在一台没有什么应用的机器上做会看得比较明显。记得实验只能做一次,如果想多做请换一个文件名。
#free
#man X
#free
#man X
#free
你可以先后比较一下free后显示buffers的大小。
另一个实验:
#free
#ls /dev
#free
你比较一下两个的大小,当然这个buffers随时都在增加,但你有ls过的话,增加的速度会变得快,这个就是buffers/chached的区别。

见:
http://www.redhat.com/advice/tips/meminfo.html
我们就当redhat的东西是比较权威的解释吧:
引用:Buffers: Memory in buffer cache. mostly useless as metric nowadays 
Cached: Memory in the pagecache (diskcache) minus SwapCache 
SwapCache: Memory that once was swapped out, is swapped back in but still also is in the swapfile (if memory is needed it doesn't need to be swapped out AGAIN because it is already in the swapfile. This saves I/O) 



关于buffer/page cache:
http://www.linuxbyte.net/view.php?skin=art&ID=3386
引用:page cache、buffer cache和swap cache 

page cache:读写文件时文件内容的cache,大小为一个页。不一定在磁盘上连续。 

buffer cache:读写磁盘块的时候磁盘块内容的cache,buffer cache的内容对应磁盘上一个连续的区域,一个buffer cache大小可能从512(扇区大小)到一个页。 

swap cache: 是page cache的子集。用于多个进程共享的页面被换出到交换区的情况。 



page cache 和 buffer cache的关系 

本质上是很不同的,buffer cache缓冲磁盘块内容,page cache缓冲文件的一页内容。page cache写回时会使用临时的buffer cache来写磁盘。 


bdflush: 把dirty的buffer cache写回磁盘。通常只当dirty的buffer太多或者需要更多的buffer而内存开始不足时运行。page_lauder也可能唤醒它。 

kupdate: 定时运行,把写回期限已经到了的dirty buffer写回磁盘。 


2.4的改进:page cache和buffer cache耦合得更好了。在2.2里,磁盘文件的读使用page cache,而写绕过page cache,直接使用buffer cache,因此带来了同步的问题:写完之后必须使用update_vm_cache()更新可能有的page cache。2.4中page cache做了比较大的改进,文件可以通过page cache直接写了,page cache优先使用high memory。而且,2.4引入了新的对象:file address space,它包含用来读写一整页数据的方法。这些方法考虑到了inode的更新、page cache处理和临时buffer的使用。page cache和buffer cache的同步问题就消除了。原来使用inode+offset查找page cache变成通过file address space+offset;原来struct page 中的inode成员被address_space类型的mapping成员取代。这个改进还使得匿名内存的共享成为可能(这个在2.2很难实现,许多讨论过)。



可以看到内核不同buffer和cache的使用也不同,不可以单纯地理解为读写

http://www.linuxforum.net/forum/showflat.php?Cat=&Board=linuxK&Number=106845&page=0&view=collapsed&sb=5&o=7&part=
引用:page cache是VFS的一部分,buffer cache是块设备驱动的一部分,或者说page cache是面向用户IO的cache,buffer cache是面向块设备IO的cache,page cache按照文件的逻辑页进行缓冲,buffer cache按照文件的物理块进行缓冲。page cache与buffer cache并不相互独立而是相互融合的,同一文件的cache页即可存在于page cache中,又可存在于buffer cache中,它们在物理内存中只有一份拷贝。文件系统接口就处于page cache和buffer cache之间,它完成page cache的逻辑页与buffer cache的物理块之间的相互转换,再交给统一的块设备IO进行调度处理,文件的逻辑块与物理块的关系就表现为page cache与buffer cache的关系。 


2.4与2.6的不同:
http://kerneltrap.org/node/5283
引用:The main difference is that right now, there aren't two distinct caches in the kernel. Meaning, the buffer cache maps on to the page cache. Earlier, in the 2.4 series, the page cache and buffer cache used to be two separate caches, which led to problems of maintaining coherency when a block was present in the buffer cache as well as the page cache. The other issue was that you would obviously use up too much memory if a lot of blocks were present in both caches. Now that the buffer cache entries (to put it very simply) "point" to parts in the page cache, you don't have to worry much about synchronizing the two caches.

The files you can look at are mm/filemap.c, mm/page-writeback.c. It's also worth looking at mm/pdflush.c and understand how the pdflush daemon works. This'd just be a subset of everything that uses the page cache, but a decent enough place to start

 

下面转自:http://hi.baidu.com/zheng918/blog/item/5dbe257ffae2e60029388a5b.html

最近有个月经问题,老有人问为何开机后,还没有其他服务,mem就被用完了?是不是内存泄露?是否要重启服务?只能说不要看现象,要看本质才能找到问题的根源。
往往给出这样的结果,怀疑内存用了90%:
Mem: 4146788k total, 3825536k used, 321252k free, 213488k buffers
Swap: 2650684k total, 80k used, 2650604k free, 3006404k cached

这样怀疑很普遍,因为很多人用惯了Windows。Windows下,可以使用任务管理器查看当前进程对于内存的消耗情况。在我看来,Windows物理内存总是留下一定的空间,就算此时物理内存有空闲时,也会让某些程序去使用虚拟内存,目的是在Windows下启动新程序时,直接分配空闲的物理内存,这样子新程序启动速度就较快,而Linux则不然。

而在Linux下,使用top命令看到内存占用情况:

Mem: 4146788k total, 3825536k used, 321252k free, 213488k buffers
Swap: 2650684k total, 80k used, 2650604k free, 3006404k cached


这里的结果显示使用了3.8G的used,占用率达到90%。看看free的结果你还可以对比一下:
$ free -m
total used free shared buffers cached
Mem: 4049 3784 265 0 208 2939
-/+ buffers/cache: 636 3413
Swap: 2588 0 2588

虽然MEM显示了3.7G左右的used,但是(-/+ buffers/cache)减去buffers和cache的结果可以看到,当前进程实际占用内存是636M,而可用空闲(free)内存为3.4G


可以这么理解:在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于开启过的程序、或是读取刚存取过得数据会比较快。

如上面的例子:使用了4G的内存,3.7G被占用,但是buuffer和cached部分作为缓存,可以使用命中率的方式提高使用效率,而且这部分缓存是根据指令随时可以释放的,我们可以认为这部分内存没有实际被使用,也可以认为它是空闲的。

因此查看目前进程正在实际被使用的内存,是used-(buffers+cache),也可以认为如果swap没有大量使用,mem还是够用的,只有mem被当前进程实际占用完(没有了buffers和cache),才会使用到swap的。

posted @ 2010-09-09 15:26  sunss  阅读(399)  评论(0编辑  收藏  举报