linux cache and buffer【转】

 

转自:http://blog.csdn.net/turkeyzhou/article/details/6426738node

 

Linux下对文件的访问和设备的访问一般会被cache起来加快访问速度,这个是系统的默认行为。 而cache须要耗费咱们的内存,虽然这个内存最后能够经过echo 3>/proc/sys/vm/drop_caches这样的命令来主动释放。可是有时候咱们仍是须要理解谁消耗了咱们的内存。工具

咱们来先了解下内存的使用状况:.net

 

 

[root@my031045 ~]# free
             total       used       free     shared    buffers     cached
Mem:      24676836     626568   24050268          0      30884     508312
-/+ buffers/cache:      87372   24589464
Swap:      8385760
Page cache和buffer cache一直以来是两个比较容易混淆的概念,在网上也有不少人在争辩和猜测这两个cache到底有什么区别,讨论到最后也一直没有一个统一和正确的结论,在我工做的这一段时间,
 
 
page cache和buffer cache的概念曾经困扰过我,可是仔细分析一下,这两个概念实际上很是的清晰。若是可以了解到这两个cache的本质,那么咱们在分析io问题的时候可能会更加驾轻就熟。
 
Page cache其实是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层须要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据
 
 
须要刷新时,page cache中的数据交给buffer cache,可是这种处理在2.6版本的内核以后就变的很简单了,没有真正意义上的cache操做。
 
Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的状况下,直接对磁盘进行操做的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。
 
简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的状况下,对文件操做,那么数据会缓存到page cache,若是直接采用dd等工具对磁盘进行读写,那么数据会
 
 
缓存到buffer cache补充一点,在文件系统层每一个设备都会分配一个def_blk_ops的文件操做方法,这是设备的操做方法,在每一个设备的inode下面会存在一个radix tree,这个radix tree
 
 
下面将会放置缓存数据的page页。这个page的数量将会在top程序的buffer一栏中显示。若是设备作了文件系统,
 
 
那么会生成一个inode,这个inode会分配ext3_ops之类的操做方法,这些方法是文件系统的方法,在这个inode下面一样存在一个radix tree,
 
 
这里会缓存文件的page页,缓存页的数量在top程序的cache一栏进行统计。从上面的分析能够看出,2.6内核中的buffer cache和page cache
 
 
在处理上是保持一致的,可是存在概念上的差异,page cache针对文件的cache,buffer是针对磁盘块数据的cache,仅此而已

有了伟大的systemtap, 咱们能够用stap脚原本了解谁在消耗咱们的cache了:命令行

#这个命令行用来调查谁在加数据入page_cache
[root@my031045 ~]# 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
dev=2, devname=N/A, ino=0, index=3399, nrpages=2594
dev=2, devname=N/A, ino=0, index=3034, nrpages=1778
dev=2, devname=N/A, ino=0, index=3618, nrpages=2595
dev=2, devname=N/A, ino=0, index=1694, nrpages=106
dev=2, devname=N/A, ino=0, index=1703, nrpages=107
dev=2, devname=N/A, ino=0, index=1810, nrpages=210
dev=2, devname=N/A, ino=0, index=1812, nrpages=211
...

这时候咱们拷贝个大文件:blog

[chuba@my031045 ~]$ cp huge_foo.file  bar

#这时候咱们能够看到文件的内容被猛的添加到cache去:
...
dev=8388614, devname=sda6, ino=2399271, index=39393, nrpages=39393
dev=8388614, devname=sda6, ino=2399271, index=39394, nrpages=39394
dev=8388614, devname=sda6, ino=2399271, index=39395, nrpages=39395
dev=8388614, devname=sda6, ino=2399271, index=39396, nrpages=39396
dev=8388614, devname=sda6, ino=2399271, index=39397, nrpages=39397
dev=8388614, devname=sda6, ino=2399271, index=39398, nrpages=39398
dev=8388614, devname=sda6, ino=2399271, index=39399, nrpages=39399
dev=8388614, devname=sda6, ino=2399271, index=39400, nrpages=39400
dev=8388614, devname=sda6, ino=2399271, index=39401, nrpages=39401
dev=8388614, devname=sda6, ino=2399271, index=39402, nrpages=39402
dev=8388614, devname=sda6, ino=2399271, index=39403, nrpages=39403
dev=8388614, devname=sda6, ino=2399271, index=39404, nrpages=39404
dev=8388614, devname=sda6, ino=2399271, index=39405, nrpages=39405
dev=8388614, devname=sda6, ino=2399271, index=39406, nrpages=39406
dev=8388614, devname=sda6, ino=2399271, index=39407, nrpages=39407
dev=8388614, devname=sda6, ino=2399271, index=39408, nrpages=39408
dev=8388614, devname=sda6, ino=2399271, index=39409, nrpages=39409
dev=8388614, devname=sda6, ino=2399271, index=39410, nrpages=39410
dev=8388614, devname=sda6, ino=2399271, index=39411, nrpages=39411
...
相关文章
相关标签/搜索