轉自: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 ...