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
...
相關文章
相關標籤/搜索