1. 程式人生 > >【轉】Buffer cache和page cache的區別

【轉】Buffer cache和page cache的區別

轉自:http://alanwu.blog.51cto.com/3652632/1122077
Page cache和buffer cache到底有什麼區別呢?很多時候我們不知道系統在做IO操作的時候到底是走了page cache還是buffer cache?其實,buffer cache和page  cache是Linux中兩個比較簡單的概念,在此對其總結說明。

Page cache是vfs檔案系統層的cache,例如 對於一個ext3檔案系統而言,每個檔案都會有一棵radix樹管理檔案的快取頁,這些被管理的快取頁被稱之為page cache。所以,page cache是針對檔案系統而言的。例如,ext3檔案系統的頁快取就是page cache。Buffer cache是針對裝置的,每個裝置都會有一棵radix樹管理資料快取塊,這些快取塊被稱之為buffer cache。通常對於ext3檔案系統而言,page cache的大小為4KB,所以ext3每次操作的資料塊大小都是4KB的整數倍。Buffer cache的快取塊大小通常由塊裝置的大小來決定,取值範圍在512B~4KB之間,取塊裝置大小的最大公約數。具體關於buffer cache的塊大小問題可以參見我的另一篇博文《

Linux中Buffer cache效能問題一探究竟》。

這裡我們可以通過一個小實驗來觀察一下buffer cache和page cache的差別。執行top命令,我們可以看到實驗機器當前記憶體使用情況:

可以看出記憶體總容量為16GB左右,page cache用了將近10GB(10209072K-303796K),buffer cache用了300MB(303796K),其餘6GB(6255076K)空閒剩餘。在這種情況下,如果對裝置dm0進行裸盤寫操作,即執行如下命令:

dd if=/dev/zero of=/dev/dm0 count=4096

那麼,我麼可以通過top命令發現,buffer cache的容量越來越大,空閒記憶體越來越少,相當一部分記憶體被buffer cache佔用,並且在IO操作的過程中發現bdi(flush-254:176)執行緒在繁忙的進行資料回刷操作。

經過一段時間以後,大約6GB(6401432KB)的記憶體被buffer cache佔用,89MB(89312KB)記憶體空閒,其餘大約10GB(16374836KB - 6401432KB)的記憶體還是被page cache佔用。通過這個實驗,可以說明對於裸盤的讀寫操作會佔用buffer cache,並且當讀寫操作完成之後,這些buffer cache會歸還給系統。為了驗證page cache的佔用情況,我做了檔案系統級的讀寫操作,執行如下命令進行檔案系統寫操作:

cp /dev/zero ./test_file

這是一次檔案拷貝操作,因此會採用page cache對檔案資料進行快取。通過top工具我們可以看出在資料拷貝的過程中,page cache的容量越來越大,空閒記憶體數量急劇下降,而buffer cache保持不變。

拷貝一定時間之後,空閒記憶體將為1.9GB(1959468KB),檔案系統page cache增長為將近14.5GB(14504680KB – 235108KB),buffer cache維持在235MB左右(235108KB)。

由此我們可以得出,page cache和buffer cache最大的差別在於:page cache是對檔案資料的快取;buffer cache是對裝置資料的快取。兩者在實現上差別不是很大,都是採用radix樹進行管理。