歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

Buffer cache和page cache的區別

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性能問題一探究竟》見 http://www.linuxidc.com/Linux/2013-01/77573.htm 。

這裡我們可以通過一個小實驗來觀察一下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樹進行管理。

Copyright © Linux教程網 All Rights Reserved