linux cache and buffer【轉】

weixin_34119545發表於2016-09-23

 

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

 

Linux下對檔案的訪問和裝置的訪問通常會被cache起來加快訪問速度,這個是系統的預設行為。 而cache需要耗費我們的記憶體,雖然這個記憶體最後可以通過echo 3>/proc/sys/vm/drop_caches這樣的命令來主動釋放。但是有時候我們還是需要理解誰消耗了我們的記憶體。

我們來先了解下記憶體的使用情況:

 

 

[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
...

這時候我們拷貝個大檔案:

[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
...

相關文章